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

Вниз

Прямое приведение   Найти похожие ветки 

 
Vladimir888   (2007-06-23 08:14) [0]

В программе надо менять различным образом элементы массива(в данном случае элементы типа Char), и выводить на экран только те которые до этого не выводились. Чтобы не перечислять в цикле элементы массива, преобразование в строку происходит следующим образом: result_str:=  string(a);. Но при выполнении метода: strs.IndexOf(result_str), -1 возвращается только первый раз, все остальные разы возвращается 0, хотя буквы в строке result_str разные(проверено дебаггером). В случае конкатенации символов (result_str:= a[0] + a[1] + ... + a[n]) IndexOf начинает работать правильно. Объясните пожалуйста что конкретно происходит при выполнении result_str:=  string(a);, чем это отличается от result_str:= a[0] + a[1] + ... + a[n], и почему в первом случае IndexOf работает неверно.

type
 arr = array of Char;

// Процедура работает неверно!!!
procedure RandBroute(a: arr);
var
 tmp: Char;
 i: Byte;
 strs: TStringList;
 result_str: string;
 k: Integer;
begin
 strs:= TStringList.Create;
 for k := 0 to 10000 do
 begin
   result_str:=  string(a); // Проблема заключается здесь
   //result_str:=  a[0] + a[1] + a[2]; // Если сделать так то всё работает как задумано
   if strs.IndexOf(result_str) = -1 then // а здесь проблема проявляется
   begin
     Writeln(result_str);
     strs.Add(result_str);
   end;
   i:= Random(Length(a));
   tmp:= a[0];
   a[0]:= a[i];
   a[i]:= tmp;
 end;
 strs.Free;
end;

//глобальные переменные
var
 Symbols: arr;
 str: string absolute Symbols;

begin
 { TODO -oUser -cConsole Main : Insert code here }
 str:= "abc";
 Randomize;
 RandBroute(Symbols);
 Readln;
end.


 
Однокамушкин   (2007-06-23 09:32) [1]

Нельзя приводить array of Char к string-у, вы получаете указатель, про который компилятор думает, что это указатель на строку, а на самом деле это указатель на массив, и из-за этого лезут всякие глюки... а вот при посимвольном добалении компилятор обеспечивает, чтобы в памяти была корректная строка...

Если очень нужна скорость, можно написать так:

SeltLength(resutl_str, Length(a));
Move(a[0], result_str[1], Length(result_str));


Это будет оптимальнее и с точки зрения фрагментирования динамической памяти, потому что память будет выделяться один раз, а не много-много кусками всё большего размера...

http://www.rsdn.ru/article/Delphi/dynarrays.xml - почитайте, очень хорошая статья...


 
LamerV ©   (2007-06-23 11:48) [2]

Можно ещё так, по идее так тоже для строки отдельно память выделяется:
result_str:= PChar(a);, по скорости это наверное будет как в приведённом вами примере, а писать гораздо меньше.


 
Anatoly Podgoretsky ©   (2007-06-23 12:17) [3]

Дело даже не в скорости, использование MOVE грозит ошибками и проблемаи в .NET
Это полностью неконтролируемая работа с указателями.


 
Vladimir888   (2007-06-25 17:54) [4]

Причём тут .NET, приложение полностью пишется под Win32.


 
Правильный Вася   (2007-06-25 18:34) [5]


> Причём тут .NET, приложение полностью пишется под Win32.

а привычки сохраняются надолго


 
Anatoly Podgoretsky ©   (2007-06-25 18:49) [6]

Vladimir888   (25.06.07 17:54) [4]
Соединительный союз И видишь?


 
Kolan ©   (2007-06-25 19:09) [7]

> Соединительный союз И видишь?

Ну написаное вами можно читать поразному:
1.
использование MOVE грозит ошибками, проблемами, и все это в NET

2.
использование MOVE грозит ошибками, да еще и проблемами в .NET


 
Anatoly Podgoretsky ©   (2007-06-25 19:25) [8]

> Kolan  (25.06.2007 19:09:07)  [7]

Вариант 2


 
Vladimir888   (2007-06-28 19:46) [9]

Программирование под .NET очень сильно отличается от Win32, и под дотнет предпочитаю писать на шарпе, а покрайней мере там никаких мувов недопускается, пока конкретно непометиш что эта область usafe.



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

Текущий архив: 2007.07.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
3-1177055878
Saro
2007-04-20 11:57
2007.07.22
!!! Вывод графики в DBGrid !!!!


2-1182512512
Manur
2007-06-22 15:41
2007.07.22
Количество Image


15-1182634180
Tirael
2007-06-24 01:29
2007.07.22
VS 7 и VS .net - это одно и тоже?


15-1182516393
Muhhh
2007-06-22 16:46
2007.07.22
Как писать на делфи под КПК?


15-1182576092
KilkennyCat
2007-06-23 09:21
2007.07.22
Как убить продукт, или о бесплатном ПО