Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.95/20: Рейтинг темы: голосов - 20, средняя оценка - 4.95
awpe
2 / 2 / 1
Регистрация: 23.11.2011
Сообщений: 87
1

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

17.12.2011, 21:32. Просмотров 3712. Ответов 46
Метки нет (Все метки)

Гугл ничего не дал так, что думаю будет многим полезно.

Язык си,

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

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

Проверка на существования файла
Можно ли проверять файл на существование таким образом: ifstream...

Проверка существования логина
Помогите пожалуйста, нужно сделать проверку на логин, т.е. если при регистрации...

Проверка существования файла
Надо сбросить массив char в файл. Если файл уже существует - ждать, пока его не...

Проверка существования файла
Всем привет! Как можно реализовать проверку существования файла (если файл не...

Проверка условия существования треугольника
нужно написать программу Даны 3 числа, определить могут ли эти числа являться...

46
alkagolik
Заблокирован
17.12.2011, 21:35 2
Цитата Сообщение от awpe Посмотреть сообщение
как проверить существует ли структура по данному адресу
обратиться к полю структуры. а с чего ей не быть?
0
awpe
2 / 2 / 1
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 21:48  [ТС] 3
При обращении к полю несуществующей структуры получаю ошибку access violation, что логично так как если её нет, то память под неё не выделялась, и следовательно ОСь об этом не знает и вырубает программу. Ну я так это понимаю поправьте если неправ.

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

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

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

Добавлено через 52 секунды
Цитата Сообщение от alex_x_x Посмотреть сообщение
при создании новой вершины дерева нужно в ее полях на обе ветви выставить NULL
Я так и делаю, но у меня по условию нет доступа к первому узлу
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 22:10 8
Цитата Сообщение от awpe Посмотреть сообщение
по другому поставлю вопрос - зная адрес можно проверить лежит ли там экземпляр структуры?
Нет. Нельзя.
0
awpe
2 / 2 / 1
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:10  [ТС] 9
неужели от меня на первом курсе требуют в домашке реализовать try/catche на си?
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
17.12.2011, 22:12 10
Цитата Сообщение от awpe Посмотреть сообщение
по другому поставлю вопрос - зная адрес можно проверить лежит ли там экземпляр структуры?
Добавлено через 1 минуту
IsBadWritePtr только под винду
Добавлено через 1 минуту
мне под *NIX надо
нет
Цитата Сообщение от awpe Посмотреть сообщение
В других языках есть try/catche на си вроде нет, только на си++.
это бы тоже не помогло

я не понимаю как так можно строить дерево, чтобы нельзя было проверить, есть в вершине ветви или нету
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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;
}
Вполне нормальная ситуация. А теперь подумайте. Каким образом вообще можно проверить существование структуры по какому-либо адресу?
0
awpe
2 / 2 / 1
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:19  [ТС] 12
Я должен строить только недостающие узлы. У меня нет возможности первому узлу в начале программы присвоить NULL на все ветки, а если в функции ставить NULL для корня то каждый следующий её вызов обрубит ветки дерева...
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 22:21 13
awpe, может быть Вы уже покажете задание полностью. Есть подозрение, что Вы просто его неправильно понимаете.
0
awpe
2 / 2 / 1
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:23  [ТС] 14
Цитата Сообщение от fasked Посмотреть сообщение
А теперь подумайте. Каким образом вообще можно проверить существование структуры по какому-либо адресу?
Ну на другом языке я бы, зная устройство своей структуры, проверил бы значение одного её элемента, случайный набор байтов вызовет ошибку, на php проверил бы через isset на c++ try/catche, на си не знаю... Разве что только параллельно заданию создать копию структуры в которую писать все изменения...

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

Вы кстати свое задание то читали?
m_Parent - ссылка на родителя в дереве (NULL для корня дерева),
m_Branches - ссылка на потомки в дереве (NULL - потомка не существует).
0
alkagolik
Заблокирован
17.12.2011, 22:30 16
Цитата Сообщение от awpe Посмотреть сообщение
по другому поставлю вопрос - зная адрес можно проверить лежит ли там экземпляр структуры?
Цитата Сообщение от alex_x_x Посмотреть сообщение
при создании новой вершины дерева нужно в ее полях на обе ветви выставить NULL
при создании ветви заменить NULL на указатель на ветвь
при обходе дерева проверять - если не NULL то там есть ветвь
5 букв
0
awpe
2 / 2 / 1
Регистрация: 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 минуту
Этого можно достичь либо введением новой глобальной переменной, изменением структуры, или проверкой на существование, все три варианта отваливаются...
0
alkagolik
Заблокирован
17.12.2011, 22:35 18
Цитата Сообщение от awpe Посмотреть сообщение
а согласно примерам там ничего только случайные данные (malloc)
в последней реализации (по крайней мере GNU) маллок возвращает память с нулями.
1
awpe
2 / 2 / 1
Регистрация: 23.11.2011
Сообщений: 87
17.12.2011, 22:36  [ТС] 19
Ну или я, просидев много часов уже не соображаю и не вижу очевидного)

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

Добавлено через 18 секунд
нули бы все поставили на свои места...
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 22:37 20
Цитата Сообщение от awpe Посмотреть сообщение
при доступе к невыделенному программой блоку памяти будет ошибка которую данная конструкция обработает и программа не вылетит (ну я надеюсь )
Скажите, а Вы в Деда Мороза верите?
Цитата Сообщение от awpe Посмотреть сообщение
если функция setDecoration вызывается один раз то все нормально - корню я задам NULL в ветвях и дальше все хорошо, но я так понял что заранее мне не известно что там, а согласно примерам там ничего только случайные данные (malloc)
Найдите пример на форуме, как строятся деревья. По аналогии разберетесь.
http://www.cyberforum.ru/post1616072.html

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

Проверка существования файла с использованием ifstream()
гуглил, но ничего там так и не нашел. Собственно как?

Проверка существования трехугольника с заданными сторонами, и определение его типа
В консольном режиме создать программу для проверки существования трехугольника...

Структуры, проверка уникальности поля
Привет, ребят, у меня следующая проблема, нужна программа, которая считывает...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru