Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Размер данных по указателю


Страницы:   1 2

looser ©   (2014-06-30 18:30:00) 

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


Dennis I. Komarov   (2014-07-04 09:22:00) [1]


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

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


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

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


Dennis I. Komarov   (2014-07-03 21:15:00) [3]

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


Inovet   (2014-07-03 01:18:00) [4]

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

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


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

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


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

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

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


Rouse_   (2014-07-01 21:19:00) [7]

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


Rouse_   (2014-07-01 20:52:00) [8]


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

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


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

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


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

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


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

> looser   (01.07.14 12:47) [12]

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


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

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


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

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


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

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


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


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

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


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


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

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


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


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

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


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


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

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


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

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


Rouse_   (2014-06-30 19:40:00) [20]


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо