![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать case для строк в 4 символа? [D7]
Оптим © (2006-02-16 02:59:00)Ведь Integer - это тоже 4 байта, значит как то можно преобразовать строку в интегер, и делать ему case. Или нельзя?
Вот так Integer('test'): - не получается. А как правильно?
Defunct (2006-02-18 03:32:00) [21]Оптим (18.02.06 02:02) [14]
без констант нельзя, оператор case к сожалению только с константами "оперирует".
может быть имеет смысл вашу задачу решать по-другому?
Например, взять TStringList, засунуть в него строки и ссылки, далее искать строку уже в списке - при совпадении пользоваться ссылкой или индексом строки...
Оптим (2006-02-18 02:02:00) [22]> Leonid Troyanovsky © (16.02.06 09:27) [9]
А можно сделать тоже самое, только без констант, а то с ними не удобно как то.
Плохиш (2006-02-16 11:11:00) [23]И после wsego этого они смеют кричать, что вындов - глючный маст дай :-)
evvcom (2006-02-16 09:49:00) [24]
> palva © (16.02.06 09:47) [11]
Угу, и всякий раз, когда решишь изменить 1 символ, будешь брать в руки "железного Феликса"?
palva (2006-02-16 09:47:00) [25]Можно не преобразовывать:
{$APPTYPE CONSOLE}
var
s: String[7];
si: LongInt absolute s;
procedure c;
begin
case si of
1163350277:
WriteLn('case1');
1685283078:
WriteLn('case2');
else
WriteLn('nocase')
end;
end;
begin
s := 'QWERT';
c; // case1
s := 'asdfgh';
c; // case2
s := '';
c; // nocase
end.
Только придется составить словарь: значение строки и соответствующее этому значению число, которое требуется для case.
evvcom (2006-02-16 09:36:00) [26]
> КаПиБаРа © (16.02.06 07:03) [6]
> @'test'[1] - адрес первого символа, то биш 't'
> (@'test'[1])^ - значение по указанному выше адресу
Для лучшего понимания надо добавить строку:
PLongint(@'test'[1]) - приведение к указателю на Longint, т.е. указателю на 4-байтовое целое. А уж потом разадресация: PLongint(@'test'[1])^. См. [9].
Хотя, конечно, в [3] ответ немного иной и интуитивно непонятный.
Leonid Troyanovsky (2006-02-16 09:27:00) [27]
> Оптим (16.02.06 02:59)
> Ведь Integer - это тоже 4 байта, значит как то можно преобразовать
> строку в интегер, и делать ему case. Или нельзя?
procedure TForm1.Button1Click(Sender: TObject);
const
c1 = $1* Ord('E')+
$100* Ord('d')+
$10000* Ord('i')+
$1000000* Ord('t'); // Edit
c2 = $1* Ord('T')+
$100* Ord('e')+
$10000* Ord('s')+
$1000000* Ord('t'); // Test
begin
case PLongint(PChar(copy(Edit1.Text,1,4)))^ of
c1:
ShowMessage('Edit');
c2:
ShowMessage('Test');
end;
end;
--
Regards, LVT.
КаПиБаРа (2006-02-16 07:22:00) [28]Попробуй разобраться в этом
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
i: Integer;
begin
s := 'Test';
Memo1.Lines.Add('Первый символ ' + s[1]);
Memo1.Lines.Add('Адрес первого символа ' + IntToStr(Dword(@s[1])));
Memo1.Lines.Add('Значение хранящееся по этому адресу ' + IntToStr(Dword((@s[1])^)));
Memo1.Lines.Add('Это же значение в 16-ричном виде ' + IntToHex(Dword((@s[1])^), 6));
Memo1.Lines.Add('Или по символам первый ' + Char((@s[1])^));
Memo1.Lines.Add('Или по символам второй ' + Char((@s[2])^));
Memo1.Lines.Add('Или по символам третий ' + Char((@s[3])^));
Memo1.Lines.Add('Или по символам четвертый ' + Char((@s[4])^));
end;
Оптим (2006-02-16 07:06:00) [29]> (@'test'[1])^ - значение по указанному выше адресу
А сам адрес разве не значит что по указанному адресу? Или что он тогда значит?
КаПиБаРа (2006-02-16 07:03:00) [30]Оптим (16.02.06 6:51) [5]
'test'[1] - первый элемент массива символов 'test' тоесть 't'
@'test'[1] - адрес первого символа, то биш 't'
(@'test'[1])^ - значение по указанному выше адресу
см F1 - Overview of pointers
Оптим (2006-02-16 06:51:00) [31]> i := Integer((@'test'[1])^);
А можно для начинающих расшифровать эту запись?
'test'[1] - почему это с цифрой 1?
@'test'[1] - это мы берём адрес, да?
(@'test'[1])^ - это мы чего делаем с адресом? ...
Zeqfreed (2006-02-16 06:11:00) [32]Не стоит так извращаться.
Жуков Олег (2006-02-16 05:36:00) [33]В число:
i := Integer((@'test'[1])^);
и обратно в строку:
SetLength(s, 4);
Integer((@s[1])^) := 1953719668;
Наблюдение (2006-02-16 03:35:00) [34]Если бы сюда зашёл дурак, то он бы тоже не понял.
Германн (2006-02-16 03:20:00) [35]Суть смысла и смысл сути вопроса не понятен абсолютно!