Форум программистов, компьютерный форум CyberForum.ru

Проверка существования структуры - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 21:32     Проверка существования структуры #1
Гугл ничего не дал так, что думаю будет многим полезно.

Язык си,

как проверить существует ли структура по данному адресу (была ли она задана)?

В других языках есть try/catche на си вроде нет, только на си++.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2011, 21:32     Проверка существования структуры
Посмотрите здесь:

Проверка условия существования треугольника C++
проверка существования файла с использованием ifstream() C++
C++ Проверка на существования файла
C++ Проверка существования файла
Затабулировать функцию внутри прямоугольника и области существования данной функции C++
Найти вероятность существования пути в графе между заданными точками C++
C++ Возможность существования треугольника по сторонам
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.12.2011, 21:35     Проверка существования структуры #2
Цитата Сообщение от awpe Посмотреть сообщение
как проверить существует ли структура по данному адресу
обратиться к полю структуры. а с чего ей не быть?
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 21:48  [ТС]     Проверка существования структуры #3
При обращении к полю несуществующей структуры получаю ошибку access violation, что логично так как если её нет, то память под неё не выделялась, и следовательно ОСь об этом не знает и вырубает программу. Ну я так это понимаю поправьте если неправ.

Добавлено через 3 минуты
Так можно проверить структуру на существование простым способом или нужно составлять программу так чтобы эту проверку избежать?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
17.12.2011, 21:54     Проверка существования структуры #4
Цитата Сообщение от awpe Посмотреть сообщение
или нужно составлять программу так чтобы эту проверку избежать?
только так
есть функции наподобии IsBadWritePtr, но 100%ной уверенности никогда не будет
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:01  [ТС]     Проверка существования структуры #5
В моей программе структура содержит адреса родителя и нескольких веток, когда я циклом обхожу дерево, мне нужно проверять есть ли ветка или нет, создаю структуры malloc'ом поэтому в полях указателей на ветки всегда что то есть (случайные фрагменты), доступа к main по заданию нет, а функция может вызываться сколько угодно раз в любом порядке, поэтому не могу точно задать что корень в начале программы имеет пустые ветки, следовательно нужно проверять, либо предложите пожалуйста другой путь.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
17.12.2011, 22:06     Проверка существования структуры #6
Цитата Сообщение от awpe Посмотреть сообщение
мне нужно проверять есть ли ветка или нет
при создании новой вершины дерева нужно в ее полях на обе ветви выставить NULL
при создании ветви заменить NULL на указатель на ветвь
при обходе дерева проверять - если не NULL то там есть ветвь
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:10  [ТС]     Проверка существования структуры #7
по другому поставлю вопрос - зная адрес можно проверить лежит ли там экземпляр структуры?

Добавлено через 1 минуту
IsBadWritePtr только под винду

Добавлено через 1 минуту
мне под *NIX надо

Добавлено через 52 секунды
Цитата Сообщение от alex_x_x Посмотреть сообщение
при создании новой вершины дерева нужно в ее полях на обе ветви выставить NULL
Я так и делаю, но у меня по условию нет доступа к первому узлу
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 22:10     Проверка существования структуры #8
Цитата Сообщение от awpe Посмотреть сообщение
по другому поставлю вопрос - зная адрес можно проверить лежит ли там экземпляр структуры?
Нет. Нельзя.
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:10  [ТС]     Проверка существования структуры #9
неужели от меня на первом курсе требуют в домашке реализовать try/catche на си?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
17.12.2011, 22:12     Проверка существования структуры #10
Цитата Сообщение от awpe Посмотреть сообщение
по другому поставлю вопрос - зная адрес можно проверить лежит ли там экземпляр структуры?
Добавлено через 1 минуту
IsBadWritePtr только под винду
Добавлено через 1 минуту
мне под *NIX надо
нет
Цитата Сообщение от awpe Посмотреть сообщение
В других языках есть try/catche на си вроде нет, только на си++.
это бы тоже не помогло

я не понимаю как так можно строить дерево, чтобы нельзя было проверить, есть в вершине ветви или нету
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 22:16     Проверка существования структуры #11
Чисто теоретически любой набор байтов можно считать структурой. Особенно на Си.
C
1
2
3
4
5
6
7
8
9
struct s {
    int a;
    int b;
};
 
