Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.046 c
15-1182492854
kert
2007-06-22 10:14
2007.07.22
Хочу установить


2-1182862205
Krants
2007-06-26 16:50
2007.07.22
SQL, удалить индексированое поле


4-1170672620
vlad2
2007-02-05 13:50
2007.07.22
Размещение в памяти больших массивов


1-1179163372
Kolan
2007-05-14 21:22
2007.07.22
Управление доступностью кнопок, как организовать?


15-1182611550
Nic
2007-06-23 19:12
2007.07.22
К примеру, написана книга





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