Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
1-21002
mmb
2002-09-23 14:26
2002.10.07
работает ли кого-нибудь D6 под W2k на Athlon+ и если да то как?


4-21315
SergeySA
2002-08-20 12:50
2002.10.07
Кто скажет как вывести подсказку (hint) в любом месте экрана.


1-21039
Fast
2002-09-27 11:15
2002.10.07
Неявное сравнение строк


7-21279
maxim2
2002-07-28 18:08
2002.10.07
Как узнать координаты всех иконок на раб.столе


6-21179
Monak
2002-07-03 19:55
2002.10.07
Ошибки на сокетах!





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