int main() {
    char buf[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    struct s *sptr = (struct s*)buf;
}
Вполне нормальная ситуация. А теперь подумайте. Каким образом вообще можно проверить существование структуры по какому-либо адресу?
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:19  [ТС]     Проверка существования структуры #12
Я должен строить только недостающие узлы. У меня нет возможности первому узлу в начале программы присвоить NULL на все ветки, а если в функции ставить NULL для корня то каждый следующий её вызов обрубит ветки дерева...
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 22:21     Проверка существования структуры #13
awpe, может быть Вы уже покажете задание полностью. Есть подозрение, что Вы просто его неправильно понимаете.
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:23  [ТС]     Проверка существования структуры #14
Цитата Сообщение от fasked Посмотреть сообщение
А теперь подумайте. Каким образом вообще можно проверить существование структуры по какому-либо адресу?
Ну на другом языке я бы, зная устройство своей структуры, проверил бы значение одного её элемента, случайный набор байтов вызовет ошибку, на php проверил бы через isset на c++ try/catche, на си не знаю... Разве что только параллельно заданию создать копию структуры в которую писать все изменения...

Добавлено через 25 секунд
http://pastebin.com/tEKfpnCe
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 22:26     Проверка существования структуры #15
Цитата Сообщение от awpe Посмотреть сообщение
случайный набор байтов вызовет ошибку
Не вызовет. Если это конечно не какое-то магическое число, которое записывается в спец. поле каждого экзепляра.
Цитата Сообщение от awpe Посмотреть сообщение
на c++ try/catche
Каким это образом? Может поделитесь дельным примером?

Вы кстати свое задание то читали?
m_Parent - ссылка на родителя в дереве (NULL для корня дерева),
m_Branches - ссылка на потомки в дереве (NULL - потомка не существует).
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.12.2011, 22:30     Проверка существования структуры #16
Цитата Сообщение от awpe Посмотреть сообщение
по другому поставлю вопрос - зная адрес можно проверить лежит ли там экземпляр структуры?
Цитата Сообщение от alex_x_x Посмотреть сообщение
при создании новой вершины дерева нужно в ее полях на обе ветви выставить NULL
при создании ветви заменить NULL на указатель на ветвь
при обходе дерева проверять - если не NULL то там есть ветвь
5 букв
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:34  [ТС]     Проверка существования структуры #17
Цитата Сообщение от fasked Посмотреть сообщение
на c++ try/catche
при доступе к невыделенному программой блоку памяти будет ошибка которую данная конструкция обработает и программа не вылетит как на си (ну я надеюсь )


Цитата Сообщение от fasked Посмотреть сообщение
m_Parent - ссылка на родителя в дереве (NULL для корня дерева),
m_Branches - ссылка на потомки в дереве (NULL - потомка не существует).
если функция setDecoration вызывается один раз то все нормально - корню я задам NULL в ветвях и дальше все хорошо, но я так понял что заранее мне не известно что там, а согласно примерам там ничего только случайные данные (malloc)

Добавлено через 1 минуту
C
1
2
3
4
5
6
7
8
9
10
11
12
TNODE * n;
int     x;
 
n = NULL;
x = setDecoration ( &n, (char*) "000", DECORATION_SPARKLER );  /* x = 1 */
x = setDecoration ( &n, (char*) "001", DECORATION_SPARKLER );  /* x = 1 */
x = setDecoration ( &n, (char*) "002", DECORATION_SPARKLER );  /* x = 1 */
x = setDecoration ( &n, (char*) "1", DECORATION_CANDLE ); /* x = 1 */
x = setDecoration ( &n, (char*) "01", DECORATION_NONE );  /* x = 1 */
x = setDecoration ( &n, (char*) "", DECORATION_CANDLE ); /* x = 1 */
x = easyToCatchFire ( n ); /* x = 0 */
destroyTree ( n );
я так понимаю моя функция должна при первом вызове поставить в ветках корня NULL, а при последующих этого не делать...

Добавлено через 1 минуту
Этого можно достичь либо введением новой глобальной переменной, изменением структуры, или проверкой на существование, все три варианта отваливаются...
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.12.2011, 22:35     Проверка существования структуры #18
Цитата Сообщение от awpe Посмотреть сообщение
а согласно примерам там ничего только случайные данные (malloc)
в последней реализации (по крайней мере GNU) маллок возвращает память с нулями.
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:36  [ТС]     Проверка существования структуры #19
Ну или я, просидев много часов уже не соображаю и не вижу очевидного)

Добавлено через 54 секунды
Цитата Сообщение от alkagolik Посмотреть сообщение
в последней реализации (по крайней мере GNU) маллок возвращает память с нулями.
вот это уже интересно у меня dev c++ на win7, может поэтому там мусор в malloc?

Добавлено через 18 секунд
нули бы все поставили на свои места...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 22:37     Проверка существования структуры
Еще ссылки по теме:

C++ Проверка существования трехугольника с заданными сторонами, и определение его типа
C++ Обеспечить контроль существования диапазона
C++ Структуры: проверка на наличие среди продавцов фамилии "Иванов" и если есть, то вывести наименование товара
Класс Beta, количество всех существовавших объектов и время существования C++
Проверка существования файла C++

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 22:37     Проверка существования структуры #20
Цитата Сообщение от awpe Посмотреть сообщение
при доступе к невыделенному программой блоку памяти будет ошибка которую данная конструкция обработает и программа не вылетит (ну я надеюсь )
Скажите, а Вы в Деда Мороза верите?
Цитата Сообщение от awpe Посмотреть сообщение
если функция setDecoration вызывается один раз то все нормально - корню я задам NULL в ветвях и дальше все хорошо, но я так понял что заранее мне не известно что там, а согласно примерам там ничего только случайные данные (malloc)
Найдите пример на форуме, как строятся деревья. По аналогии разберетесь.
Дерево

Добавлено через 39 секунд
Цитата Сообщение от awpe Посмотреть сообщение
нули бы все поставили на свои места...
Используйте calloc.
Yandex
Объявления
17.12.2011, 22:37     Проверка существования структуры
Ответ Создать тему
Опции темы

Текущее время: 08:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru