Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-31480
pusrg
2003-06-20 13:14
2003.07.10
Киевское


3-31163
Step[B.M.]
2003-06-19 09:04
2003.07.10
Снова об ADO и Excel


7-31547
BaDeVlad
2003-03-25 14:07
2003.07.10
Свернуть все окна


1-31190
Lex
2003-06-28 11:18
2003.07.10
Как отключить клавишу


6-31382
Zelius
2003-04-29 17:28
2003.07.10
Можно ли заставить TIdTCPConnection сообщать о приходе данных?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский