Главная страница
    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.033 c
3-1092755538
eXXX
2004-08-17 19:12
2004.09.12
Кто нить юзал DevExpress Grid4


1-1093598663
Mim1
2004-08-27 13:24
2004.09.12
Использование графики в формате Jpeg в CLX


1-1093617952
NeVIP
2004-08-27 18:45
2004.09.12
TCustomDockForm.Caption:= ???????


3-1092489470
SDV_fox
2004-08-14 17:17
2004.09.12
Помогите найти толковую доку или обучалку по продуктам DevExpress


1-1093558168
kukun
2004-08-27 02:09
2004.09.12
Самостоятельное программирование операторов div и mod.





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