реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Union c внешними (external) переменными, подскажите, как сделать
MrYuran
сообщение Apr 15 2010, 09:38
Сообщение #16


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(XVR @ Apr 15 2010, 13:52) *
Тут ошибка - должно быть extern char buffer[];

Без разницы.
Имя массива - уже указатель.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 15 2010, 10:17
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MrYuran @ Apr 15 2010, 13:53) *
Без разницы.
Имя массива - уже указатель.
В этом контексте - нет. Результаты будут разные:
extern char* buffer; - означает, что в переменной buffer лежит адрес массива, а она сама является указателем.
extern char buffer[]; - означает, что buffer САМА является массивом, т.е. массив лежит начиная с ее адреса и далее.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 15 2010, 10:30
Сообщение #18


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(XVR @ Apr 15 2010, 14:32) *
extern char* buffer; - означает, что в переменной buffer лежит адрес массива, а она сама является указателем.
extern char buffer[]; - означает, что buffer САМА является массивом, т.е. массив лежит начиная с ее адреса и далее.

Ничего это не означает.
Можно написать
char* buffer;
а потом buffer[i] выберет нужный элемент массива
buffer[] - это фактически указатель на первый (нулевой) элемент


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 15 2010, 11:11
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MrYuran @ Apr 15 2010, 14:45) *
Ничего это не означает.
Означает.
Цитата
Можно написать
char* buffer;
а потом buffer[i] выберет нужный элемент массива
buffer[] - это фактически указатель на первый (нулевой) элемент
Можно, но не для extern:
Пример для неверующих:
t1.cpp
Код
#include <stdio.h>

char* s1="abc";
char s2[]="abc";

void t();

int main()
{
printf("s1: %p %s\n",s1,s1);
printf("s2: %p\n",s2);
printf("    %s\n",s2);
t();
return 0;
}


t2.cpp
Код
#include <stdio.h>

extern char* s1;
extern char* s2;

void t()
{
printf("e s1: %p %s\n",s1,s1);
printf("e s2: %p\n",s2);
printf("      %s\n",s2);
}

Сборка: g++ t1.cpp t2.cpp
Запуск:
Цитата
s1: 0x4006ec abc
s2: 0x500a68
abc
e s1: 0x4006ec abc
e s2: 0x636261
Segmentation fault
Обратите внимание на выделенные строки, а особенно на указатель со значением 0x636261 (в ASCII это будет cba, ничего не напоминает?)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2010, 11:16
Сообщение #20


Гуру
******

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



Цитата(XVR @ Apr 15 2010, 12:32) *
В этом контексте - нет. Результаты будут разные:
Да, попутал.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dmitro25
сообщение Apr 16 2010, 04:32
Сообщение #21


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770



XVR
Спасибо за подсказку.
Ваш вариант с преобразованием типов отлично работает. Компилятор оказался "достаточно умный": одиночные обращения к полям структуры он преобразует в команды с непосредственной адресацией, а если обращений к разным полям сосредоточено много в одном месте программы - используется индексная адресация.
То, что было нужно.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 10:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016