|
Передача параметров в функцию., AVR-GCC/ATMega2560 |
|
|
|
Aug 12 2011, 12:40
|
Группа: Новичок
Сообщений: 6
Регистрация: 12-08-11
Пользователь №: 66 695

|
Добрый день, коллеги! Возможно я что-то недопонимаю или не знаю в C, посему возник такой вопрос: Код #include <stdio.h> void SendString (const char _String[]) { unsigned int i = 0; while (_String[i] != '\0') { printf ("%c\n", _String[i]); i++; } }
int main (void) { SendString ("LaLa"); return 0; } Прекрасно работает на i386. Но ни одна из Код void SendString (const char _String[]) { unsigned int i = 0; while (_String[i] != '\0') { SendChar (_String[i]); i++; } return; }
void SendString2 (const char *_String) { while (*_String) { SendChar (*_String++); } } ... SendString ("1234567890"); SendString2 ("1234567890"); ... функций не работает - в функцию SendChar передаётся мусор. Самостоятельный вызов SendChar ('a'); работает прекрасно. Как нужно правильно передавать параметры на ATMega/AVR-GCC.
Сообщение отредактировал Tuma - Aug 12 2011, 12:43
|
|
|
|
|
 |
Ответов
|
Aug 21 2011, 09:02
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Забыл привести одну конструкцию, используемую в Protothreads Итак, макрос Код #define PT_WAIT_UNTIL(pt, condition) \ do { \ LC_SET((pt)->lc); \ if(!(condition)) { \ return PT_WAITING; \ } \ } while(0) , где LC_SET() Код #define LC_SET(s) s = __LINE__; case __LINE__: Поясню для тех, кому не близки Protothreads Общий вариант построения функции с переопределяемой точкой входа - на машине Даффа, имеет упрощенный вид Код unsigned int protothread(unsigned int pc) { switch(pc) { case 0: // отсюда идет инициализация, к делу не относится
//далее, вставим ожидание события PT_WAIT_UNTIL(), получим, разворачивая макрос и немного упрощая концепцию do{ pc = __LINE__; case __LINE__:; if(!condition) return pc; }while(0); } return pc; } И такая чехарда воспринимается компиляторами! Несмотря на то, что по указанному case __LINE__: мы попадем внутрь блока do{}while(0) Это я к чему. Кто нить знает компилятор, который такое "не хавает"?
Сообщение отредактировал _Pasha - Aug 21 2011, 09:05
|
|
|
|
|
Aug 21 2011, 11:56
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(_Pasha @ Aug 21 2011, 12:02)  И такая чехарда воспринимается компиляторами! Несмотря на то, что по указанному case __LINE__: мы попадем внутрь блока do{}while(0) Это я к чему. Кто нить знает компилятор, который такое "не хавает"? А разве он после этого будет иметь право называться компилятором языка С ? Дабы не иметь необходимости отвечать «а почему вы спрашиваете?» на «а Вы всегда отвечаете вопросом на вопрос?» : Цитата(C89) 3.6.4 Selection statements Syntax selection-statement: if ( expression ) statement if ( expression ) statement else switch ( expression ) statement
3.6.4.2 The switch statement ... Semantics A switch statement causes control to jump to, into, or past the statement that is the switch body, depending on the value of a controlling expression, and on the presence of a default label and the values of any case labels on or in the switch body. A case or default label is accessible only within the closest enclosing switch statement. После намёка машиной даффа на то, что надо ещё раз прочесть соответствующий раздел стандарта, я это прочёл так: В switch ( expression ) statement нет никаких уточнений по поводу того, что за statement имеется ввиду. Обычно там стоит compound statement. Кстати, в начале compound statement может стоять declaration-list: Код volatile int i;
void moo(int u) { switch (u) { // Это начало обычного compound statement, а не неотъемлемая часть switch volatile int j; case 3: j = u; u = i; i = j + u; break; case 4: j = -u; u = -i; i = j + u; break; } } Главное, чтобы новая переменная инициализировалась в каждой ветке. Или была staticНо никто не мешает поставить туда другой statement, например, цикл... Или... Или обычное, не-составное выражение! Код void foo(int u) { switch (u) case 3: ++i; } Что компилируется, и компилиурется (естественно) в аналогичное Код void foo2(int u) { if (u == 3) ++i; } Конечно, такой switch-powered-if, пришедший из Incredible Machine, никому не нужен. Но хорошо демонстирурует, что statement не обязан быть только compound. Так что switch имеет право ходить везде, где имеет право ходить goto.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
Tuma Передача параметров в функцию. Aug 12 2011, 12:40 Mareng Кодvoid SendString (char String[]... Aug 12 2011, 12:51 Tuma Mareng, увы, не помогло.
Упорно присылает только п... Aug 12 2011, 12:58 Mareng Цитата(Tuma @ Aug 12 2011, 19:40) Самосто... Aug 12 2011, 13:03 zltigo Ответьте себе на два вопроса:
- Какая архитектура ... Aug 12 2011, 13:17 Tuma ЦитатаА если подряд 5-10 раз вызвать SendChar() с ... Aug 12 2011, 13:21 Genadi Zawidowski Исходники функци передачи символа покажите.
0) не ... Aug 12 2011, 15:17 zltigo QUOTE (Genadi Zawidowski @ Aug 12 2011, 18... Aug 12 2011, 16:07  AHTOXA Цитата(zltigo @ Aug 12 2011, 22:07) Однак... Aug 12 2011, 16:56   zltigo QUOTE (AHTOXA @ Aug 12 2011, 19:56) Нет, ... Aug 12 2011, 17:32    _Pasha Цитата(zltigo @ Aug 12 2011, 20:32) Фу, к... Aug 12 2011, 19:56     zltigo QUOTE (_Pasha @ Aug 12 2011, 22:56) К сож... Aug 12 2011, 20:47 Tuma Цитатане очень хорошая идея свои переменные (имена... Aug 15 2011, 12:32 sergeeff Цитата(Tuma @ Aug 15 2011, 15:32) Меня ещ... Aug 15 2011, 13:17 zltigo QUOTE (Tuma @ Aug 15 2011, 14:32) Меня ещ... Aug 16 2011, 11:38 Genadi Zawidowski Цитата(Tuma @ Aug 15 2011, 16:32) Я как-т... Aug 20 2011, 15:25  zltigo QUOTE (Genadi Zawidowski @ Aug 20 2011, 17... Aug 20 2011, 15:41 Tuma ЦитатаОбычно с подчеркивания начинаются служебные ... Aug 16 2011, 11:32 Tuma Однако с гарвардской архитектурой у меня пока не о... Aug 16 2011, 13:22 _Pasha Кодextern void send_char(char what);
#defi... Aug 16 2011, 14:50  zltigo QUOTE (_Pasha @ Aug 16 2011, 16:50) Я бы ... Aug 16 2011, 16:06   Юрий_СВ Цитата(zltigo @ Aug 16 2011, 19:06) Помол... Aug 16 2011, 18:11    Zlumd Цитата(Юрий_СВ @ Aug 17 2011, 01:11) Норм... Aug 17 2011, 02:49    777777 Цитата(Юрий_СВ @ Aug 16 2011, 22:11) Норм... Aug 17 2011, 09:50   aesok Цитата(zltigo @ Aug 16 2011, 20:06) Помол... Aug 20 2011, 12:02    zltigo QUOTE (aesok @ Aug 20 2011, 14:02) ответ ... Aug 20 2011, 12:10     aesok Цитата(zltigo @ Aug 20 2011, 16:10) Для о... Aug 20 2011, 13:12 sergeeff Наверное к тому же, как возврат из функции send_bl... Aug 16 2011, 16:11 AHTOXA Цитата(sergeeff @ Aug 16 2011, 22:11) Нав... Aug 17 2011, 03:11 _Pasha Цитата(zltigo @ Aug 16 2011, 19:06) зачем... Aug 16 2011, 18:18 sergeeff Интересная позиция. Городить do {} while(0) для об... Aug 16 2011, 19:33 _Pasha Цитата(zltigo @ Aug 20 2011, 15:10) Для о... Aug 20 2011, 13:27 zltigo QUOTE (_Pasha @ Aug 20 2011, 15:27) Повто... Aug 20 2011, 13:37  Юрий_СВ Цитата(zltigo @ Aug 20 2011, 16:37) Что к... Aug 20 2011, 13:53   zltigo QUOTE (Юрий_СВ @ Aug 20 2011, 15:53) Види... Aug 20 2011, 14:02    ARV Цитата(zltigo @ Aug 20 2011, 17:02) Да .... Aug 20 2011, 17:44     zltigo QUOTE (ARV @ Aug 20 2011, 19:44) что-то я... Aug 20 2011, 18:28      ARV Цитата(zltigo @ Aug 20 2011, 21:28) что-т... Aug 21 2011, 08:28       zltigo QUOTE (ARV @ Aug 21 2011, 10:28) существу... Aug 21 2011, 10:21    777777 Цитата(zltigo @ Aug 20 2011, 18:02) Анало... Aug 21 2011, 12:19 ARV Цитата(_Pasha @ Aug 21 2011, 12:02) Кто н... Aug 21 2011, 09:44  _Pasha Цитата(ARV @ Aug 21 2011, 12:44) и чего т... Aug 21 2011, 09:47 ReAl Кодfor(;;) {
// endless loop
}Совсем-со... Aug 21 2011, 17:04 sergeeff Цитата(ReAl @ Aug 21 2011, 20:04) Кодfor... Aug 21 2011, 20:31  zltigo QUOTE (sergeeff @ Aug 21 2011, 23:31) Ну ... Aug 21 2011, 23:03   777777 Цитата(zltigo @ Aug 22 2011, 03:03) Я уже... Aug 22 2011, 04:25   ARV Цитата(zltigo @ Aug 22 2011, 02:03) Я уже... Aug 22 2011, 05:23    777777 Цитата(ARV @ Aug 22 2011, 09:23) лично мн... Aug 22 2011, 05:59 zltigo QUOTE (777777 @ Aug 22 2011, 07:25) Вообщ... Aug 22 2011, 08:29 sergeeff Цитата(zltigo @ Aug 22 2011, 11:18) К сча... Aug 22 2011, 08:35  zltigo QUOTE (sergeeff @ Aug 22 2011, 11:35) Как... Aug 22 2011, 08:43 777777 Цитата(zltigo @ Aug 22 2011, 12:29) Совер... Aug 22 2011, 09:15  zltigo QUOTE (777777 @ Aug 22 2011, 12:15) Что ж... Aug 22 2011, 09:32 ARV Цитата(zltigo @ Aug 22 2011, 11:29) Воспр... Aug 22 2011, 12:42  zltigo QUOTE (ARV @ Aug 22 2011, 15:42) разбор в... Aug 22 2011, 12:53   ARV Цитата(zltigo @ Aug 22 2011, 15:53) Отсут... Aug 22 2011, 13:32    zltigo QUOTE (ARV @ Aug 22 2011, 16:32) то почем... Aug 22 2011, 14:26     ARV Цитата(zltigo @ Aug 22 2011, 17:26) Напри... Aug 22 2011, 14:34 sergeeff Меня критикуют за цитаты из книг. Тем не менее. Ге... Aug 22 2011, 10:04 zltigo QUOTE (sergeeff @ Aug 22 2011, 13:04) явл... Aug 22 2011, 10:17 zltigo QUOTE но for(;;)
Это значит, что наличие акваланга... Aug 22 2011, 14:42 Petka Цитата(zltigo @ Aug 22 2011, 18:42) Это з... Aug 22 2011, 14:55  zltigo QUOTE (Petka @ Aug 22 2011, 17:55) У меня... Aug 22 2011, 15:02   ARV Цитата(zltigo @ Aug 22 2011, 19:02) Там ц... Aug 22 2011, 16:38   Petka Цитата(zltigo @ Aug 22 2011, 19:02) Почит... Aug 22 2011, 17:16 sergeeff Думается мне, что все, как часто это бывает в жизн... Aug 22 2011, 18:53 _Pasha Главная-таки проблема: если в стандарт закралась г... Aug 23 2011, 06:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|