Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прямое приведение [D7, WinXP]


Vladimir888 ©   (2007-06-23 08:14:00) 

В программе надо менять различным образом элементы массива(в данном случае элементы типа 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.


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

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


Anatoly Podgoretsky   (2007-06-25 19:25:00) [2]

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

Вариант 2


Kolan   (2007-06-25 19:09:00) [3]

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

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

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


Anatoly Podgoretsky   (2007-06-25 18:49:00) [4]

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


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


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

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


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

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


Anatoly Podgoretsky   (2007-06-23 12:17:00) [7]

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


LamerV   (2007-06-23 11:48:00) [8]

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


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

Нельзя приводить 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- почитайте, очень хорошая статья...


Наверх

Титульная страница Поиск, карта сайта Написать письмо