Текущий архив: 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.47 MB
Время: 0.042 c