Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Взятие адреса в С

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
PolAR



Зарегистрирован: 01.11.2004
Сообщения: 133

СообщениеДобавлено: Пн Ноя 21 2005 18:02    Заголовок сообщения: Взятие адреса в С Ответить с цитатой

Возник такой вопрос:
Язык программирования: С.
Допустим есть такая структура:
Код:
struct my_struct {
   int a;
   char b;
};

Инициализируем:
Код:
struct my_struct s,*s1;
char *bptr;
s1=(struct my_struct*)&s;

Вопрос: потребует ли следующее присваивание
Код:
bptr=&(s1->b)

непосредственному обращению к памяти ( т.е. той что выделена при инициализации под s)
или адрес будет вычислен как s1+OFF, где OFF-смещение b в структуре my_struct?
_________________
Come Together!! Right Now....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
kolobok0



Зарегистрирован: 22.04.2005
Сообщения: 253
Откуда: Мсква

СообщениеДобавлено: Вт Ноя 22 2005 15:32    Заголовок сообщения: Re: Взятие адреса в С Ответить с цитатой

PolAR писал(а):
....Вопрос: потребует ли следующее присваивание....
непосредственному обращению к памяти ( т.е. той что выделена при инициализации под s) или адрес будет вычислен как s1+OFF, где OFF-смещение b в структуре my_struct?


А будь Вы микропроцессором - Вы бы обратились бы ? И осадок нафига ? Про запас ничего не делаеться... Если НЕТ ЯВНОГО обращения по указанному адресу - значит его НЕТ.

Другое дело, что это смотриться коряво и возникает резонный вопрос - нахрена такой гимор ? Возможно есть более элегантные пути решения ?

В Вашем примере переменная bptr будет вычисляться (скорее всего) в регистре микропроцессора. Туда будет помещён адресс указывающий на память (s1) и добавлено смещение, вычисленное на линковке. В зависимости от типа проца эти действия могут выглядеть по разному.

По поводу корявости...Дело в том, что если Вы повнимательней вглядитесь в рекомендации Корнегиан и Ричи (не ошибся в фамилиях ?), то увидите в профиль то, что легло в основу C++. Один из постулатов - инкапсуляция данных и кода. Другими словами брать адрес на потроха структуры - значит предпологать, что время жизни данной структуры будет БОЛЬШЕ чем сам УКАЗАТЕЛЬ. Надеяться, что это выполниться АВТОМАТИЧЕСКИ(или подразумевается) у Вас в коде - вверх легкомыслия... Но в некоторых случаях это может и имеет под собой основу...хотя на мой взгляд я таких примеров НЕ встречал...


с уважением
(круглый)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
PolAR



Зарегистрирован: 01.11.2004
Сообщения: 133

СообщениеДобавлено: Вт Ноя 22 2005 19:46    Заголовок сообщения: Ответить с цитатой

Спасибо. Я так и думал!
По поводу сказанного kolobok0:
Цитата:
Другими словами брать адрес на потроха структуры - значит предпологать, что время жизни данной структуры будет БОЛЬШЕ чем сам УКАЗАТЕЛЬ

В моем случае это точно - указатель используется для чтения I/O memory в драйвере.
Сложность была в том, что к I/O нежелательно обращение напрямую, а лучше через спец функции, в которые этот самый указатель и передается
У меня было 2 варианта:
1. Определить константы со смещениями для каждого поля I/O окна тогда адрес поля вычисл: s+FIELD_OFFS
2. Представить это окно в виде структуры ( что мне кажется проще ) и передавать так &(s->field)

Если есть еще какие-нибудь
Цитата:
более элегантные пути решения
буду очень благодарен.
_________________
Come Together!! Right Now....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...