DizzyDen
|
достаточно добр
|
|
|
|
Рег.: 04.03.2003
|
Сообщений: 51429
|
Из: http://лакалхвост
|
Рейтинг: 13545
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: jackal]
23.11.2006 18:39
|
|
|
Quote:
p_long=(long *)(pMapping+sizeof(float));
А если написать что-нибудь вроде p_long = (long *)((void *)(((float *)pMapping ) + 1 )); ?
|
If stateless paradigm is good for your code, why shouldn't it be for your country? |
|
___
|
■
|
|
|
|
Рег.: 27.11.2003
|
Сообщений: 1632
|
|
Рейтинг: 44
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: jackal]
23.11.2006 19:08
|
|
|
правильно делать через boost::shmem, удачи
|
|
vozbu
|
karamba
|
|
|
|
Рег.: 14.11.2004
|
Сообщений: 4856
|
|
Рейтинг: 1057
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: mkal]
23.11.2006 22:21
|
|
|
В ответ на:
Если структурой нельзя из-за того, что порядок и количество даных не известно во время компиляции, то надо сначала приводить указатель к типу (void*), потом прибавлять смещение, а потом уже приводить к нужному типу. Но тут возможны проблемы с выравниванием и надо быть очень аккуратным.
К типу void* нельзя применять арифметические операции, т.ч. смещение к нему прибавить невозможно.
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
|
|
blind
|
still alive
|
|
|
|
Рег.: 16.01.2004
|
Сообщений: 23128
|
Из: Хамовники
|
Рейтинг: 16483
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: vozbu]
23.11.2006 23:05
|
|
|
в C++ да, а в C он как char*
|
13/37 =) |
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13750
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: blind]
23.11.2006 23:56
|
|
|
распространение заведомо неверной информации
|
|
blind
|
still alive
|
|
|
|
Рег.: 16.01.2004
|
Сообщений: 23128
|
Из: Хамовники
|
Рейтинг: 16483
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: Basilio]
24.11.2006 00:22
|
|
|
в плане адресной арифметики он такой-же.
6.2.5 Types
...
26 A pointer to void shall have the same representation and alignment requirements as a pointer to a character type. 39) Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements. All pointers to structure types shall have the same representation and alignment requirements as each other. All pointers to union types shall have the same representation and alignment requirements as each other. Pointers to other types need not have the same representation or alignment requirements.
39) The same representation and alignment requirements are meant to imply interchangeability as arguments to functions, return values from functions, and members of unions.
Редактировал blind (24.11.2006 00:26)
|
13/37 =) |
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13750
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: blind]
24.11.2006 02:00
|
|
|
то, что ты процитировал касается представления [как целого числа] и выравнивания в структурах. арифметические действия с void * запрещены
|
|
blind
|
still alive
|
|
|
|
Рег.: 16.01.2004
|
Сообщений: 23128
|
Из: Хамовники
|
Рейтинг: 16483
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: Basilio]
24.11.2006 12:19
|
|
|
#include <stdio.h> int main () { void *a = NULL; void *b = a+10; int x = b-a; printf("%p %p %d\n", a, b, x); return 0; }
c -Wall компилируются молча
и выводит (nil) 0xa 10
|
13/37 =) |
|
shaller
|
San Jose
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 21640
|
Из: Станция 074803
|
Рейтинг: 15646
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: blind]
24.11.2006 12:22
|
|
|
-pedantic юзай
|
'Земля наша велика и обильна, а порядка в ней нет. Приходите княжить и владеть нами' |
|
blind
|
still alive
|
|
|
|
Рег.: 16.01.2004
|
Сообщений: 23128
|
Из: Хамовники
|
Рейтинг: 16483
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: shaller]
24.11.2006 12:27
|
|
|
работает усе, нах*й педантов.
|
13/37 =) |
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13750
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: blind]
24.11.2006 12:31
|
|
|
к слову, мой любимый компилятор:
code:
Open Watcom C/C++ CL Clone for 386 Version 1.5
Portions Copyright (c) 1995-2006 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
a.c
a.c(4): Error! E1066: Cannot perform operation with pointer to void
a.c(5): Error! E1066: Cannot perform operation with pointer to void
|
|
sidaesc
|
journeyman
|
|
|
|
Рег.: 24.04.2006
|
Сообщений: 94
|
|
Рейтинг: 3
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: blind]
25.11.2006 12:40
|
|
|
Так делать нельзя т.к. если вычитаешь из одного указателя другой они должны указывать на элементы одного массива или вымошленный последний символ этого массива
|
|
blind
|
still alive
|
|
|
|
Рег.: 16.01.2004
|
Сообщений: 23128
|
Из: Хамовники
|
Рейтинг: 16483
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: sidaesc]
25.11.2006 12:43
|
|
|
|
sidaesc
|
journeyman
|
|
|
|
Рег.: 24.04.2006
|
Сообщений: 94
|
|
Рейтинг: 3
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: blind]
25.11.2006 12:56
|
|
|
Quote:
C Standart - 1999 Final draft 6.5.6 Additive operators ... 9 When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements.
|
|
blind
|
still alive
|
|
|
|
Рег.: 16.01.2004
|
Сообщений: 23128
|
Из: Хамовники
|
Рейтинг: 16483
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: sidaesc]
25.11.2006 13:44
|
|
|
верю. С создавался так чтоб работало навсяких экзотических жулюзяках. это требование невозможно проверить во время компиляции, а в рантайме это уж точно никто делать не будет.
это требование к программисту, мол если это не так - то хз что там получится, сам виноват.
так что не "так делать нельзя" а "так лучше не делать"
|
13/37 =) |
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: C++, по указателю разместить в памяти разнотипные данные
[re: Basilio]
25.11.2006 15:37
|
|
|
> тогда так - выделяй памяти на 4+n1+4+n2 > в места по 4 байта записывай размеры, на n1 и n2 - соответствующие данные.
Не надо так делать.
Правильнее size_t+size_t+n1*sz1+n2*sz2, где sz[12] --- размеры структур, добитых до принятого выравнивания. Или вообще использовать не количества, а смещения в адресуемых единицах. Только тогда надо смотреть на архитектуру.
--- ...Я работаю антинаучным аферистом...
|
|