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

 
 
> Передача параметров в функцию., AVR-GCC/ATMega2560
Tuma
сообщение Aug 12 2011, 12:40
Сообщение #1





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
5 страниц V  « < 3 4 5  
Start new topic
Ответов (60 - 68)
zltigo
сообщение Aug 22 2011, 14:26
Сообщение #61


Гуру
******

Группа: Свой
Сообщений: 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) *
на том, что это нелогично

А я уже пытался объяснить Вам, что отсутствие на парковой скамейке таблички, о том, что на ней сидеть можно, равно, как и присутствие такой таблички, означает в конце-концов одно и то-же - сидеть на этой скамейке можно. Только отсутствие таблички с условиями выполнения цикла сидения на скамейке является для меня sm.gif много более естественным в нормальной жизни.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ARV
сообщение Aug 22 2011, 14:34
Сообщение #62


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

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



Цитата(zltigo @ Aug 22 2011, 17:26) *
Например, не стали преумножать способы сделать одно и то-же, сделав такую возможность для for(), как продвинутого варианта while(). Я, пожалуй, ничего против использования и for() без условия не имею, но но в стандарте не требуется. Лично я от отсутствия такой возможности неудобств не испытываю - мне достаточно одного канонического способа однозначного донесения моей мысли компилятору.

А я уже пытался объяснить Вам, что отсутствие на парковой скамейке таблички, о том, что на ней сидеть можно, равно, как и присутствие такой таблички, означает одно и то-же - сидеть на этой скамейке можно. Только отсутствие таблички с условиями выполнения цикла сидения на скамейке является много более естественным в нормальной жизни.
странно... в одном месте отсутствие операнда приравнивается к ненулевому значению, а в другом - к ошибке... здесь, значит, варианты не поленились множить...
как прокомментируете пример с аквалангом? записи while(акваланг != 0) и for(; акваланг !=0; ) читаются и понимаются абсолютно однозначно и логично, но for(;;) ?!

теперь о ваших скамейках sm.gif представим себе, что в парке вы увидели два вида скамеек: на одних есть надпись СИДЕТЬ МОЖНО, а другие - без оных надписей. это аналоги while(1) и for(;;). в ОБЫЧНОЙ ЖИЗНИ каждый, кто умеет читать, задумается - зачем это на некоторых есть надписи? может, на тех, где нет надписей, СИДЕТЬ НЕЛЬЗЯ?! ведь неспроста же пометили часть скамеек?! вам не кажется, что это логично? я уверен, что даже вы, для которого "отсутсвие таблички много более естественно", перед тем, как сесть на непомеченную скамейку тщательно ее ощупаете - а не покрашена ли она? sm.gif
в Си есть два цикла (скамейки), позволяющие сделать одно и то же: бесконечно выполняться (сидеть). но для одного нужно явное указание о бесконечности (табличка), для другого - не нужно. где же логика?!


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2011, 14:42
Сообщение #63


Гуру
******

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



QUOTE
но for(;;)

Это значит, что наличие акваланга не требуется. В while(1) "1" это тоже не "акваланг", а некий не существующий в реальности костыль-заменитель всего и вся - акваланга, пива, женщин, воды ...
Я не хочу продолжать этот ставший уже бессмысленным разговор. Свою позицию по while(1) я изложил уже неоднократно и на разные лады. Достаточно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 22 2011, 14:55
Сообщение #64


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(zltigo @ Aug 22 2011, 18:42) *
Это значит, что наличие акваланга не требуется. В while(1) "1" это тоже не "акваланг", а некий не существующий в реальности костыль-заменитель всего и вся - акваланга, пива, женщин, воды ...
Я не хочу продолжать этот ставший уже бессмысленным разговор. Свою позицию по while(1) я изложил уже неоднократно и на разные лады. Достаточно.

У меня к Вам один вопрос: почему в случае "for(;;)" компилятор НЕ должен генерировать warning а в случае "while(1)" должен? Чем эти случаи отличаются с точки зрения генерирования варнингов?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2011, 15:02
Сообщение #65


Гуру
******

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



QUOTE (Petka @ Aug 22 2011, 17:55) *
У меня к Вам один вопрос: почему в случае "for(;;)" компилятор НЕ должен генерировать warning а в случае "while(1)" должен? Чем эти случаи отличаются с точки зрения генерирования варнингов?

Почитайте, наконец-то предыдущие посты. Там цитируется стандарт языка в котором все параметры for() являются необязательными. Компилятор соответствующий стандарту просто не имеет права возмущаться этим фактом. Почему while(1) является неграмотное выражением на которое желательно генерить warning - разжевано в десятках предыдущих постов.
Я все сказал.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ARV
сообщение Aug 22 2011, 16:38
Сообщение #66


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

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



Цитата(zltigo @ Aug 22 2011, 19:02) *
Там цитируется стандарт языка в котором ...
Истинно, ибо верую...


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



--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 22 2011, 17:16
Сообщение #67


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(zltigo @ Aug 22 2011, 19:02) *
Почитайте, наконец-то предыдущие посты. Там цитируется стандарт языка в котором все параметры for() являются необязательными. Компилятор соответствующий стандарту просто не имеет права возмущаться этим фактом. Почему while(1) неграмотное выражение на которое желательно генерить warning - разжевано в десятках предыдущих постов.
Я все сказал.

Второй раз перечитал Ваши посты. Честно-говоря ничего кроме эмоций, "скамеек", "аквалангов", "коммерческих компиляторов" я там относящегося к делу не нашёл. Тыкните носом меня в пост со ссылкой на стандарт или хотя-бы на авторитетное толкование стандарта.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 22 2011, 18:53
Сообщение #68


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Думается мне, что все, как часто это бывает в жизни, проще. Отцы-основатели K&R порешили сделать for(;;) бесконечным циклом. Может на первый взгляд все показалось логичным, может еще какие мысли были, только они и знают. А потом может и обнаружилась нелогичность, может нет, не менять же. Так все и осталось.

Я застал по жизни людей, разрабатывавших языки программирования с карандашом в руках. Забавные ассемблеры (по-русски автокоды) с командами СУММ, ВЫВ, ВВ и прочее. Интересные были люди со своим особым стилем мышления. Так что все возможно.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 23 2011, 06:00
Сообщение #69


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Главная-таки проблема: если в стандарт закралась глупенькая недальновидность - все, поздно. Придется соблюдать. И после убрать таковую в следующей редакции стандарта невозможно в силу наработок

Сообщение отредактировал _Pasha - Aug 23 2011, 06:01
Go to the top of the page
 
+Quote Post

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

 


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


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