Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не корректная работа цикла в CodeVision
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Iptash
Здравствуйте все.
Столкнулся с таким косяком. Проверка структуры в WHILE и FOR не работает. Вот например:

Код
while(program[i].indkey != STOP)
    {
        program[i]= ee_prog[i];
        i++;
    }


нет проверки, цикл уходит в бесконечность. Проверяю в AVR studio. А так:
Код
while(st != STOP)
    {
        program[i]= ee_prog[i];
       st =  program[i].indkey;
        i++;
    }

работает. Пробывал в разных версиях. В цикле FOR такой же косяк. Или я, что то не понимаю?
Палыч
В Ваших примерах проверка производится для разных значений переменной i. Если во втором примере поменять местами две последние строки цикла, вот так
Код
while(st != STOP)
    {
        program[i]= ee_prog[i];
        i++;
       st =  program[i].indkey;
    }
то он станет тогда полностью эквивалентным первому примеру
Iptash
Да, действительно, спасибо.
Юрий_СВ
А как ЭТО понимать ?

Цитата(Iptash @ Sep 11 2011, 17:14) *
program[i]= ee_prog[i];


Это Си++ ?
Iptash
Цитата(Юрий_СВ @ Sep 11 2011, 20:40) *
А как ЭТО понимать ?



Это Си++ ?

Нет, я из EEPROM загружаю в SRAM.
Юрий_СВ
Цитата(Iptash @ Sep 11 2011, 19:46) *
Нет, я из EEPROM загружаю в SRAM.

Структуру или указатель на неё ?
Iptash
Структуру.
Юрий_СВ
Цитата(Iptash @ Sep 11 2011, 20:41) *
Структуру.

Значит вам надо внимательнее читать книжки по Си.
Палыч
Цитата(Юрий_СВ @ Sep 11 2011, 21:45) *
Значит вам надо внимательнее читать книжки по Си.
А, что Вам не нравится? В языке Си структуры копируются оператором присваивания.
Юрий_СВ
Цитата(Палыч @ Sep 11 2011, 21:01) *
В языке Си структуры копируются оператором присваивания.

И давно так ? sm.gif Тогда, наверное, мне пора за книжки. sm.gif
Я думал, что имя структуры - это указатель и данное действие не что иное, как копирование указателя.

Такие фокусы (копирование структур присваиванием) возможны только в Си++.
Iptash
Да нет, это копирование структуры одного типа, а не копирование указателя, все очень легально.
Палыч
Цитата(Юрий_СВ @ Sep 11 2011, 22:05) *
И давно так ?

С тех пор, как K&R придумали язык Си.
Юрий_СВ
Цитата(Палыч @ Sep 11 2011, 21:22) *
С тех пор, как K&R придумали язык Си.

maniac.gif
Цитата
Керниган, Ричи. Язык C

6.2 . Структуры и функции
...
В языке "C" существует ряд ограничений на использование
структур. Обязательные правила заключаются в том, что единс-
твенные операции, которые вы можете проводить со структура-
ми, состоят в определении ее адреса с помощью операции & и
доступе к одному из ее членов. Это влечет за собой то, что
структуры нельзя присваивать или копировать как целое, и что
они не могут быть переданы функциям или возвращены ими.


http://www.lucky.net/docs/kernigan.html
http://ahdl-altera.narod.ru/ru/richi_c.pdf
Iptash
Да нет,
Цитата
6.2 Структуры и функции
Единственно возможные операции над структурами - это их копирование, присваивание, взятие адреса с помощью & и осуществление доступа к ее элементам. Копирование и присваивание также включают в себя передачу функциям аргументов и возврат ими значений. Структуры нельзя сравнивать. Инициализировать структуру можно списком константных значений ее элементов; автоматическую структуру также можно инициализировать присваиванием.
ReAl
Ну в ANSI C (C89, 1989 год) это уже было. Соответственно, должно было быть во втором издании K&R, которое уже базировалось на принятом стандарте.
Ну вот для определенности из стандарта C89
Цитата
3.3.16.1 Simple assignment
Constraints
One of the following shall hold:/42/
...
* the left operand has a qualified or unqualified version of a structure or union type compatible with the type of the right;

Цитата
3.3.15 Conditional operator
Syntax
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression

Constraints
The first operand shall have scalar type.
One of the following shall hold for the second and third operands:
...
* both operands have compatible structure or union types;
Т.е. можно вообще
Код
  struct foo a, b, c;
  a = flag ? b : c;


А с возвратом структур из функций -- так даже так (и это C, а не C++, и это 1989 год):
Цитата
3.3.2.3 Structure and union members
...
Example
If f is a function returning a structure or union, and x is a member of that structure or union, f().x is a valid postfix expression but is not an lvalue.

Юрий_СВ
Цитата(ReAl @ Sep 11 2011, 21:49) *
Ну в ANSI C (C89, 1989 год) это уже было. Соответственно, должно было быть во втором издании K&R, которое уже базировалось на принятом стандарте.


Спасибо, кажись, разобрался.
http://www2.research.att.com/~bs/siblings_short.pdf
Цитата
Classic C is K&R C [Kernighan,1978] plus structure assignment, enumerations, and void.


Да, я был не прав.
В современной редакции Си присваивать структуры можно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.