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

Вниз

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

 
массив   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
1-1093531412
ASMiD
2004-08-26 18:43
2004.09.12
Построение сглаженных графиков


14-1092813816
Knight
2004-08-18 11:23
2004.09.12
Экспедиция закончилась...


14-1093340593
NikotiN
2004-08-24 13:43
2004.09.12
Алгоритм сортировки


14-1092983461
Dimka Maslov
2004-08-20 10:31
2004.09.12
Юридическая задача


6-1089292828
Flash
2004-07-08 17:20
2004.09.12
Генерация e-mail. Help!