Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.43.206] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем хай! Сходу к делу!
Есть КОНСОЛЬНОЕ приложение в ДЕЛЬФИ 7, в котором сортируется динамический одномерный массив типа данных variant: type TVector = array of variant; // сортировка вставками procedure InsertSort(pv: TVector); var i, j: word; tmp: variant; begin for i := 1 to high(pv) do begin writeln('i = ', i); tmp := pv[i]; j := i; while((j > 0) and (tmp < pv[j - 1])) do // ВНИМАНИЕ! тип данных приводить НЕ НУЖНО, сам дельф все понимает... begin pv[j] := pv[j - 1]; j := j - 1; end; pv[j] := tmp; end; end; Решил сделать то же самое под Windows Forms на Дельфи Берлин в Рад студии и получал массу проблем 1) сортировка сразу перестала работать. Как я понял, чтобы сравнение было ЧИСЕЛ, нужно писать так: StrToInt(VarToStr(tmp)) < ... 2) для сортировки строк НИКАК не получается настроить. перебровал: 1. VarToStr - не работает 2. VarToWideStr - не работает 3. Через CompareStr - неработает 4. Через AnsiCompareStr - не работает и постоянно одна и та же ошибка (см. прил. файл) Прикреплённый файлVariant.png (39,02 Кбайт, скачиваний: 486) т е в консольном дельфи 7 все работало ШИКАРНО без единого кастования в тип данных, а в РАД СТУДИИ БЕРЛИН 10.1 строки не получается настроить. подскажите, как быть то? |
Сообщ.
#2
,
|
|
|
И тебе ХАЙ! Насчёт Берлина (и где ты его снял) - не в курсе. Но у любого VARIANT есть нюансы типа AsInt, AsString... Сорри , я щяс на даче, все возможности Дельфи Берлин в Рад студии мне недоступны.
|
Сообщ.
#3
,
|
|
|
Цитата FasterHarder @ для сортировки строк НИКАК не получается настроить. А как ты вызываешь для сортировки строк на D7? |
Сообщ.
#4
,
|
|
|
Цитата ^D^ima @ D7? в смысле? D7 - ячейка в шахматах! или ты про запуска приложения из студии? Если да, то я кликаю по зелененькой стрелочке)) и прожка компилится, а потом запускается я считаю, что дело в НАСТРОЙКАХ среды РАД СТУДИИ, КОМПИЛЛЕРА и еще чего, т к В ДЕЛЬФИ 7.0 все работает лучше, чем прекрасно... Добавлено Среди всех дельфи, самая лучшая и стабильная версия 7.0? да/нет... |
Сообщ.
#5
,
|
|
|
Цитата FasterHarder @ в смысле? D7 - ячейка в шахматах! именно! У меня все работает что в 7-ке, что в 10 берлине. Я поэтому и пишу, приведи код целиком |
Сообщ.
#6
,
|
|
|
Цитата ^D^ima @ приведи код целиком так, ээээ вот он выше и есть.... type TVector = array of variant; // сортировка вставками procedure InsertSort(pv: TVector); var i, j: word; tmp: variant; begin for i := 1 to high(pv) do begin //writeln('i = ', i); tmp := pv[i]; j := i; while((j > 0) and (tmp < pv[j - 1])) do // РАД СТУДИЯ тут начинает материться непонятно из-за чего.. begin pv[j] := pv[j - 1]; j := j - 1; end; pv[j] := tmp; end; end; я проверял, что до вызова сортировки данные правильно заносятся в вектор, поэтому проблема именно внутрях сортира InsertSort( что делать?... Добавлено и в конце сортировку разбил на две части: // pflag: 0 - integer; 1 - string procedure InsertSort(pv: TVector; pflag: byte); var i, j: word; tmp: variant; begin for i := 1 to high(pv) do begin tmp := pv[i]; j := i; if(pflag = 0) then // sorting as integer while((j > 0) and (StrToInt(VarToStr(tmp)) < StrToInt(VarToStr(pv[j - 1])))) do begin pv[j] := pv[j - 1]; j := j - 1; end else // sorting as string begin while((j > 0) and (VarToStr(tmp) < VarToStr(pv[j - 1]))) do begin pv[j] := pv[j - 1]; j := j - 1; end; end; pv[j] := tmp; end; end; целые сортирует идеально, но строках RUN TIME ERROR!! |
Сообщ.
#7
,
|
|
|
System.Variants.VarCompareValue
? |
Сообщ.
#8
,
|
|
|
Цитата Chow @ System.Variants.VarCompareValue так, а что является результатом этой функции? т е писать нужно так: while((j > 0) and (System.Variant.varCompareVal(tmp, pv[j - 1]) ????) do посмотрел справку, там тип лютый TVariantRelationship |
Сообщ.
#9
,
|
|
|
Цитата FasterHarder @ так, ээээ вот он выше и есть.... Код перед вызовом самой процедуры. Ещё раз - у меня без модификации на 10 берлине твой код работает. Для чисел и для строк |
Сообщ.
#10
,
|
|
|
Цитата FasterHarder @ посмотрел справку, там тип лютый TVariantRelationship Обычное перечисление. Какие проблемы? TVariantRelationship = (vrEqual, vrLessThan, vrGreaterThan, vrNotEqual); |
Сообщ.
#11
,
|
|
|
ChowChow, понятно, попробую, когда Берлин будет под рукой. КАк понял им соот-ют целочисленные значения, наверное...
Chow, а почему такое требуется в Берлине, в Дельфях 7 все прекрасно? какие-то настройки или компиллер стал СТРОЖЕ к преобразованиям?! |
Сообщ.
#12
,
|
|
|
Цитата Chow @ System.Variants.VarCompareValue ? проверил - не помогло! |
Сообщ.
#13
,
|
|
|
10.1, код из #1 компилится без всяких вопросов на гуй приложении.
|
Сообщ.
#14
,
|
|
|
Fr0sT, компилится то компилится, но работает ли?
У автора проблема в том, что алгоритм заточен на то, что все Варианты в массиве - чисельные (Variants.VarIsNumeric(value) - всегда true). Он смело их приводит "индусским" способом (через строку) к целому (StrToInt(VarToStr(tmp)), и так их сравнивает для сортировки. Но стоит лишь "закрасться" в массив значению, которое к числу не приводится - вылетает исключение. |
Сообщ.
#15
,
|
|
|
Chow, т.к. автор не дал полностью готового кода, в работе я его естессно не проверял - мне еще обвязку для него писать, что ли?
Вообще код хоть и корявый, но по идее должен работать. Т.к. в любом variant содержится тип его данных, соответственно сравнение выполняется для этого типа Добавлено А ошибка в первом посте скорее всего потому, что какой-то из элементов числовой, а какой-то строковый |