|
Инициализация переменных в CVAVR, Ошибка иницилизации глобальной переменной в CVAVR |
|
|
|
Aug 28 2007, 18:18
|

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

|
В CVAVR создаются глобальные переменные : Код // Declare your global variables here
typedef struct typePunktMenu punktMenu;
struct typePunktMenu // struktura punkta menu { char linia1[17]; char linia2[17]; punktMenu *Up; punktMenu * Left; punktMenu * Right; punktMenu * Down; void (*function)(); };
// masiv punktov menu punktMenu mainMenu[3];
char linija[17] = "ABCDEFGHIJKLMNOP"; linija должна начинатся с адреса 1E4h , но в отладке видно, что начинается с адреса 160h если mainMenu проиницилизировать вручную Код // masiv punktov menu punktMenu mainMenu[3]= { {"","",0,0,0,0,0}, {"","",0,0,0,0,0}, {"","",0,0,0,0,0} }; то све встает на свои места. Ошибка CVAVR или так и должно быть ? в файле полный пример и рисунки отладки.
Projekt.rar ( 327.12 килобайт )
Кол-во скачиваний: 648
|
|
|
|
|
Aug 28 2007, 19:08
|

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

|
Цитата(WHALE @ Aug 28 2007, 21:41)  Ничего не понял..почему вы считаете,что ваш массив должен начинаться с какого-то конкретного адреса? В компиляторе есть прагмы,позволяющие класть данные в фиксированные адреса,но вы-же их не применяете,да и нафига это нужно?Оставьте черновую работу компилятору и не парьтесь. и кстати,инициализация.имхо,неправильная,так попробуйте
typePunktMenu.linija = "ABCDEFGHIJKLMNOP"; Переменная linija отношения к typePunktMenu неимеет. массив будет начинаться с какого-то адреса, так как его туда компилятор помещает. Мне не нужен постоянный адрес. ( адрес размещения виден в файле main.map , и там он указан верно) но в готовом проекте адрес переменной linija залазит на массив. Мне кажется что все глобальные переменные должны быть проинициализированны автоматически. А инициализация(для масива) такая как у меня показанна работает нормально.
|
|
|
|
|
Aug 28 2007, 19:37
|

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

|
Цитата(WHALE @ Aug 28 2007, 22:28)  опять ничего не понял-так linija у вас переменная или массив llinija отдельная переменная ( массив из 16 char ) и располагается после массива mainMenu
Сообщение отредактировал Marian - Aug 28 2007, 19:39
|
|
|
|
|
Aug 28 2007, 19:45
|

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

|
Цитата(WHALE @ Aug 28 2007, 22:41)  может,у вас стек маловат?попробуйте включить маркер конца стека и посмотрите в отладчике,не затира ется ли он. Смотрел, не затирается. Такое ощущение что компилятор производит оптимизацию с ошибкой , если не произвести ручной(принудительной) иницилизации. Оптимизация не отключается, переключение с Size на Speed не помогает.
Сообщение отредактировал Marian - Aug 28 2007, 19:51
|
|
|
|
|
Aug 29 2007, 03:41
|

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

|
Цитата(WHALE @ Aug 28 2007, 22:59)  а версия компилятора у вас какая? версия 1.24.6 Цитата(VDG @ Aug 28 2007, 23:12)  Пересечение областей памяти, так? Вы хотя бы числа дали бы: откуда начинается, где кончается... Да, пересечение областей памяти. Располажение переменных в памяти
А так в проекте
|
|
|
|
|
Aug 29 2007, 06:56
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Marian @ Aug 28 2007, 22:08)  Мне кажется что все глобальные переменные должны быть проинициализированны автоматически. Да, вам правильно кажется. Только обратите внимание, что в первом случае вы не указываете, чем инициализировать ваши структуры. Существует минимум два способа инициализации - 1) в переменную записывается записанное где-то во флеш начальное состояние 2) область памяти переменной заполняется заренее известной константой (нулем). Поскольку переменная в программе не одна, компилятор группирует их по способу инициализации. И потом сразу одним большим куском копирует сразу все начальные значения в инициализированные глобальные переменные, после чего (или перед - не важно) одним циклом обнуляет все неинициализированные. Что вы и наблюдаете - когда вы не указываете явное значение для инициализации, переменная попадает в одну область памяти, когда указываете - в другую. Еще - при указании инициализационных значений структуры можно указывать не все значения, а только несколько первых элементов. Остальные будут считаться компилятором как 0. Т.е. ваша инициализация могла быть записана как punktMenu mainMenu[3]={{0}};
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 29 2007, 09:40
|

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

|
Цитата Существует минимум два способа инициализации- 1) в переменную записывается записанное где-то во флеш начальное состояние 2) область памяти переменной заполняется заренее известной константой (нулем). Способ инициализации здесь неважен, при автоматическом размещении и инициализации переменной нулем, должно быть выделено место в памяти и другая переменная недолжна, занимать тоже место в памяти. Похоже на ошибку компилятора. Цитата Еще - при указании инициализационных значений структуры можно указывать не все значения, а только несколько первых элементов. Остальные будут считаться компилятором как 0. Т.е. ваша инициализация могла быть записана как punktMenu mainMenu[3]={{0}}; Пробовал инициализировать и так как у Вас в примере, дает ошибочный результат. ( В файле есть две папки с проектом, если не лень, можете попробовать. Там в проекте после визарда добавлены только эти переменные.)
|
|
|
|
|
Aug 29 2007, 14:44
|

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

|
С настройками программы вроде все в порядке. Цитата(VDG @ Aug 29 2007, 17:14)  Компилятор после того как выдал Вам таблицу распределения в памяти, взял и втихомолку перетасовал адреса. Это глюк. Но не смертельный, если не делать из асма обращения к памяти (по данным из таблицы). Это именно перетасовка, а не "наезд" одной области на другую. Проинициализируйте массив и посмотрите куда он на самом деле уехал. Скорее всего он идёт сразу же за строкой. В том и проблема, что масив остается в том месте где и должен сидеть согласно map И например если в программе использовать : Код strcpyf(mainMenu[0].linia1,"nuznyj tekst"); то содержимое переменной linija, будет испорчено. Спасибо всем за участие.
Сообщение отредактировал Marian - Aug 29 2007, 14:46
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|