|
Передача параметров в функцию., 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
|
|
|
|
|
 |
Ответов
(60 - 68)
|
Aug 22 2011, 14:26
|

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

|
QUOTE (ARV @ Aug 22 2011, 16:32)  то почему не работает while() - ему надо ОБЯЗАТЕЛЬНО указать условие?! как тут с логикой? Например, не стали преумножать способы сделать одно и то-же, сделав такую возможность для for(), как продвинутого варианта while(). Я, пожалуй, ничего против использования и for() без условия не имею, но но в стандарте не требуется. Лично я от отсутствия такой возможности неудобств не испытываю - мне достаточно одного канонического способа однозначного донесения моей мысли компилятору. QUOTE (ARV @ Aug 22 2011, 16:32)  на том, что это нелогично А я уже пытался объяснить Вам, что отсутствие на парковой скамейке таблички, о том, что на ней сидеть можно, равно, как и присутствие такой таблички, означает в конце-концов одно и то-же - сидеть на этой скамейке можно. Только отсутствие таблички с условиями выполнения цикла сидения на скамейке является для меня  много более естественным в нормальной жизни.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 22 2011, 14:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(zltigo @ Aug 22 2011, 17:26)  Например, не стали преумножать способы сделать одно и то-же, сделав такую возможность для for(), как продвинутого варианта while(). Я, пожалуй, ничего против использования и for() без условия не имею, но но в стандарте не требуется. Лично я от отсутствия такой возможности неудобств не испытываю - мне достаточно одного канонического способа однозначного донесения моей мысли компилятору.
А я уже пытался объяснить Вам, что отсутствие на парковой скамейке таблички, о том, что на ней сидеть можно, равно, как и присутствие такой таблички, означает одно и то-же - сидеть на этой скамейке можно. Только отсутствие таблички с условиями выполнения цикла сидения на скамейке является много более естественным в нормальной жизни. странно... в одном месте отсутствие операнда приравнивается к ненулевому значению, а в другом - к ошибке... здесь, значит, варианты не поленились множить... как прокомментируете пример с аквалангом? записи while(акваланг != 0) и for(; акваланг !=0; ) читаются и понимаются абсолютно однозначно и логично, но for(;;) ?! теперь о ваших скамейках  представим себе, что в парке вы увидели два вида скамеек: на одних есть надпись СИДЕТЬ МОЖНО, а другие - без оных надписей. это аналоги while(1) и for(;;). в ОБЫЧНОЙ ЖИЗНИ каждый, кто умеет читать, задумается - зачем это на некоторых есть надписи? может, на тех, где нет надписей, СИДЕТЬ НЕЛЬЗЯ?! ведь неспроста же пометили часть скамеек?! вам не кажется, что это логично? я уверен, что даже вы, для которого "отсутсвие таблички много более естественно", перед тем, как сесть на непомеченную скамейку тщательно ее ощупаете - а не покрашена ли она?  в Си есть два цикла (скамейки), позволяющие сделать одно и то же: бесконечно выполняться (сидеть). но для одного нужно явное указание о бесконечности (табличка), для другого - не нужно. где же логика?!
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Aug 22 2011, 18:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Думается мне, что все, как часто это бывает в жизни, проще. Отцы-основатели K&R порешили сделать for(;;) бесконечным циклом. Может на первый взгляд все показалось логичным, может еще какие мысли были, только они и знают. А потом может и обнаружилась нелогичность, может нет, не менять же. Так все и осталось.
Я застал по жизни людей, разрабатывавших языки программирования с карандашом в руках. Забавные ассемблеры (по-русски автокоды) с командами СУММ, ВЫВ, ВВ и прочее. Интересные были люди со своим особым стилем мышления. Так что все возможно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|