Перейти к содержанию
    

Подскажите, что может быть:

 

Пишу вот так:

 

byte k;

while(k=0, k<9, k++) sens[0][k]=0xff;

 

Ничего в массив не пишется,

а если написать так:

 

sens[0][0]=0xff;

sens[0][1]=0xff;

sens[0][2]=0xff;

sens[0][3]=0xff;

sens[0][4]=0xff;

sens[0][5]=0xff;

sens[0][6]=0xff;

sens[0][7]=0xff;

sens[0][8]=0xff; - то все ок.

 

на самом деле такого не нужно в проге, это я с глюком разобраться не могу.

 

Спасибо!

Изменено пользователем masterpc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как сам массив описан?

IAR особенно при включенной оптимизации, если массив больше не используется может выкинуть присавивание... помогает volatile

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня в IAR 3.42A правильно работает так:

int k;

k = 0;
while(k < 9)
{
    sens[0][k] = 0xff;
    k++;
};

 

В цикле

while (выражение)

инструкция

 

вычисляется выражение. Если его значение отлично от нуля, то выполняется инструкция, и вычисление выражения повторяется. Этот цикл продолжается до тех пор, пока выражение не станет равным нулю, после чего вычисления продолжатся с точки, расположенной сразу за инструкцией.

Brian W. Kernighan, Dennis M. Ritchie

The C programming Language

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, что может быть:

 

Пишу вот так:

 

byte k;

while(k=0, k<9, k++) sens[0][k]=0xff;

 

Ничего в массив не пишется,

 

По смыслу должно быть

for ( k=0; k<9; k++) sens[0][k] = 0xff;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот такая запись помогла:

 

byte k=0;

while(k<9){

sens[0][k]=0xff;

k++;

}

 

Видно это из-за двухмерного массива, потому как запись while (k=0, k<9, k++) инструкция; тоже верна, но для одной инструкции. По крайней мере с одномерным массивом все нормально.

Всем спасибо за помощь!!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот такая запись помогла:

 

byte k=0;

while(k<9){

sens[0][k]=0xff;

k++;

}

 

Видно это из-за двухмерного массива, потому как запись while (k=0, k<9, k++) инструкция; тоже верна, но для одной инструкции. По крайней мере с одномерным массивом все нормально.

Всем спасибо за помощь!!!!

VladimirYU ПРАВ!

у вас , вместо ;

это очень грубая ошибка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

VladimirYU ПРАВ!

у вас , вместо ;

это очень грубая ошибка

 

С ";" компилятор ругается, но это уже не важно, главное, что работает , ведь самая правильная прога это та, которая работает :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С одномерным массивом Ваш вариант "while (k=0, k<9, k++) инструкция;" тоже не будет работать, не от размерности массива зависит условие выполняемости цикла.

 

Для while:

(k=0, k<9, k++) - это все 0, т.е. инструкция не выполнится

(k=0, k<9, ++k) - а это будет 1

 

Пишите нормальные конструкции и Вас все будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С ";" компилятор ругается, но это уже не важно, главное, что работает , ведь самая правильная прога это та, которая работает :)

Конечно ругается, потому что там еще и for должен быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>И в итоге бесконечный цикл...

Именно. Я же не сказал что эта конструкция рабочая, я просто показал что нужно для выполнения тела цикла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно ругается, потому что там еще и for должен быть.
Зато совсем скоро мы сможем услышать, что циклы for() применять нельзя, потому что они "глючат", а надо while().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда я быстро просматривал текст строчки

byte k;
while(k=0, k<9, k++) sens[0][k]=0xff;

 

мой глаз воспринял как

byte k;
for(k=0; k<9; k++) sens[0][k]=0xff;

Что у меня и вызвало удивление, в IAR такая конструкция может не работать из-за оптимизации если значения не используются потом...

 

Судя по всему именно это и хотел сказать автор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С ";" компилятор ругается, но это уже не важно, главное, что работает , ведь самая правильная прога это та, которая работает :)

Судя по всему автор так и не понял, какую он ахинею написал :)

Попробую разъяснить еще раз, хотя уже вроде бы все написано.

 

while (k=0, k<9, k++) инструкция;

Такая конструкция вполне допустима исходя из синтаксиса языка Си, но она не имеет смысла.

Применение запятых в условии цикла while говорит о следующих друг за другом условиях.

Компилятор будет делать следующее:

1. присвоит значение k=0

2. проверит условие k<9, оно будет истинным - true

3. проверит значение k, оно будет ложным (k=0), и тело цикла не будет выполняться ни разу

4. увеличит значение k++, посколько постинкремент

 

А правильная конструкция, как уже написали:

for (k=0; k<9; k++) инструкция;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А правильная конструкция, как уже написали:

for (k=0; k<9; k++) инструкция;

 

Виноват , сам уже потом понял. Я и раньше так писал, но забыл. Спасибо!

Изменено пользователем masterpc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...