|
|
  |
Передача параметров в функцию., 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 12 2011, 12:51
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487

|
Код void SendString (char String[]) { unsigned int i = 0; while (String[i]) SendChar (String[i++]); return; }
|
|
|
|
|
Aug 12 2011, 12:58
|
Группа: Новичок
Сообщений: 6
Регистрация: 12-08-11
Пользователь №: 66 695

|
Mareng, увы, не помогло. Упорно присылает только первый символ, а далее - мусор.
|
|
|
|
|
Aug 12 2011, 13:03
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487

|
Цитата(Tuma @ Aug 12 2011, 19:40)  Самостоятельный вызов SendChar ('a'); работает прекрасно. А если подряд 5-10 раз вызвать SendChar() с разными аргументами?
|
|
|
|
|
Aug 12 2011, 13:21
|
Группа: Новичок
Сообщений: 6
Регистрация: 12-08-11
Пользователь №: 66 695

|
Цитата А если подряд 5-10 раз вызвать SendChar() с разными аргументами? О, что вы! С этого всё начиналось.  Всё прекрасно работает. Я заметил что параметр gcc -O - влияет. void SendChar (char _Char) работает всегда. А вот void SendString (char String[]) показывает первый символ только при -O2 или -O3. При -O1 и -Os не показывается даже первый символ - только мусор. При -O2 или -O3 вместо двух символов SendString ("32"); приходит четыре символа: 3???, вместо четырёх - шесть: 3?????. Замена первого символа влияет, т.е. первый символ приходит корректно. При попытке послать один символ приходит один корректный символ.
|
|
|
|
|
Aug 12 2011, 19:56
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(zltigo @ Aug 12 2011, 20:32)  Фу, какой моветон  . К сожалению, просто const ничего ГЦЦ не говорит про то, что надо в ROM складывать. Но концептуально правильно: указать секцию progmem надо явно, иначе мыж тупые, не знаем, в каком проце как чего... Так что, Вас IAR тоже зомбировал  , подсадив на удобную фичу. Шучу. Код printf_P("1234567890"); Знаменит тем, что форматную строку держит в РОМ адназначна, но при этом putchar() все-таки прописать придется
|
|
|
|
|
Aug 12 2011, 20:47
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (_Pasha @ Aug 12 2011, 22:56)  К сожалению, просто const ничего ГЦЦ не говорит про то, что надо в ROM складывать. А const тут совсем ни причем - там все чисто все даже по умолчанию вполне разумно во flash класть. QUOTE Так что, Вас IAR тоже зомбировал так к хорошему мгновенно привыкаешь
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 15 2011, 12:32
|
Группа: Новичок
Сообщений: 6
Регистрация: 12-08-11
Пользователь №: 66 695

|
Цитата не очень хорошая идея свои переменные (имена) начинать с подчёркиваний. Меня ещё мой куратор на первой работе научил так выделять передаваемые в функцию параметры. Цитата В заголовочных файлах такое применяется для того, чтоьы с пользовательскими define не пересечься. Я как-то даже не задумывался что умудрюсь пересечься с какими либо объявлениями. Хотя теоретически это реально. Всем спасибо, всё переложено в память программы, всё работает.
|
|
|
|
|
Aug 16 2011, 11:32
|
Группа: Новичок
Сообщений: 6
Регистрация: 12-08-11
Пользователь №: 66 695

|
Цитата Обычно с подчеркивания начинаются служебные зарезервированные имена компилятора, типа __DATE__, __FILE__ , __noop и прочее. Вы же сами написали " __DATE__, __FILE__ , __noop" - всё с двумя подчёркиваниями, а я использую одно и всегда с заглавной буквы - _String, _UARTData и пр..
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|