jack_avenger 4 3 сентября, 2005 Опубликовано 3 сентября, 2005 · Жалоба Не пинайте за глупый вопрос я перехожу с CodeVision на IAR и ничего не понимаю. Юзаю IAR 4.11A Надо получить старшую часть адреса переменной в RAM. Пробую что-то типа int Variable=1; char AddrH=(char)((&Variable)>>8); не катит (матерится компилятор). А если написать так: int Variable=1; char AddrH=(char)(&Variable); то все гуд, но понятно что получаю младшую часть. Как надо правильно писать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aal 0 3 сентября, 2005 Опубликовано 3 сентября, 2005 · Жалоба Во первых Variable должна быть статик, чтоб по адрессу можно было обращатся. Если она будет динамическая, то может и в регистре лежать. Во вторых приводи не к чар а к инту и его уже сдвигай. А так ты уже получил младшую часть адреса и ещё пытаешся её сдвинуть. Компилятор и ругается на это. ИМХО. Не проверял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jack_avenger 4 3 сентября, 2005 Опубликовано 3 сентября, 2005 · Жалоба Во первых Variable должна быть статик, чтоб по адрессу можно было обращатся. Если она будет динамическая, то может и в регистре лежать. <{POST_SNAPBACK}> Спасибо, static действительно помог =)) Во вторых приводи не к чар а к инту и его уже сдвигай. А так ты уже получил младшую часть адреса и ещё пытаешся её сдвинуть. Компилятор и ругается на это. ИМХО. Не проверял. <{POST_SNAPBACK}> Значит преобразование от int к char за меня сделает компилятор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
INT1 0 3 сентября, 2005 Опубликовано 3 сентября, 2005 · Жалоба не работал с Кодевижн, но может быть связано с "..ВHИМАHИЕ! IAR адресует память программ побайтно, в то время как Atmel — пословно. Поэтому, если в map-файле от компоновщика подпрограмма имеет адрес 1234h, то в astudio надо указывать адрес 1234h/2=091Ah." к примеру, тут: http://www.chipnews.com.ua/html.cgi/arhiv/00_10/15.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aal 0 3 сентября, 2005 Опубликовано 3 сентября, 2005 · Жалоба >Значит преобразование от int к char за меня сделает компилятор? При пересылке инта в чар - вчаре окажется младший байт инта. Приведением типа не увлекайся, можешь на глюки нарватся. Если надо что-то посчитать точно, через темповую переменную работай - код тотже - глюков меньше. А в реал переводить лучше умножением на 1.0..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jack_avenger 4 5 сентября, 2005 Опубликовано 5 сентября, 2005 · Жалоба Решил не возится с адресами переменных (умные люди придумали же указатели <_< ). Мне нужен связанный список. Взял пример из книги Ю.Н. Патрикеева "Объектно-ориентированное программирование на Borland C++": struct Value; struct Tree_element { Value * val; Tree_element *left, *right; }; Ответ на это ИАРа: Error[Pe020]: identifier "Value" is undefined Error[Pe020]: identifier "Tree_element" is undefined Неужели ИАР не поддерживает предварительное объявления структур? Как по другому мне сделать список? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jack_avenger 4 5 сентября, 2005 Опубликовано 5 сентября, 2005 · Жалоба Уже понял. Вот как надо: struct Value; struct Tree_element { struct Value * val; struct Tree_element *left, *right; }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ValeraVi 0 5 сентября, 2005 Опубликовано 5 сентября, 2005 · Жалоба я б написал примерно так: 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 :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jack_avenger 4 7 сентября, 2005 Опубликовано 7 сентября, 2005 · Жалоба Большое спасибо всем ответившим. У меня еще один вопрос, косвенно связан с предыдущим: Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал: char cChar; char xChar[10]; void *pVoid; pVoid=&cChar; *pVoid=1; Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue :( Как все-же нужно сделать и для чего предназначены указатели на void ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BVU 0 7 сентября, 2005 Опубликовано 7 сентября, 2005 · Жалоба Большое спасибо всем ответившим. У меня еще один вопрос, косвенно связан с предыдущим: Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал: char cChar; char xChar[10]; void *pVoid; pVoid=&cChar; *pVoid=1; Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue :( Как все-же нужно сделать и для чего предназначены указатели на void ? <{POST_SNAPBACK}> Тип void применяется при объявлении функций, означающий - что функция не содержит никакого возвращаемого значения. Для переменных это не применимо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
phantom 0 7 сентября, 2005 Опубликовано 7 сентября, 2005 · Жалоба "Нужен указатель, который может ссылается раз на char, раз на масив char[]" А это не одно и то же? В смысле если есть указатель на char, его можно использовать для ссылки как на cChar (pChar=&cСhar) так и на XChar (pChar=XChar, имя массива есть указатель на его первый элемент). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 7 сентября, 2005 Опубликовано 7 сентября, 2005 · Жалоба Большое спасибо всем ответившим. У меня еще один вопрос, косвенно связан с предыдущим: Нужен указатель, который может ссылается раз на char, раз на масив char[]. Я написал: char cChar; char xChar[10]; void *pVoid; pVoid=&cChar; *pVoid=1; Ответ компилятора на последнюю строчку: Error[Pe137]: expression must be a modifiable lvalue :( Как все-же нужно сделать и для чего предназначены указатели на void ? <{POST_SNAPBACK}> Тип void применяется при объявлении функций, означающий - что функция не содержит никакого возвращаемого значения. Для переменных это не применимо! <{POST_SNAPBACK}> как это не приминимы, а указатель на void, очень даже распространены. void * MyPTR; // указатель на viod Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BVU 0 7 сентября, 2005 Опубликовано 7 сентября, 2005 · Жалоба "void * MyPTR; // указатель на viod" Так это когда Вы работаете с указателями на функцию... а уж если заводите переменную извольте указывать ее - явно, а не void, что для многих компиляторов не явно приводиться к типу int, что может в результате вызвать путаницу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ValeraVi 0 7 сентября, 2005 Опубликовано 7 сентября, 2005 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ObitJr 0 7 сентября, 2005 Опубликовано 7 сентября, 2005 · Жалоба "void * MyPTR; // указатель на viod" Так это когда Вы работаете с указателями на функцию... а уж если заводите переменную извольте указывать ее - явно, а не void, что для многих компиляторов не явно приводиться к типу int, что может в результате вызвать путаницу. <{POST_SNAPBACK}> void* - это просто указатель, а к инту приводится (иногда) только потому, что имеет одинаковый рамер, зависящий от архитектуры. И используется достаточно часто (для переменных), например как уеазатель на данные в хранилищах + приводится как угодно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться