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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
3-31137
Avreliy
2003-06-14 15:02
2003.07.10
Record already locked by this session


6-31377
LOX
2003-05-04 08:42
2003.07.10
У IE есть журнал а как это замутить в TWebBrowser?


1-31214
Новенький
2003-06-28 17:45
2003.07.10
Опять про файл


1-31215
Mr.Shadow
2003-06-28 22:46
2003.07.10
Огпаничить Доступ


1-31342
sly fox
2003-06-27 12:18
2003.07.10
Люди добрые помогите с fast report?!