|
Инициализация переменных в 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 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}}; Пробовал инициализировать и так как у Вас в примере, дает ошибочный результат. ( В файле есть две папки с проектом, если не лень, можете попробовать. Там в проекте после визарда добавлены только эти переменные.)
|
|
|
|
Сообщений в этой теме
Marian Инициализация переменных в CVAVR Aug 28 2007, 18:18 WHALE опять ничего не понял-так linija у вас переменная ... Aug 28 2007, 19:28 Marian Цитата(WHALE @ Aug 28 2007, 22:28) опять ... Aug 28 2007, 19:37 WHALE может,у вас стек маловат?попробуйте включить марке... Aug 28 2007, 19:41 Marian Цитата(WHALE @ Aug 28 2007, 22:41) может,... Aug 28 2007, 19:45 WHALE а версия компилятора у вас какая? Aug 28 2007, 19:59 Marian Цитата(WHALE @ Aug 28 2007, 22:59) а верс... Aug 29 2007, 03:41  VDG Цитата(Marian @ Aug 29 2007, 07:41) Да, п... Aug 29 2007, 14:14   Marian С настройками программы вроде все в порядке.
Цита... Aug 29 2007, 14:44    VDG Цитата(Marian @ Aug 29 2007, 18:44) В том... Aug 29 2007, 20:23     Marian Цитата(VDG @ Aug 29 2007, 23:23) А Вы это... Aug 30 2007, 15:14      VDG Цитата(Marian @ Aug 30 2007, 19:14) Посмо... Aug 30 2007, 18:41 VDG Пересечение областей памяти, так?
Вы хотя бы числа... Aug 28 2007, 20:12 WHALE я не знаю,пару лет назад как раз по-моему на 1.24.... Aug 29 2007, 09:56
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|