Отговори на тема  [ 19 мнения ]  Отиди на страница 1, 2  Следваща
RQ: AVR GCC (или просто C?) - проблем с променлива в main() 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение RQ: AVR GCC (или просто C?) - проблем с променлива в main()
В проекта, който пиша с ваша помощ :), ми се налага да ползвам променлива, глобална за цялата функция main().
Това е името на един файл, което генерирам веднага след ресет и ползвам през целия цикъл до изключването.
а) Ако променливата я дефинирам в секцията преди функцията main() всичко е наред (поне така изглежда :))
б) Ако дефиницията е непосредствено след заглавния ред на функцията - доста бързо стойността на променливата се разрушава.

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

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

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


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


Вто Апр 05, 2011 8:47 pm
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Не можеш ли да видиш на дебъгера какво става? Сложи watchpoint за write access към FileNameOfData, и би трябвало да спре в момента, когато почва да се пише в нея.


Сря Апр 06, 2011 11:31 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

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

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

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


Сря Апр 06, 2011 11:39 am
Профил ICQ WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение 
За static променливи чувал ли си? Ако не, земи прочети, чувам че си имал достатъчно книжки.


Сря Апр 06, 2011 1:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
И как дефинирането и като статик ще помогне?
Нека даде мейн функцията и тогава да "гадаем".


Сря Апр 06, 2011 1:33 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 
tolstolob написа:
За static променливи чувал ли си? Ако не, земи прочети, чувам че си имал достатъчно книжки.

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


Сря Апр 06, 2011 1:33 pm
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 
michev написа:
И как дефинирането и като статик ще помогне?
Нека даде мейн функцията и тогава да "гадаем".


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


Прикачени файлове:
aPlan_main.c [38.53 KiB]
282 пъти
Сря Апр 06, 2011 1:36 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Страх ме е да попитам що си дефинирал 1 торба функции във функция мейн...
Нормално е локална променлива за функция мейн да не е достъпна от друга функция (въпреки че и тях си напъхал в мейн..).
решението е 1 - изкарваш я извън функция - т.е глобална.


Сря Апр 06, 2011 1:41 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

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


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

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

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


Прикачени файлове:
Show.JPG
Show.JPG [ 56.08 KiB | Прегледано 2739 пъти ]
Сря Апр 06, 2011 1:49 pm
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Аз дори не знаех, че може да се дефинира функция във функция... :oops: Срам. Май само в питона съм срещал такова нещо. От толкова време пиша на С и все още научавам ново неща... Какво е предимството на този начин ? Ако има...


Сря Апр 06, 2011 3:17 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 
setoy написа:
...Какво е предимството на този начин ? Ако има...

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


Сря Апр 06, 2011 4:49 pm
Профил ICQ WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение 
Е, не знаех че в мейн е изтръскан целия код, че и вложени функции имало :?
Абе не е добра идея това с вложените функции... Ако се изцепя с нещо такова на работа, ще получа полагане в стил "Любо Ганев" :D


Сря Апр 06, 2011 5:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Наистина ли този компилатор ти позволява функция във функцията?
Странно на всичко което съм писал си вади надлежно съответната грешка при такъв опит.


Сря Апр 06, 2011 6:25 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 
tolstolob написа:
...Абе не е добра идея това с вложените функции... Ако се изцепя с нещо такова на работа, ще получа полагане в стил "Любо Ганев" :D

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

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

:) :) :)


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


Сря Апр 06, 2011 8:29 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
@NikB:

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


Сря Апр 06, 2011 8:43 pm
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 19 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни