PDA

Просмотр полной версии : Конкурс на самый быстрый код!


LAV45
11.11.2010, 20:40
Есть функция
Function GetInt(const ss:string):integer;
var i:byte; tmp:string;
begin
for i := 1 to length(ss) do Insert(IntToHex(ord(ss[i]),2),tmp,i*2);
result := StrToInt('$'+tmp);
end;

//ss = 'cons' = #$63#0 #$6F#0 #$6E#0 #$73#0
//tmp = '636F6E73'
//result = $636F6E73


Реально ли через Move() написать ?

alexteam
11.11.2010, 20:49
Function GetInt(const str:string):integer;
var
Tmp: array[0..4] of byte absolute result;
begin
move(str[1],tmp[3],1);
move(str[2],tmp[2],1);
move(str[3],tmp[1],1);
move(str[4],tmp[0],1);
end;
естественно нужно учитывать что во входящей строке должно быть 4 байта (инт).

xkor
11.11.2010, 21:21
alexteam, типа сделал то что попросили?)
LAV45, вот так будет наиболее быстро и с проверками на размер строки:
function GetInt(const s: string): Integer;
var
r: array[0..3] of Char absolute Result;
i, c: Integer;
begin
Result := 0;
c := Length(s);
if c > 4 then c := 4;
for i := 4 - c to 3 do r[i] := s[4 - i];
end;

alexteam
11.11.2010, 21:31
точна, можно было "оф чар" сделать. и тупо присваивания, не вызывая функцию! :D

LAV45
11.11.2010, 21:59
точна, можно было "оф чар" сделать. и тупо присваивания, не вызывая функцию! :D
Это как ? ))
xkor, с проверкой на длину строки это я погорячился, да и парядок байт менять на обратный не обязательна.

Данная функция нужна для работы со спроками используя case
str := copy(s,idx,4);
case GetInt(str) of
......
end;

вариант с TStringList по моему как-то жирно тут выглядит
str := copy(s,idx,4);
case tag.IndexOf(str) of
......
end;

initialization
tag := TStringList.Create;
tag.CommaText := 'трам,пам ,пам';
finalization
tag.Free;

alexteam
11.11.2010, 22:29
это типо так.
Function GetInt(const str:string):integer;
var
Tmp: array[0..4] of char absolute result;
begin
tmp[3] := srt[1];
tmp[2] := srt[2];
tmp[1] := srt[3];
tmp[0] := srt[4];
end;

LAV45
11.11.2010, 22:59
Всем биг спс ))

ss то у нас #$63#0 #$6F#0 #$6E#0 #$73#0
если использывать Tmp: array[0..3] of char absolute result;
#0 остаются и на выходе получаем $63006F00

Вот так лучше будет
Function GetInt(const ss:string):integer;
var tmp: array[0..3] of byte absolute result;
begin
tmp[3] := ord(ss[1]);
tmp[2] := ord(ss[2]);
tmp[1] := ord(ss[3]);
tmp[0] := ord(ss[4]);
end;

alexteam
12.11.2010, 12:42
и чем оно отличаеццо ? :o

unknowned
12.11.2010, 19:40
и чем оно отличаеццо ? :o

Как думаешь, чем отличается в юникод системе char от байта ?

alexteam
12.11.2010, 19:59
интересно, где ты в коде нашел файдчар\вайдстринг, чтобы такие вопросы задавать.
на входе анси строка.

unknowned
12.11.2010, 20:19
интересно, где ты в коде нашел файдчар\вайдстринг, чтобы такие вопросы задавать.
на входе анси строка.

Я исходил из того, что использует топик стартер, глянь выше:

Всем биг спс ))
ss то у нас #$63#0 #$6F#0 #$6E#0 #$73#0
если использывать Tmp: array[0..3] of char absolute result;
#0 остаются и на выходе получаем $63006F00


Что то на ансистроку тут не похоже.

alexteam
12.11.2010, 20:40
а тут
GetInt(const ss:string)
очень даже похоже.

unknowned
12.11.2010, 21:15
а тут
GetInt(const ss:string)
очень даже похоже.

Совсем не похоже, string совсем даже не AnsiString.

ТруМамко
12.11.2010, 21:32
о самом главном умолчали... какой приз в конкурсе??

xkor
13.11.2010, 00:26
string совсем даже не AnsiStringдо дельфи 2009 именно AnsiString, а на неё и последующие ещё перешли не многие, так что без уточнений подразумеваются более старые версии...

LAV45
13.11.2010, 01:32
о самом главном умолчали... какой приз в конкурсе?? Респект и уважуха ))
до дельфи 2009 именно AnsiString, а ...
Не знал что это важно, но я действительно 2009 юзаю.

unknowned
13.11.2010, 06:19
Респект и уважуха ))

Не знал что это важно, но я действительно 2009 юзаю.

Я то это сразу понял, посмотрев на вот это:

Всем биг спс ))
ss то у нас #$63#0 #$6F#0 #$6E#0 #$73#0
если использывать Tmp: array[0..3] of char absolute result;
#0 остаются и на выходе получаем $63006F00


Другие, видимо, не такие проницательные :)

xkor
13.11.2010, 14:38
unknowned, другие не сочли нужным об этом докладывать...

alexteam
13.11.2010, 17:28
unknowned, http://i.piccy.info/i5/31/25/712531/Bezymiannyi.png
думаю теперь понятно почему я не вижу разницы между 2мя кусками кода.

unknowned
13.11.2010, 21:03
Конечно, то у автора там анси и мне втирали, а то вдруг все увидели юникод, о котором автор сразу дал намек, но никто не обратил внимание. Поздняк метаться :D

alexteam, при чем тут твои картинки мы говорим о авторском дельфях.

Лучше поставьте проверку на длину ss чтобы не было range error в ваших функциях.

LAV45
14.11.2010, 05:15
alexteam, говорят нет придела совершенству ))

Function GetInt(const ss: pointer):integer;
var tmp: array[0..3] of byte absolute result;
sm: array[0..7] of byte;
begin
^sm := ss; // - хз как тут правильно сделать
// используя чуть больше памяти мы ограничиваемся простым переносом
// байт из одного массива в другой
tmp[3] := sm[0];
tmp[2] := sm[2];
tmp[1] := sm[4];
tmp[0] := sm[6];
end;
..........
var ss: string;
begin
ss := 'iden';
case GetInt(pionter(copy(ss,1,4))) of
$6964656E:; // iden
end;
end;

xkor
14.11.2010, 15:19
LAV45, ты вроде говорил что порядок байт тебе не важен, тогда можно без доп функций:
var ss: AnsiString; // хз зачем тебе именно string тут нужен был
begin
ss := 'iden';
case PCardinal(@ss[1])^ of
$6E656469:; // iden
end;
end;

LAV45
14.11.2010, 22:36
xkor the best, ты хочешь сказать самая лудшая функция это её отсутствие )))))) "точняк"
биг спс.

А вообще пака редактировал эту функцию заметил что asm код абсолютно не менялся, по всей видимости мы с компиляторам нашли общий язык и ему что масла масленое, масленое масло, до фонаря.

Редактировать больше нечего, тему можно закрыть.