Форум: "Начинающим";
Текущий архив: 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