Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 22.10.2022
Сообщений: 10

Проверка структуры на существование значений

12.04.2023, 09:05. Показов 599. Ответов 3
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, надо проверить есть ли значение в указателе на структуру, ведь адрес есть всегда, кроме nullptr, а вот при отсутствии значений при попытке вызвать значение указателя выдаёт ошибку, хочется такой ошибки избежать. Это не весь код, просто часть из лабораторной работы. Без проверок при попытке запуска происходит ошибка чтения, ведь указателю не выделена память.

Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
struct element
{
    int value;
};
 
struct listOne
{
private:
    element* first;
public:
    void setFirst(int value);
    int getFirst();
};
 
void listOne::setFirst(int value)
{
    if (/*Существует ли this->first->value*/)
        this->first->value = value;
    else
    {
        this->first = (element*)malloc(sizeof(element));
        this->first->value = value;
    }
}
 
int listOne::getFirst() // Выводит значение элемента, если есть элемент
{
    if (/*Существует ли this->first->value*/)
        return this->first->value;
    return NULL; // Без понятия что выводить в этом случае, ведь значения нет, а (NULL == 0)
}
 
int main()
{
    listOne lst;
    cout << lst.getFirst();
    cout << 123; // Ничего не выводит из-за ошибки
 
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.04.2023, 09:05
Ответы с готовыми решениями:

Проверка на существование
Есть один txt-файл. В нем построчно написаны файлы и их вес в байтах. Пример: files.rar 12345678 LOL.jpg 546987 Как создать...

Проверка на существование
есть таблица Client со столбцами (Name,LastName,MobilePhoneNumber,Email) и нужно проверить на существование в ней заданного мобильного...

Проверка на существование линка
Как можно это осуществить....???? что-бы список линков проверило!

3
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.04.2023, 09:55
Лучший ответ Сообщение было отмечено Mianvi как решение

Решение

Вы верно пишете про nullptr
Надо просто проинициализировать изначально и проверять на nullptr

C++
1
2
3
4
5
6
7
8
struct listOne
{
private:
    element* first {nullptr};
 
.....
    if (this->first != nullptr    /*Существует ли this->first->value*/)
.....
Ну или просто
C++
1
2
    if (this->first)
.....
Добавлено через 5 минут
Цитата Сообщение от Mianvi Посмотреть сообщение
C++
1
2
this->first = (element*)malloc(sizeof(element));
 this->first->value = value;
Если уж придираться - то здесь тоже нужна проверка что вернула malloc
Потому как если памяти не хватит - то malloc вернут nullptr и снова всё упадёт.
Ну это если вы знаете что делать в случае, когда памяти не хватило.... а то может и фик с ним, пусть лучше упадет, хоть понятно будет, что есть проблема.

Цитата Сообщение от Mianvi Посмотреть сообщение
C++
1
2
3
4
5
 this->first = (element*)malloc(sizeof(element));
 if (!this->first)
     что-то делаем при ошибке выделения памяти, например просто return; или cout << "Ошибка выделения памяти!";
 else
     this->first->value = value;
0
0 / 0 / 0
Регистрация: 22.10.2022
Сообщений: 10
12.04.2023, 11:32  [ТС]
Можете ещё подсказать, что можно вернуть в функции типа int, чтобы она при выводе в cout ничего но выводила? Возвращая NULL, cout выводит 0, а в моём случае value как раз может принимать значение 0, но в таком случае, по-моему, функция getFirst работает немного некорректно, ведь она может вернуть 0 и как значение и как информацию о неправильной работе
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.04.2023, 12:15
Ваш вопрос звучит так: какое целое число вернуть такое, которое бы на экране выглядело как"пусто" ?
Ответ: нет такого числа, вы же это понимаете?

Варианта два:
1) Ввести условную константу, которая будет означать "пусто". Для данного случая не понятно какое значение выбрать, тк. у нас универсальный контейнер который должен уметь хранить любое число.

2) Возвращать признак "значение из функции вернулось / не вернулось. Устроить это можно по разному:
2а) bool getFirst(int& outVal);
2б) специальный тип, который по сути возвращает все вместе: признак "есть / нет значение" и само значение, если есть; есть какой-то стандартный тип для этого

3) Добавить еще один метод:
C++
1
bool isEmpty() { return this->first == nullptr; }
Тогда пользователь вашего класса должен сначала будет вызвать метод isEmpty(), убедиться что значение есть, и если оно есть - то вызвать getFirst(). Если он не проверил и просто вызвал getFirst - ну его половые проблемы, возмодность все сделать правильно вы ему предоставили, а вы тогда смело из getFirst возвращаете любое значение (хоть 0), если контейнер пуст.

4) Ну и наконец - выкидывать исключение, если вызван getFirst() для пустого контейнера, это будет фактичсеки тем самым признаком "значения нет". Тоже отличный подход.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.04.2023, 12:15
Помогаю со студенческими работами здесь

Jsoup проверка на существование
есть конфиг файл &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;class name=&quot;Figure&quot;&gt; &lt;fields-list&gt; &lt;field...

Проверка на существование файла
Имеются файлы типа index.jsp и 404.jsp в папке pathPagesFolder Проверка (код ниже) на существование index.jsp всегда выдает ошибку...

Проверка существование логина в бд
&lt;?php include ('function.php'); ?&gt; &lt;?php if($_SERVER == 'POST') { $name = $_POST; $email = $_POST; $login =...

Проверка на существование ссылки
Подскажите пожалуйста, пытаюсь сделать проверку на существование &quot;ДокументОснование.ЗаказКлиента&quot; в этом условии: Если НЕ...

Проверка на существование логина в БД
Хочу при регистрации проверить, есть ли пользователь с таким логином. $sql = mysql_query(&quot;SELECT * FROM users WHERE login=$login LIMIT...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru