nixp.ru v3.0

22 октября 2017,
воскресенье,
04:07:16 MSK

DevOps с компанией «Флант»
iliya написал 17 декабря 2004 года в 14:05 (721 просмотр) Ведет себя как мужчина; открыл 13 тем в форуме, оставил 196 комментариев на сайте.

Проблема такая , что в C работает код:

void *data;

data=data+10;

,а в C++ нет.

В чем проблема более менее понятно, но как написать тогда код без извращений.

Uncle Theodore

(int*)data = (int*)data + 10;

например. А без извращений не получится, сама идея порочная. Ну зачем тебе прибавлять 10 к указателю на void? :-)

Good Luck,

UT

iliya
Uncle Theodore
(int*)data = (int*)data + 10;

Ну енто воще плохо, инты по смещению 4 (лучше char*), но это тоже мне не нравится.

У меня там просто блок памяти весит мне по нему лазать нужно.

Genie

идея — с одной стороны — порочная, с другой стороны — теряется переносимость..

хотя. может этого и добиваемся? ;)

использовать лучше даже не char*, а int8*. потому как char далеко не обязательно развен байту.

конечно, можно было бы использовать что-то типа (long)data+=10;, но.. это тоже не есть хорошо и переносимо. ;)

iliya

Ок, всё ясно.

Fatal
Genie
использовать лучше даже не char*, а int8*. потому как char далеко не обязательно развен байту.

Интересная мысь, и где он не равен байту?

В некоторых прогах byte определён как unsigned char, думаю, вряд ли бы такое делали если бы не было переносимости…

Genie

в некоторых «прогах» полагаются на то, что sizeof(int)==2.

а при написании некоторых приходится задумываться, что sizeof(long)!=4.

так что теперь? :D

iliya

Да толку что вы спорите….

Как сделать смещение на один байт?

Если (int*)data=(int*)data+1; то это смешение на 4 а то и больше.

А как на один если sizeof(char)!=1 ????

Получается только (void*)data+=1; а на C++ это не работает поскольку sizeof(void)=??? для него.

Genie

использовать специальные типы. int8, s8, u8.

мало ли, что они определяются через char. возьмут и в некотором будушем оторвут вообще пооддержку 8битных типов архитектурно. и комплиятор сам будет извращаться для работы с ними.

(int8*)data+=10;

Fatal
iliya
Да толку что вы спорите….

Я и не собирался спорить, я просто это впервые слышу и очень удивлён, ещё бы прочитать это где-нибудь в более надёжных источниках…

Genie
Я и не собирался спорить, я просто это впервые слышу и очень удивлён, ещё бы прочитать это где-нибудь в более надёжных источниках…


:)))) похвальное стремление ;)

но, что замечательно, утверждения, что char занимает именно 8 бит, а не умолчального предположения, я не встречал.

очевидные, конечно же вещи, но полагаться на 100% на них не стОит ;)

так что — проверяйте.

myst

А я вот думаю как в C проходит это

void *p;
p += 10;

Если sizeof(void) неопределён…

Genie
… Если sizeof(void) неопределён…



$ cat > void.c
main()
{
printf("%d\n",sizeof(void));
}
$ cc -o void void.c
$ ./void
1
$

определён, и, кроме того, равен 1.

далее,

$ c++ -o void void.c
void.c: In function `int main()':
void.c:3: ANSI C++ forbids taking the sizeof a void type
...
myst

Да действительно… Вот что говорит по этому поводу стандарт: «A pointer to void shall have the same representation and alignment requirements as a pointer to a character type».

semka

2Fatal: ты про юникод слышал?

Fatal
tappak
2Fatal: ты про юникод слышал?

Тип для юникода

w_char

или

wchar

точно не помню, но никак не char

decvar

gchar :)))