Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/27: Рейтинг темы: голосов - 27, средняя оценка - 4.52
3 / 3 / 0
Регистрация: 02.05.2011
Сообщений: 32
1

Вопрос по структурам в Си

01.06.2012, 12:38. Показов 5152. Ответов 17
Метки нет (Все метки)

Здравствуйте.
Интерисует следующий вопрос по структурам. Имеется некая структура:
Код
struct myStructure
{unsykned char A;
unsykned char B;
unsykned char C;}
и функция, в которой поля этой структуры заполняются:

Код
void Foo(void)
{unsykned char *ptr,i;
struct myStructure data;
ptr = &data.A; //нацеливаем указатель на первое поле структуры

for (i=0,i<3,i++)
{*ptr = 100;
*ptr++;
}
}
Вопрос:
впринципе данный код работает, это было проверено, но насколько правильно и безопасно делать так?
И да, используется AVR Atudyo 4.19
0

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2012, 12:38
Ответы с готовыми решениями:

Вопрос по структурам
Всем доброго дня. Возникло парочку вопросов по изучению С++ подскажите если не сложно. Купил...

Вопрос по структурам
Насколько я знаю можно заполнить структуру &quot;наложив её на память&quot;, например struct A { int a;...

вопрос по структурам
Задача.На основе данных входного файла составить список студентов,включающий фамилию,факультет,...

вопрос по структурам
Я начал писать программу на следующию задачу Описать структуру с именем STUDENT, содержащую...

17
omx
01.06.2012, 12:56 2
Может в вашем случае больше подходит массив? Если расположение элементов в структуре изменится, или размер полей, ваш алгоритм накроется медным изделием.
Эквивалентом вашего коду будет:
Код
void Foo(void) {
struct myStructure data = {100, 100, 100};
}
3 / 3 / 0
Регистрация: 02.05.2011
Сообщений: 32
01.06.2012, 13:15 3
Мне хотелось бы сохранить вариант именно со структурой.
А если колличество полей и их размер гарантированно не будут изменятся, это нормальный вариант?
В чем вообще могут быть недостатки такого способа? Если я не ошибаюсь, переменные в структуре, если они одинакового типа, располагаются одна за другой в памяти, следовательно, нацелив указатель на первое поле, доступ к следующим элементам я могу осуществлять простым инкрементом указателя. Или это неверные рассуждения?
Не судите строго, я еще только разбираюсь в Си.
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,861
01.06.2012, 13:27 4
вариант не самый лучший именно с точки зрения поддержки. а в написанном виде (for (i=0,i<3,i++)) - вообще просто жуть. изменишь структуру, а в одном месте прое... забудешь изменить нигическую цифру. и много увлекательного секса обеспечено.
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 76
01.06.2012, 13:32 5
Код
for (i=0,i<3,i++)
{*ptr = 100;
*ptr++;
}
Не совсем понял, эту запись (сам вечно путаюсь при работе с указателями).
Т.е. в цикле присваиваем переменной по адресу хранящемуся в ptr значение 100, потом инкрементируем эту переменную, а потом все сначала. Может я что-то путаю, разве не так должно быть:
Код
for (i=0,i<3,i++)
{*ptr = 100;
ptr++;   // Увеличиваем адрес
}
0
omx
01.06.2012, 13:36 6
Цитата Сообщение от hymyro
Цитата Сообщение от S_B
Код:
for (i=0,i<3,i++)
{*ptr = 100;
*ptr++;
} Не совсем понял, эту запись.
Т.е. в цикле присваиваем переменной по адресу хранящемуся в ptr значение 100, потом инкрементируем эту переменную, а потом все сначала. Может я что-то путаю, разве не так должно быть:
Код
 for (i=0,i<3,i++)
{*ptr = 100;
ptr++;   // Увеличиваем адрес
}
Результат обоих вариантов будет одинаков, просто в первом случае есть чтение значения по адресу, без использования этого значения. Вполне вероятно что это дополнительное чтение будет выкинуто оптимизатором.
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 76
01.06.2012, 13:42 7
Цитата Сообщение от omx
Результат обоих вариантов будет одинаков, просто в первом случае есть чтение значения по адресу, без использования этого значения. Вполне вероятно что это дополнительное чтение будет выкинуто оптимизатором.
Я просто не понял, где происходит изменение указателя на следующий элемент структуры.
Код
*ptr++;
Здесь? Я думал, что это инкрементирование значения по адресу содержащемуся в ptr.
Надо почитать снова про указатели, а то чего-то туплю.
0
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
01.06.2012, 13:42 8
Это надо быть уверенным, что компилятор именно так в памяти переменные расположит. Может работать и будет, но я бы не стал так делать.
0
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
01.06.2012, 13:43 9
Цитата Сообщение от hymyro
Я просто не понял, где происходит изменение указателя на следующий элемент структуры.
Код:
*ptr++;

Здесь? Я думал, что это инкрементирование значения по адресу содержащемуся в ptr.
Надо почитать снова про указатели, а то чего-то туплю.
У инкрементирования приоритет выше, чем у "*".
0
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 76
01.06.2012, 13:56 10
Цитата Сообщение от Bottti
Цитата Сообщение от hymyro
Я просто не понял, где происходит изменение указателя на следующий элемент структуры.
Код:
*ptr++;

Здесь? Я думал, что это инкрементирование значения по адресу содержащемуся в ptr.
Надо почитать снова про указатели, а то чего-то туплю.
У инкрементирования приоритет выше, чем у "*".
Если так, то все понятно, просто в онлайн учебнике, куда я иногда заглядываю, вот что:
Операторы * и & имеют более высокий приоритет, чем любая арифметическая операция, кроме унарного минуса, имеющего такой же приоритет.
Отсюда:http://tord-n.narod.ru/downtoo... 2/0210.htm
UPD:
Приоритет выполнения арифметических операторов следующий:

Наивысший ++ --
- (унарный минус)
* / %
Наинизший + -
там же нашел, теперь все понятно. Т.е. для увеличения значения нужна такая запись:
Код
(*ptr)++;
Да?
0
0 / 0 / 0
Регистрация: 01.04.2011
Сообщений: 177
01.06.2012, 14:37 11
Правильнее будет:
Код
ptr = &data;
for(i = 0; i < sizeof(data); i++)
{
.....
}
В этом случае даже если и измениться число элементов структуры, то это автоматом учтется.
0
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
01.06.2012, 14:45 12
Цитата Сообщение от _kuordyomomkit
Правильнее будет:
Код:
ptr = &data;
for(i = 0; i < sizeof(data); i++)
{
.....
}

В этом случае даже если и измениться число элементов структуры, то это автоматом учтется.
а вот и нет:
http://www.cyberkuru.ru/programming/cpp ... age24.html
Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.
0
0 / 0 / 0
Регистрация: 01.04.2011
Сообщений: 177
01.06.2012, 15:18 13
http://iosyitistromyss.ru/file/yazyk-pr ... hnik/135-2 располагайте элементы в порядке убывания и будет вам щастье. Здесь же все элементы одной длины.
0
3 / 3 / 0
Регистрация: 02.05.2011
Сообщений: 32
02.06.2012, 00:22 14
http://iosyitistromyss.ru/file/yazyk-pr ... hnik/135-2 располагайте элементы в порядке убывания и будет вам щастье. Здесь же все элементы одной длины.
Получается, в данном случае компилятор разместит поля структуры в правильной последовательности? Или всетаки существует возможность вольностей со стороны компилятора?
0
2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
02.06.2012, 01:37 15
Цитата Сообщение от S_B
Мне хотелось бы сохранить вариант именно со структурой
...
Не судите строго, я еще только разбираюсь в Си.
Если только разбираешься, то слушай советы бывалых. Уважаемый omx сразу сказал:

Может в вашем случае больше подходит массив? Если расположение элементов в структуре изменится, или размер полей, ваш алгоритм накроется медным изделием.

Вместо того, чтобы разбираться с реализацией заведомо неправильного подхода, уточняя работу sizeof и прочие подробности, подумай и ответь, если сможешь: А зачем именно хочется сохранить структуру?
Вот когда ответишь, тогда и станет все на свои места: или по задаче структура нужна действительно - тогда инициализируй ее по-людски, как тебе показали, или можно поставить массив и инициализируй в цикле.
0
3 / 3 / 0
Регистрация: 02.05.2011
Сообщений: 32
02.06.2012, 12:46 16
Всем спасибо за развернутые ответы. Постараюсь найти для себя наиболее приемлемый вариант.
0
sofryowr
02.06.2012, 14:36 17
А что будет, если структура окажется выровненной по слову?
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
08.06.2012, 12:33 18
Цитата Сообщение от S_B
Интерисует следующий вопрос по структурам.
Я не рекомендую инициализировать структуру с помощью указателей.
Можно так проинициализировать.

Код
struct myStructure
{unsykned char A;
unsykned char B;
unsykned char C;}
Если нужно заполнить структуру существующими переменными:
Код
unsykned char param1 = 10;
unsykned char param2 = 20;
unsykned char param3 = 30;
...
// Значения по-умолчанию для структуры
#define [b]MY_STRUSTURE_DEF[/b] { \
param1, param2, param3 \
}
...
// Создаем объект структуры
struct myStructure myStructureInstance = [b]MY_STRUSTURE_DEF[/b];
В таком случае создается структура myStructureInstance со значениями 10, 20 и 30 соответственно.
Я рекомендую именно такой способ инициализации, т.к. ошибки можно выявить уже при компиляции. Например, вместо какого-нибудь param запишем число, которое выходит за пределы unsykned char.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2012, 12:33

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

небольшой вопрос по структурам
Плиз, подскажите как присвоить значение переменной(index) элементу массива структуры(avto.chet)....

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

Программа по структурам!
У меня такая задача: Ввести несколько структур типа «Товары на складе» с полями { название...

задания по структурам
помогите пожалуйста новичку... буду ОЧЕНЬ благодарен


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

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

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