Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
ВнизSizeOf PChar Найти похожие ветки
← →
Anonimus (2003-06-28 16:47) [0]Привет!
var Buf: PChar;
....
begin
Buf := PChar(SomeThing);
Как узнать размер этого масива?
Спасибо!
← →
Тих (2003-06-28 17:06) [1]Если повезет, то StrLen`ом.
← →
Anonimus (2003-06-28 17:38) [2]Не повезло :(
← →
Anatoly Podgoretsky (2003-06-28 17:44) [3]Повезет если только PChar указывает на ASCIIZ
← →
Anonimus (2003-06-28 17:51) [4]Нет, он на это не указывает
← →
Юрий Зотов (2003-06-28 17:51) [5]Если SomeThing - это строка или динамический массив, то Length(SomeThing). А если что-то еще, то сколько Вы САМИ выделили памяти - столько и есть, ничего определять и не нужно.
← →
Anatoly Podgoretsky (2003-06-28 17:53) [6]А если это что то неизвестное, то как с ним работается?
← →
Dimaxx (2003-06-28 18:57) [7]Используй Length. Он все покажет!
← →
Anatoly Podgoretsky (2003-06-28 19:44) [8]ar1: array[1..10] of char;
ar2: array[1..100] of char;
P := ar1;
И что тебе покажет Length?
← →
Юрий Зотов (2003-06-28 20:05) [9]И началось гадание на кофейной гуще - а что же такое SomeThing? Видно, это такая большая военная тайна, что даже и намекнуть нельзя. Мол, а я вот не скажу, а вы вот сами догадайтесь.
Дяденька аноним, может, ну хоть кусочек кода все-таки можно? Ну хоть малюсенький... Ну хотя бы декларацию...
Или Вы разводками занимаетесь? Доказываете (вот только кому?), что Вы тут самый умный и самый остроумный? Ха-ха, как смешно-то!
← →
Dimaxx (2003-06-28 23:56) [10]2 Anatoly Podgoretsky:
Что покажет? Покажет ошибку несоответствия типов! Ты присваиваешь указателю массив символов. Вот если указать P:=@ar1, а затем взять Length(P) - он тебе и покажет 10.
← →
jack128 (2003-06-29 00:04) [11]
> Dimaxx © (28.06.03 23:56)
procedure TForm1.Button1Click(Sender: TObject);
var ar1: array[1..10] of char;
ar2: array[1..100] of char;
p : pchar;
begin
P := @ar1;
ShowMessage(IntToStr(Length(p)));
end;
Показывает 0, догадываешься почему?? ;-)
← →
Dimaxx (2003-06-29 01:26) [12]Догадываюсь. Потому что массив по умолчанию заполнен нулями, а ноль, если помнишь, у pchar является признаком конца строки. Вот и длина 0. Попоробуй:
var P: PChar;
...
P:="abcd";
ShowMessage(IntToStr(Length(P))); // покажет 4
...
← →
Anatoly Podgoretsky (2003-06-29 08:56) [13]Dimaxx © (28.06.03 23:56)
Так ты пробовал применить Length или нет, для информации, указатель типа PChar не содержит информации о размере массива.
Вопрос к тому же не про длину строки, а про размер массива, на который указывает указатель, для ASCIIZ, по определению длина массива (буфера) неопределена и нигде не находится.
Догадайся с двух раз, что показала данная программа
P := @ar1;
Label1.Caption := IntToStr(Length(P));
P := @ar2;
Label2.Caption := IntToStr(Length(P));
Только не надо опять про 10 или 100
ЗЫ: символ @ мог бы и сам добавить, суть бы в том " И что тебе покажет Length?"
Но правда если у тебя есть особое желание настаивать, то можешь оставаться в своем заблуждение намеренном или нет.
jack128 © (29.06.03 00:04)
Насчет нуля ты не прав, это если тебе повезет. Это еще дополнение к абсудному утвеждению Dimaxx, что массив по умолчанию заполнен нулями
← →
Morfein (2003-06-29 10:59) [14]> Anonimus
> Не повезло :( /StrLen"ом/
А почему, собственно, не повезло? Это может быть только если у тебя SomeThing указывает на область памяти с даными, не имееющими завершающего нуля... А раз так, то это уже не PCHAR получается и к PCHAR ты его приводить не можешь.
← →
Anatoly Podgoretsky (2003-06-29 11:25) [15]А какая разница, есть там что с завершающим нулем или нет, это не поможет определить размер массива.
А приводить можно и нужно, например для адресной или индексной математики.
← →
jack128 (2003-06-29 13:23) [16]
> Насчет нуля ты не прав, это если тебе повезет
Мне повезло :-))
Я и не говорил, что обезательно будет нуль, я лишь намекнул, что он (нуль) может появиться
← →
Dimaxx (2003-06-30 00:37) [17]2 Anatoly Podgoretsky: Просто я забыл, что массив при инциализации заполнен нулями. Вот поэтому и длина 0. А ты заполни его символами и проверь. Я сам лично писал из Pchar строку на диск и она записалась. Сначал проверь все варианты, а потом спорь (шутка :-)).
var f: file of byte;
p: pchar;
...
p:="abcd";
blockwrite(f,p^,length(p));
...
← →
Dimaxx (2003-06-30 00:40) [18]Да, совсем забыл. Насчет определения размера массива я был не прав. Вернее, не сразу въехал в суть вопроса. Так что, сорри.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c