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

Вниз

Почему нельзя сделать строкой динамический массив ?   Найти похожие ветки 

 
массив   (2004-08-22 04:56) [0]

var
 str : string;
 Arr1 : array[1..6000] of Char;
 Arr2 : array of Char;
begin
 str := Arr1;  // Работает.
 str := Arr2;  // Не работает.


 
массив   (2004-08-22 04:57) [1]

Вернее ...
var
 str : string;
 Arr1 : array[1..6000] of Char;
 Arr2 : array of Char;
begin
 str := Arr1;  // Работает.
 SetLength(Arr2, 6000);
 str := Arr2;  // Не работает.


 
Юрий Зотов ©   (2004-08-22 08:08) [2]

Почему нельзя? Наверное, потому что этого не позволяет компилятор. Уж так его написали.


 
Rouse_ ©   (2004-08-22 16:25) [3]

А что мешает сделать str := String(Arr2); ?


 
TeNY ©   (2004-08-22 16:38) [4]

а потомо что "Лам"<>["Лам","Лам","Лам","Лам","Лам","Лам","Лам",..."Лам"];
так же и 1<>[1,1,1,1,1,...1]
Без всяких почему!Такой уж Pascal язык кривой хотя C++ тоже не пряник но возможностей больше!


 
Rouse_ ©   (2004-08-22 17:50) [5]

> а потомо что "Лам"<>["Лам","Лам","Лам","Лам","Лам","Лам","Лам",..."Лам"];
Чего чего?
Это кто ж тебе даст "Лам" в чаровский массив вставить?

"Лам" = ["Л", "а", "м"];

RTFM


 
Юрий Зотов ©   (2004-08-22 18:19) [6]

> TeNY ©   (22.08.04 16:38) [4]

А почему "кривой"?

В каждом языке есть свои правила. При чем тут "кривизна"?


 
TUser ©   (2004-08-22 19:04) [7]


> Такой уж Pascal язык кривой хотя C++ тоже не пряник но возможностей больше

Интересно, к кому относилось ["Лам","Лам","Лам","Лам","Лам","Лам","Лам",..."Лам"]?
Наверное к Вирту с Борландом, так?


 
массив   (2004-08-23 03:10) [8]


> Rouse_ ©   (22.08.04 16:25) [3]
> А что мешает сделать str := String(Arr2); ?

Так работает. Спасибо.
А почему тогда str := Arr1; проходило ? В чём отличие ?


 
Юрий Зотов ©   (2004-08-23 07:14) [9]

> массив   (23.08.04 03:10) [8]

>> А что мешает сделать str := String(Arr2); ?
> Так работает. Спасибо.

Ох, не уверен я что это работает именно так, как должно работать. Имеется в виду управление счетчиком ссылок. Надо бы проверить, иначе есть непохой шанс нарваться на чудеса с памятью.


 
jack128 ©   (2004-08-23 07:42) [10]


> >> А что мешает сделать str := String(Arr2); ?
> > Так работает. Спасибо.
>
> Ох, не уверен я что это работает именно так, как должно
> работать. Имеется в виду управление счетчиком ссылок.
На самом деле это проблема обходится очень просто  str := PChar(Arr2);


 
Юрий Зотов ©   (2004-08-23 08:40) [11]

> jack128 ©   (23.08.04 07:42) [10]

И это увеличит счетчик ссылок на Arr2?


 
Kerk ©   (2004-08-23 08:55) [12]


> Юрий Зотов ©   (23.08.04 08:40) [11]
> > jack128 ©   (23.08.04 07:42) [10]
>
> И это увеличит счетчик ссылок на Arr2?

Нет. В str будет копия.


 
Юрий Зотов ©   (2004-08-24 11:55) [13]

> Kerk ©   (23.08.04 08:55) [12]

Что копия - это понятно. Вот только копия ЧЕГО - адреса массива или его тела? В этом вся суть и есть.

IMHO, скопируется адрес. И тогда совершенно реальна такая ситуация - точка выполнения кода выходит из области видимости массива, тот автоматически уничтожается и строка начинает указывать в никуда. После чего при обращении к ней будем иметь Access Violation.


 
DiamondShark ©   (2004-08-24 12:57) [14]

Нельзя так.
Вызывается @LStrFromPChar.
А она не обращает внимания на длину массива, а только ищет #0 символ.

Трудноуловимые проблемы гарантированы.


 
Kerk ©   (2004-08-24 14:04) [15]


> Юрий Зотов ©   (24.08.04 11:55) [13]
> > Kerk ©   (23.08.04 08:55) [12]
>
> Что копия - это понятно. Вот только копия ЧЕГО - адреса
> массива или его тела? В этом вся суть и есть.

Тела. Однозначно. Можешь проверить.
var
 s: string;
 p: PChar; // в исходном куске было приведение типа
begin
 p := "test";
 s := p;
 p := "failed";
 ShowMessage(s);
end;


 
Юрий Зотов ©   (2004-08-24 15:08) [16]

> Kerk ©   (24.08.04 14:04) [15]

Что ж, проверил.


procedure TForm1.FormCreate(Sender: TObject);
begin
 SetLength(A, 4);
 A[0] := "a";
 A[1] := "b";
 A[2] := "c";
 A[3] := #0;
 S1 := PChar(A);
 S2 := String(A);
 A[0] := "0";
 A[1] := "1";
 A[2] := "2";
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := S1 // Получаем "abc"
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Caption := S2 // Получаем "012"
end;


Таким образом, в случае S := PChar(A) создается копия тела (но чтобы все было правильно, массив, естественно, должен завершаться элементом с нулевым символом, как и положено ASCIIZ-строке).

А вот в случае S := String(A) создается копия адреса.


 
Kerk ©   (2004-08-24 15:20) [17]


> Таким образом, в случае S := PChar(A) создается копия тела

Об этом я и говорил. :)


 
Chlavik ©   (2004-08-24 17:30) [18]

SetString ?


 
Anatoly Podgoretsky ©   (2004-08-24 17:41) [19]

Kerk ©   (24.08.04 15:20) [17]
А как же могло быть иначе, поскольку присвается PChar строке, а PChar никаких управляющих структур не имеет. Поэтому и будет сделана нормальная, рабочая копия, с которой можно безопасно работать, в отличии от string(a), как это продемонстрировал Юрий Зотов ©   (24.08.04 15:08) [16]



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

Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.053 c
1-1093240722
[BAD]Angel
2004-08-23 09:58
2004.09.12
Как вывести текст на рабочий стол чтобы он не затирался окнами?


3-1092751996
Вика
2004-08-17 18:13
2004.09.12
Помогите с SQL 2


14-1093385158
ИМХО
2004-08-25 02:05
2004.09.12
Кто работал с Lotus Notes?


4-1091175026
Andriy Tysh
2004-07-30 12:10
2004.09.12
Включён ли "принтер по умолчанию"?


14-1093088582
YurikGL
2004-08-21 15:43
2004.09.12
16 цветов





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