реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Помогите новичку, работа с массивами
masterpc
сообщение Jan 17 2008, 08:24
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



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

Пишу вот так:

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 - Jan 17 2008, 08:25
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 17 2008, 08:30
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А как сам массив описан?
IAR особенно при включенной оптимизации, если массив больше не используется может выкинуть присавивание... помогает volatile
Go to the top of the page
 
+Quote Post
CSB
сообщение Jan 17 2008, 08:56
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



У меня в 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
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Jan 17 2008, 09:02
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(masterpc @ Jan 17 2008, 12:24) *
Подскажите, что может быть:

Пишу вот так:

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


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


По смыслу должно быть
for ( k=0; k<9; k++) sens[0][k] = 0xff;
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jan 17 2008, 09:11
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



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

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


Видно это из-за двухмерного массива, потому как запись while (k=0, k<9, k++) инструкция; тоже верна, но для одной инструкции. По крайней мере с одномерным массивом все нормально.
Всем спасибо за помощь!!!!
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 17 2008, 09:26
Сообщение #6


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(masterpc @ Jan 17 2008, 12:11) *
Вот такая запись помогла:

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


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

VladimirYU ПРАВ!
у вас , вместо ;
это очень грубая ошибка
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jan 17 2008, 09:32
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(KRS @ Jan 17 2008, 11:26) *
VladimirYU ПРАВ!
у вас , вместо ;
это очень грубая ошибка


С ";" компилятор ругается, но это уже не важно, главное, что работает , ведь самая правильная прога это та, которая работает smile.gif
Go to the top of the page
 
+Quote Post
CSB
сообщение Jan 17 2008, 09:35
Сообщение #8


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



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

Для while:
(k=0, k<9, k++) - это все 0, т.е. инструкция не выполнится
(k=0, k<9, ++k) - а это будет 1

Пишите нормальные конструкции и Вас все будет работать.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 17 2008, 10:01
Сообщение #9


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(masterpc @ Jan 17 2008, 12:32) *
С ";" компилятор ругается, но это уже не важно, главное, что работает , ведь самая правильная прога это та, которая работает smile.gif

Конечно ругается, потому что там еще и for должен быть.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 17 2008, 10:12
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(CSB @ Jan 17 2008, 12:35) *
(k=0, k<9, ++k) - а это будет 1
И в итоге бесконечный цикл...
Go to the top of the page
 
+Quote Post
CSB
сообщение Jan 17 2008, 10:25
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



>И в итоге бесконечный цикл...
Именно. Я же не сказал что эта конструкция рабочая, я просто показал что нужно для выполнения тела цикла.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2008, 10:26
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(KRS @ Jan 17 2008, 12:01) *
Конечно ругается, потому что там еще и for должен быть.
Зато совсем скоро мы сможем услышать, что циклы for() применять нельзя, потому что они "глючат", а надо while().


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 17 2008, 10:26
Сообщение #13


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Когда я быстро просматривал текст строчки
Код
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 такая конструкция может не работать из-за оптимизации если значения не используются потом...

Судя по всему именно это и хотел сказать автор.
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 17 2008, 11:20
Сообщение #14


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(masterpc @ Jan 17 2008, 11:32) *
С ";" компилятор ругается, но это уже не важно, главное, что работает , ведь самая правильная прога это та, которая работает smile.gif

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

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++) инструкция;
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jan 17 2008, 11:29
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(Baser @ Jan 17 2008, 13:20) *
А правильная конструкция, как уже написали:
for (k=0; k<9; k++) инструкция;


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

Сообщение отредактировал masterpc - Jan 17 2008, 11:30
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01496 секунд с 7
ELECTRONIX ©2004-2016