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

Вниз

PChar   Найти похожие ветки 

 
Metotrone ©   (2002-09-24 17:56) [0]

Есть ли разница между
var SArr:array[0..7] of Char = "Fucking";
и
var PCh:PChar = "Fucking"; ?


 
Kibitzer ©   (2002-09-25 00:14) [1]

Конечно есть разница. Первый вариант статический (т.е. память под переменную выделяет компилятор, а не программа).


 
PVOzerski ©   (2002-09-25 04:02) [2]

1) Оба варианта изначально завязаны на статическую константу. Разницу Вы почувствуете, когда попытаетесь переприсвоить значение переменным: в 1-м случае новое значение окажется по старому адресу, во 2-м - по новому (если работать неграмотно - то запросто и за пределами кучи). Опять же, обратиться к i-му символу по индексу без особых ухищрений в варианте pChar Вы не сможете. Помимо всего, array вовсе не обязан завершаться #0, хотя Delphi и допускает неявное преобразование в pChar при передаче параметром такого массива. Вот иллюстрация возможного глюка (использован D3):

{$apptype console}
var
x:array[0..2]of char="123";
procedure pr(p:pchar);
begin
writeln(p);
end;
begin
pr(x);
end.
У меня этот пример выдал 123Р, т.е. процедура writeln читала всё подряд, начиная с "1", пока случайно после "Р" не наткнулась на #0. Если бы x было полем в record или class, такое преобразование прихватило бы следующую запись. Если бы х была выделена динамически, можно было бы запрсто вылететь за пределы heap.
2) На заметку (чуть оффтопик, но близко и навеяно вопросом): позволив в Delphi опускать "^" перед "[" и "." после ссылочных переменных, Borland, IMHO, внес больше путаницы, чем удобств.
3) к автору вопроса: а поудачнее значение константы придумать не мог? Ведь, поди, и девушки форум посещают...


 
Suntechnic ©   (2002-09-25 05:13) [3]

Kibitzer © (25.09.02 00:14)
Конечно есть разница. Первый вариант статический (т.е. память под переменную выделяет компилятор, а не программа).


Должен Вас разочаровать, что и под второй вариант память тоже выделяет компилятор, а не программа. Такая конструкция называется строковый литерал. И как уже упомянул уважаемый PVOzerski © (25.09.02 04:02) он константный. Ну а чему Вы присвоили адрес строкового литерала это уже дело десятое.

>PVOzerski © (25.09.02 04:02)

Слово "необязан" я бы всё-таки опустил. Теоретически оно то конечно так, но если мы ведём речь о строках, тогда она обязана завершаться 0 иначе будет o-oops о котором вы упомянули.

Опять же, обратиться к i-му символу по индексу без особых ухищрений в варианте pChar Вы не сможете.

Это почему? Я разве не могу так написать?:

SArr[2] := UpCase(PCh[2]);

Другое дело что присвоить значение туда некорректно (строка то константная), но извлечь то какие могут быть проблемы?

P.S. Вот где ностальгия по старому доброму С просыпается. Появился бы такой вопрос на форуме по С, автора бы просто убили :)


 
PVOzerski ©   (2002-09-25 07:02) [4]

2Suntechnic:
вообще-то pChar определен как указатель на Char, а не на массив. Здесь ведь не Си, индексы так просто к указателю абы на что не приложить. Правда, во FreePascal эту сишную фичу ввели, а вот чтобы в Delphi - не слышал (хотя могу и не знать). Я в таких случаях описываю тип-указатель на массив и привожу к нему pChar.


 
Suntechnic ©   (2002-09-25 07:20) [5]

>PVOzerski © (25.09.02 07:02)
Здесь ведь не Си, индексы так просто к указателю абы на что не приложить. Правда, во FreePascal эту сишную фичу ввели, а вот чтобы в Delphi - не слышал (хотя могу и не знать).

А Вы попробуйте ;)

Здесь то может и не С, но null-terminated strings пришли в Delphi именно из C как я подозреваю. Так что я думаю всё что я дальше буду говорить верно для Delphi точно так же как и для C. Ну а гуру и того и другого пусть попробуют меня поправить :)

вообще-то pChar определен как указатель на Char, а не на массив.

Дык в С это и есть одно и тоже с некоторой поправкой. Всё-таки указатель не на массив, а на Char. Указатель на массив char терминами С это есть **. Всё на самом деле просто. Имя массива это и есть указатель на его начало, только константный указатель (заметьте, константный указатель, а не данные, на которые он указывает).

Я в таких случаях описываю тип-указатель на массив и привожу к нему pChar.

Если вы именно делаете так как говорите(не путаете формулировки) то вы по идее должны объявлять указатель на указатель на Char.


 
PVOzerski ©   (2002-09-25 07:35) [6]

D3 cожрал! :^) Хотя, IMHO, это уж очень по-сишному.

{$apptype console}
type
tA=array[0..0]of char;
pA=^tA;
var
p:pChar="123";
begin
writeln(p[0]); //это я попробовал
writeln(pA(p)[0]); //а это - как я делал раньше...
end.



Страницы: 1 вся ветка

Текущий архив: 2002.10.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
1-21032
Alexey3
2002-09-27 10:57
2002.10.07
Имя пользователя


1-21064
kserg@ukr.net
2002-09-27 16:18
2002.10.07
как в форме(окне ) поймать нажатие Ctrl-S ?


14-21243
Namo
2002-09-11 19:37
2002.10.07
Интересно, а как там терракты в Америке, вроде тихо, странно


1-21135
кондратий
2002-09-25 19:10
2002.10.07
почему ???


4-21335
ArhAngel2
2002-08-21 19:25
2002.10.07
Короткий путь