Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2016.01.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.002 c
2-1404138648
looser
2014-06-30 18:30
2016.01.10
Размер данных по указателю


4-1274944532
user51
2010-05-27 11:15
2016.01.10
как из dll запустить exe файл


15-1431552604
Юрий
2015-05-14 00:30
2016.01.10
С днем рождения ! 14 мая 2015 четверг


3-1306327887
yurikon
2011-05-25 16:51
2016.01.10
Подключение к MySQL без ODBC


3-1306330689
OW
2011-05-25 17:38
2016.01.10
разный результат запросов напрямую к Ora и через линк





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский