Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

RQ: AVR GCC (или просто C?) - проблем с променлива в main()
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8770
Страница 1 от 2

Автор:  NikB [ Вто Апр 05, 2011 8:47 pm ]
Заглавие:  RQ: AVR GCC (или просто C?) - проблем с променлива в main()

В проекта, който пиша с ваша помощ :), ми се налага да ползвам променлива, глобална за цялата функция main().
Това е името на един файл, което генерирам веднага след ресет и ползвам през целия цикъл до изключването.
а) Ако променливата я дефинирам в секцията преди функцията main() всичко е наред (поне така изглежда :))
б) Ако дефиницията е непосредствено след заглавния ред на функцията - доста бързо стойността на променливата се разрушава.

Вероятно има някакъв проблем с стека, но не виждам къде би могъл да бъде ( например - да освобождава повече стек, отколкото заемам :), но системата не се рестартира, не забива, просто на конзолата виждам, че името на файла се скапва :)).

ето кратки фрагменти:
a) работи:
Код:
    tFileName FileNameOfData;
...
int main()...

б) скапва се:
Код:
int main()
tFileName FileNameOfData;
...


tFileName е декларирано в h файл:
typedef char tFileName[20];

Автор:  setoy [ Сря Апр 06, 2011 11:31 am ]
Заглавие: 

Не можеш ли да видиш на дебъгера какво става? Сложи watchpoint за write access към FileNameOfData, и би трябвало да спре в момента, когато почва да се пише в нея.

Автор:  NikB [ Сря Апр 06, 2011 11:39 am ]
Заглавие: 

setoy написа:
Не можеш ли да видиш на дебъгера какво става? Сложи watchpoint за write access към FileNameOfData, и би трябвало да спре в момента, когато почва да се пише в нея.

:)
- Нямам развойна среда за реалната платка;
- В симулатора (Протеус) имам проблем с видимостта на сорса;
- В симулатора на AVR Studio (4 и 5) не мога да симулирам SD card;
Впрочем, май не съм пробвал - с AVR Studio 4 да задам протеус като среда за дебъг и да сложа watchpoint. (В AVR Studio 5 не мога да добавя Протеус като среда за дебъг).

Благодаря ! :)

Автор:  tolstolob [ Сря Апр 06, 2011 1:03 pm ]
Заглавие: 

За static променливи чувал ли си? Ако не, земи прочети, чувам че си имал достатъчно книжки.

Автор:  michev [ Сря Апр 06, 2011 1:33 pm ]
Заглавие: 

И как дефинирането и като статик ще помогне?
Нека даде мейн функцията и тогава да "гадаем".

Автор:  NikB [ Сря Апр 06, 2011 1:33 pm ]
Заглавие: 

tolstolob написа:
За static променливи чувал ли си? Ако не, земи прочети, чувам че си имал достатъчно книжки.

И на кое да обърна внимание на static променливите?
Ако тайно намекваш, че не се разполагат в стека :), моля поясни ми какъв е проблемът тая променлива да бъде ВЪВ стека?

Автор:  NikB [ Сря Апр 06, 2011 1:36 pm ]
Заглавие: 

michev написа:
И как дефинирането и като статик ще помогне?
Нека даде мейн функцията и тогава да "гадаем".


Много се извинявам, но не ми е ясно коя част от main() е важна :).
Извинявма се и на всички, които няма да харесат структурата на файла!

Прикачени файлове:
aPlan_main.c [38.53 KiB]
282 пъти

Автор:  michev [ Сря Апр 06, 2011 1:41 pm ]
Заглавие: 

Страх ме е да попитам що си дефинирал 1 торба функции във функция мейн...
Нормално е локална променлива за функция мейн да не е достъпна от друга функция (въпреки че и тях си напъхал в мейн..).
решението е 1 - изкарваш я извън функция - т.е глобална.

Автор:  NikB [ Сря Апр 06, 2011 1:49 pm ]
Заглавие: 

michev написа:
Страх ме е да попитам що си дефинирал 1 торба функции във функция мейн...
Нормално е локална променлива за функция мейн да не е достъпна от друга функция (въпреки че и тях си напъхал в мейн..).
решението е 1 - изкарваш я извън функция - т.е глобална.


Мен повече ме е страх да отговоря :).
Защото тези функции се ползват само тук, а самите те ползват някои от глобалните променливи, които са декларирани в main.c.
Тия функции са все едно части от main(), но съм ги сложил отделно, за да е по-обозримо (поне за мен).

Едва ли това е най-лошото в организацията на проекта. Приемам всякакви критики с благодарност за отделеното време :)

(но тук ще постна малка картинка с един резултат, създаден от реална платка и прочетен от файла на SD Card)

Прикачени файлове:
Show.JPG
Show.JPG [ 56.08 KiB | Прегледано 2747 пъти ]

Автор:  setoy [ Сря Апр 06, 2011 3:17 pm ]
Заглавие: 

Аз дори не знаех, че може да се дефинира функция във функция... :oops: Срам. Май само в питона съм срещал такова нещо. От толкова време пиша на С и все още научавам ново неща... Какво е предимството на този начин ? Ако има...

Автор:  NikB [ Сря Апр 06, 2011 4:49 pm ]
Заглавие: 

setoy написа:
...Какво е предимството на този начин ? Ако има...

Ами в Паскал е общоприет метод.
Ако една секция от алгоритъма се ползва няколко пъти в една и съща функциа и никъде другаде - това е начина да е четливо и ефективно.
В C# е голям зор :) - ползва се Action :)

Автор:  tolstolob [ Сря Апр 06, 2011 5:52 pm ]
Заглавие: 

Е, не знаех че в мейн е изтръскан целия код, че и вложени функции имало :?
Абе не е добра идея това с вложените функции... Ако се изцепя с нещо такова на работа, ще получа полагане в стил "Любо Ганев" :D

Автор:  Nikola Kirov [ Сря Апр 06, 2011 6:25 pm ]
Заглавие: 

Наистина ли този компилатор ти позволява функция във функцията?
Странно на всичко което съм писал си вади надлежно съответната грешка при такъв опит.

Автор:  NikB [ Сря Апр 06, 2011 8:29 pm ]
Заглавие: 

tolstolob написа:
...Абе не е добра идея това с вложените функции... Ако се изцепя с нещо такова на работа, ще получа полагане в стил "Любо Ганев" :D

:) Благодаря за разбирането :)
Не желая да бъда тълкуван погрешно (и пази боже някойд а помисли, че съм груб :)) - в C съм доста начинаещ, но винаги ме е дразнело, когато всички функции в юнита имат достъп до фумкция, която се ползва на 5 места само в една друга функция.

Вярвам, няма нито един аргумент, че влагането на функции нарушава ефективността в която и да е посока.
Това е нещо положително, подобно на инкапсулацията :)

:) :) :)


Nikola Kirov написа:
Наистина ли този компилатор ти позволява функция във функцията?
Странно на всичко което съм писал си вади надлежно съответната грешка при такъв опит.
При това GCC и в AvrStudio 4 и в AvrStudio 5 (с опция "-std=gnu99")

Автор:  relsys [ Сря Апр 06, 2011 8:43 pm ]
Заглавие: 

@NikB:

Малко офтопик, ама като си Паскаладжия, защо не си пишеш проекта на Паскал?

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/