Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.01.10;
Скачать: CL | DM;

Вниз

Размер данных по указателю   Найти похожие ветки 

 
looser   (2014-06-30 18:30) [0]

Здравствуйте! Возщможно ли определение размера структуры, на которую указывает указатель?


 
Dimka Maslov ©   (2014-06-30 18:44) [1]

Максимально возможный адрес минус указатель.


 
Ega23 ©   (2014-06-30 19:05) [2]

В общем виде - нет.


 
Rouse_ ©   (2014-06-30 19:36) [3]

Небольшая возможность, конечно, есть, но крайне не советую.


 
Германн ©   (2014-06-30 19:38) [4]

Нетипизированный указатель не указывает ни на какую структуру.


 
Rouse_ ©   (2014-06-30 19:40) [5]


> Германн ©   (30.06.14 19:38) [4]
> Нетипизированный указатель не указывает ни на какую структуру.

Слишком много "не" ;)


 
looser   (2014-06-30 21:15) [6]

Спасибо за ответы! Очень жаль, что нет тривиального способа, а так красиво было ..(((


 
Германн ©   (2014-06-30 23:08) [7]


> Rouse_ ©   (30.06.14 19:40) [5]
>
>
> > Германн ©   (30.06.14 19:38) [4]
> > Нетипизированный указатель не указывает ни на какую структуру.
>
>
> Слишком много "не" ;)

Меньше никак низзя :)


 
DVM ©   (2014-07-01 00:31) [8]


> looser   (30.06.14 18:30) 
> Здравствуйте! Возщможно ли определение размера структуры,
>  на которую указывает указатель?

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


 
Германн ©   (2014-07-01 02:42) [9]


> Дело в том, что указатель может указывать вообще в произвольное
> место в памяти

Дело в том что указатель всегда есть только адрес в памяти и не более того. И он вообще ничего и не на что не указывает, если не оговорено особо.


 
looser   (2014-07-01 09:28) [10]

Всё понял, просто для конкретного случая мне очень удобно было так: SizeOf(MyPointrer^)


 
Юрий Зотов ©   (2014-07-01 12:30) [11]

> Возможно ли определение размера структуры, на которую указывает
> указатель?


Если известно объявление этой структуры, то запросто. А если неизвестно, то либо невозможно, либо можно попробовать добраться до менеджера памяти и посмотреть, сколько памяти он выделял по этому адресу (если он вообще ее выделял). Но как сказал Розыч - не советую. Лучше поискать другое решение.


 
looser   (2014-07-01 12:47) [12]

Спасибо за ответ. В общем у меня реализуется конечный автомат, который разбирает байты по пакетам( структурам) и по выполнении условий заполняет структуру данными. Но хотелось бы еще подстраховаться при выполнении move(buff, Packet1, NumOfBytes)


 
looser   (2014-07-01 12:50) [13]

Точнее так move(buff, PointersArray[idPacketNum]^, NumOfBytes)


 
Юрий Зотов ©   (2014-07-01 15:22) [14]

> looser   (01.07.14 12:47) [12]

Если первые 4 байта пакета (структуры) отвести под его длину, то проблема исчезает.


 
Юрий Зотов ©   (2014-07-01 19:22) [15]

Имелось в виду вот что:
move(buff, PointersArray[idPacketNum]^, Integer(PointersArray[idPacketNum]^)


 
Юрий Зотов ©   (2014-07-01 20:38) [16]

Точнее, не совсем так, конечно. Но мысль, думаю, ясна.


 
Rouse_ ©   (2014-07-01 20:52) [17]


> Юрий Зотов ©   (01.07.14 15:22) [14]
> > looser   (01.07.14 12:47) [12]
>
> Если первые 4 байта пакета (структуры) отвести под его длину,
>  то проблема исчезает.

Дядь Юр - это наоборот великая проблема,  с учетом [12].
Разбирая различные протоколы передачи данных и натыкаясь при этом на структуры, в которых первыми 4 байтами идет размер пакета, я всегда начинаю проверять сей протокол на отказ, формируя фейковый пакет, в котором первые 4 байта содержат FFFFFFFF - как правило 80 процентов сетевых сервисов падают, пытаясь выделить память в 4 гига, из оставшихся процентов 8-10 перестают отвечать, переключаясь на прием данных такого размера, и только маааахонькое количество продолжает работать нормально, как правило это те, которые страхуются от "пережора" :)


 
Rouse_ ©   (2014-07-01 21:19) [18]

ЗЫ: тем более ты сам наглядно продемонстрировал в [15] как можно убить память, при чтении такого пакета.


 
Юрий Зотов ©   (2014-07-01 22:54) [19]

Саш, здесь не требуется проверки на отказ и прочих выкрутасов. Нужно просто решить конкретную задачу, без всяких фейков. Думаю, у тебя нет сомнений в том, что можно прочитать из буфера 4 байта, потом выделить память уже известного размера и потом записать в нее все остальное.

А код в [15], конечно, не рабочий, он только показывает способ. О чем и написано в [16].


 
looser   (2014-07-02 23:44) [20]

Спасибо за ответы! Но, честно говоря, так и не понял рекоммендаций мастеров)) Пока сделал отдельный массив с размерами структур и проверяю при попытке заполнения... Не знаю, канонически правильно или нет, но, вроде, работает


 
Inovet ©   (2014-07-03 01:18) [21]

> [20] looser   (02.07.14 23:44)
> Но, честно говоря, так и не понял рекоммендаций мастеров)
> )

Первым полем сделать sizeof(Эта_Структура_Или_Запись_по_паскалевски)


 
Dennis I. Komarov ©   (2014-07-03 21:15) [22]

Сань, потри... разве можно так плохому учить? :))))


 
Rouse__   (2014-07-03 21:35) [23]

Да вот еще, а по другому как? ;)


 
Dennis I. Komarov ©   (2014-07-04 09:22) [24]


> а по другому как?

Ну одно дело протокол обмена и совсем другое внутри приложения...



Страницы: 1 вся ветка

Текущий архив: 2016.01.10;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.006 c
15-1431293402
Юрий
2015-05-11 00:30
2016.01.10
С днем рождения ! 11 мая 2015 понедельник


15-1431466204
Юрий
2015-05-13 00:30
2016.01.10
С днем рождения ! 13 мая 2015 среда


4-1274796190
Monarch
2010-05-25 18:03
2016.01.10
Проблема с активацией окна


15-1430602781
Дмитрий С
2015-05-03 00:39
2016.01.10
Программы для тренировок по вокалу


15-1430976616
SKIPtr
2015-05-07 08:30
2016.01.10
выполнить задание при спящем режиме