PDA

Просмотр полной версии : Глупый вопрос по лпх.


guplen
28.05.2010, 18:29
Пишу ReadD(10), он мне выдает отрицательное число. Как сделать, чтобы он читал его как беззнаковое, что-то вроде типа LongWord (0-4294967295). Или как его сконвертировать в этот тип? Лпх не знает тип LongWord.

Мне нужно это 4х байтовое число вывести в чат.

Добавлено через 22 минуты
Я так понял, что ReadD возвращает 4 байта со знаком. А мне надо без знака. Есть ли такая фунция в лпх или каким образом можно достич нужного результата?

J-Fobos
28.05.2010, 18:50
abs(); не подойдет?

guplen
28.05.2010, 18:52
Ненене, мне не модуль нужен. Нужен тип 4 байта без знака. Только я хз как он обзывается в лпх. И есть ли такой вообще.
Если нету, придется делать через инт64 ручным преобразованием.

alexteam
28.05.2010, 18:55
Cardinal

guplen
28.05.2010, 18:58
Cardinal

Сделал так:
var z:Cardinal
s:String;

z:=ReadD(10);
s:=inttostr(z);

все равно в s хранится отрицательное число. Что не так делаю?

alexteam
28.05.2010, 19:01
readd возвращает инт.
в фастскрипте все на вариант типах. ему сугубо пофиг как ты обявишь то куда ты хочеш положить результат readd.
хоть байтом обзови. варианту пофик.
хочешь добиться того чего надо - читай все 4 байта через readb
и преобразуй их в кардинал вручную.

guplen
28.05.2010, 19:02
Только я понять не могу, почему в целое число без знака функцией ReadD вносится отрицательное число. Или в IntToStr косяк?

alexteam
28.05.2010, 19:04
предыдущую мессагу прочитай. поймешь.

Добавлено через 30 секунд
твой код равнозначен
var z:variant;
s:variant;

z:=ReadD(10);
s:=inttostr(z);

guplen
28.05.2010, 19:05
readd возвращает инт.
в фастскрипте все на вариант типах. ему сугубо пофиг как ты обявишь то куда ты хочеш положить результат readd.
хоть байтом обзови. варианту пофик.
хочешь добиться того чего надо - читай все 4 байта через readb
и преобразуй их в кардинал вручную.

Думал можно как то легче. Значит будем делать функцию ReadCrd...

J-Fobos
28.05.2010, 19:21
А может через жопу получится? :)
Максимальное значение integer плюс то что "не влезло" в переменную.
var
z:Cardinal;


z:=2147483647+abs(ReadD(10));


зы: я понимаю что если число может быть в 2-5 раз больше чем 2ккк и тогда это не сработает, но если оно только немного больше ... :)

guplen
28.05.2010, 19:25
А может через жопу получится? :)
Максимальное значение integer плюс то что "не влезло" в переменную.
var
z:Cardinal;


z:=2147483647+abs(ReadD(10));

Не, это не то...
Я сделал вот так, через Int64:

function ReadX(index:integer):int64;
var
s:String;
begin
s:=pck[index+3]+pck[index+2]+pck[index+1]+pck[index];
s:='$'+StrToHex(s);
Result:=StrToInt64(s);
end;

Пробовал делать возвращаемое значение тип Cardinal. Но когда пытаешься преобразовать в строку через IntToStr, то опять получается отрицательное число.
Код кривой, из-за использования 8 байт вместо 4. Можно ли как то обойтись 4 байтами?

NLObP
28.05.2010, 21:22
Пробовал делать возвращаемое значение тип Cardinal. Но когда пытаешься преобразовать в строку через IntToStr, то опять получается отрицательное число.
Код кривой, из-за использования 8 байт вместо 4. Можно ли как то обойтись 4 байтами?

Добавь, что тебе нужно в пакетхак. Исходники открыты.

guplen
28.05.2010, 22:12
Это не часто используемая функция, переделывать изза этого лпх неохота =)

Xen
28.05.2010, 22:46
var A : Cardinal;
B : integer;
begin
A:=0;
B:= -12345;

A := Cardinal(B);

end;

Как я понял нужно конвертировать ЦЕЛЫЙ знаковый тип в ЦЕЛЫЙ без знаковый тип?
Но боюсь в фастскрипт не поддерживает.

alexteam
28.05.2010, 23:02
Это не часто используемая функция, переделывать изза этого лпх неохота
нипакериш. ты первый на моей памяти кому это понадобилось.