Форум: "Основная";
Текущий архив: 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.033 c