|
Помогите ламеру с IAR, проблема с вычислением адреса переменной |
|
|
|
Sep 3 2005, 11:34
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Цитата(aal @ Sep 3 2005, 14:25) Во первых Variable должна быть статик, чтоб по адрессу можно было обращатся. Если она будет динамическая, то может и в регистре лежать. Спасибо, static действительно помог =)) Цитата(aal @ Sep 3 2005, 14:25) Во вторых приводи не к чар а к инту и его уже сдвигай. А так ты уже получил младшую часть адреса и ещё пытаешся её сдвинуть. Компилятор и ругается на это. ИМХО. Не проверял. Значит преобразование от int к char за меня сделает компилятор?
|
|
|
|
|
Sep 3 2005, 11:37
|
deleted
   
Группа: Свой
Сообщений: 555
Регистрация: 28-08-05
Пользователь №: 8 024

|
не работал с Кодевижн, но может быть связано с "..ВHИМАHИЕ! IAR адресует память программ побайтно, в то время как Atmel — пословно. Поэтому, если в map-файле от компоновщика подпрограмма имеет адрес 1234h, то в astudio надо указывать адрес 1234h/2=091Ah." к примеру, тут: http://www.chipnews.com.ua/html.cgi/arhiv/00_10/15.htm
|
|
|
|
|
Sep 5 2005, 17:08
|

Участник

Группа: Свой
Сообщений: 44
Регистрация: 30-07-05
Из: Kyiv, Ukraine
Пользователь №: 7 211

|
я б написал примерно так: struct Value_tag; typedef struct Value_tag Value; typedef struct Tree_element_tag Tree_element; struct Tree_element_tag { Value * val; Tree_element *left, *right; }; struct Value_tag { int a; int b; //... }; и дальше не пришлось бы к Value и Tree_element постоянно приписывать struct
|
|
|
|
|
Sep 7 2005, 12:37
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Большое спасибо всем ответившим. У меня еще один вопрос, косвенно связан с предыдущим: Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал: char cChar; char xChar[10]; void *pVoid; pVoid=&cChar; *pVoid=1; Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue Как все-же нужно сделать и для чего предназначены указатели на void ?
|
|
|
|
|
Sep 7 2005, 12:51
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(jack_avenger @ Sep 7 2005, 16:37) Большое спасибо всем ответившим. У меня еще один вопрос, косвенно связан с предыдущим: Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал: char cChar; char xChar[10]; void *pVoid; pVoid=&cChar; *pVoid=1; Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue Как все-же нужно сделать и для чего предназначены указатели на void ? Тип void применяется при объявлении функций, означающий - что функция не содержит никакого возвращаемого значения. Для переменных это не применимо!
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Sep 7 2005, 14:19
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата(BVU @ Sep 7 2005, 15:51) Цитата(jack_avenger @ Sep 7 2005, 16:37) Большое спасибо всем ответившим. У меня еще один вопрос, косвенно связан с предыдущим: Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал: char cChar; char xChar[10]; void *pVoid; pVoid=&cChar; *pVoid=1; Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue Как все-же нужно сделать и для чего предназначены указатели на void ? Тип void применяется при объявлении функций, означающий - что функция не содержит никакого возвращаемого значения. Для переменных это не применимо! как это не приминимы, а указатель на void, очень даже распространены. void * MyPTR; // указатель на viod
|
|
|
|
|
Sep 7 2005, 18:03
|

Участник

Группа: Свой
Сообщений: 44
Регистрация: 30-07-05
Из: Kyiv, Ukraine
Пользователь №: 7 211

|
1. void запросто можно использовать с указателями на массивы (и др.). А если точнее, то void* это указатель на "ничто"  поэтому тут уже нет разницы какой указатель (на строку, на функцию, на массив int и т.п.) вы приводите к типу void* 2. 2 jack_avenger Чтоб ваш код откомпилился нужно написать так: char cChar; char xChar[10]; void *pVoid; pVoid=&cChar; *((char*)pVoid) = 1; т.е., т.к void - это "ничто", то в этом "ничто" трудно выделить элемент, в который вы хотите затолкнуть 1, поэтому указатель на "ничто" нужно к чему-то привести (например к char), а потом уже в него записывать 1. НО, как сказал phantom - между указателем на массив char (строкой) и просто char (частный случай массива char размером = 1 элемент) разницы нет (и в том и в другом случае указатель - указывает на char) поэтому проще написать так: char cChar; char xChar[10]; char *pVoid; pVoid=&cChar; pVoid=xChar; //т.к массив char'ов это есть указатель на 0-й char. *pVoid = 1;
|
|
|
|
|
Sep 7 2005, 18:09
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-07-05
Пользователь №: 7 043

|
Цитата(BVU @ Sep 7 2005, 16:35) "void * MyPTR; // указатель на viod" Так это когда Вы работаете с указателями на функцию... а уж если заводите переменную извольте указывать ее - явно, а не void, что для многих компиляторов не явно приводиться к типу int, что может в результате вызвать путаницу. void* - это просто указатель, а к инту приводится (иногда) только потому, что имеет одинаковый рамер, зависящий от архитектуры. И используется достаточно часто (для переменных), например как уеазатель на данные в хранилищах + приводится как угодно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|