Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=5430600&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 23:33:21 2016
Кодировка: Windows-1251
C++, по указателю разместить в памяти разнотипные данные - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 0 | 20 | показать все
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
 

это С дружок =)



13/37 =)
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] ---
размеры структур, добитых до принятого выравнивания.
Или вообще использовать не количества, а смещения
в адресуемых единицах.
Только тогда надо смотреть на архитектуру.


---
...Я работаю антинаучным аферистом...

Страницы: 0 | 20 | показать все

Technical >> Development (Archive)

Дополнительная информация
0 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в