Просмотр полной версии : Глупый вопрос по лпх.
Пишу ReadD(10), он мне выдает отрицательное число. Как сделать, чтобы он читал его как беззнаковое, что-то вроде типа LongWord (0-4294967295). Или как его сконвертировать в этот тип? Лпх не знает тип LongWord.
Мне нужно это 4х байтовое число вывести в чат.
Добавлено через 22 минуты
Я так понял, что ReadD возвращает 4 байта со знаком. А мне надо без знака. Есть ли такая фунция в лпх или каким образом можно достич нужного результата?
Ненене, мне не модуль нужен. Нужен тип 4 байта без знака. Только я хз как он обзывается в лпх. И есть ли такой вообще.
Если нету, придется делать через инт64 ручным преобразованием.
alexteam
28.05.2010, 18:55
Cardinal
Cardinal
Сделал так:
var z:Cardinal
s:String;
z:=ReadD(10);
s:=inttostr(z);
все равно в s хранится отрицательное число. Что не так делаю?
alexteam
28.05.2010, 19:01
readd возвращает инт.
в фастскрипте все на вариант типах. ему сугубо пофиг как ты обявишь то куда ты хочеш положить результат readd.
хоть байтом обзови. варианту пофик.
хочешь добиться того чего надо - читай все 4 байта через readb
и преобразуй их в кардинал вручную.
Только я понять не могу, почему в целое число без знака функцией ReadD вносится отрицательное число. Или в IntToStr косяк?
alexteam
28.05.2010, 19:04
предыдущую мессагу прочитай. поймешь.
Добавлено через 30 секунд
твой код равнозначен
var z:variant;
s:variant;
z:=ReadD(10);
s:=inttostr(z);
readd возвращает инт.
в фастскрипте все на вариант типах. ему сугубо пофиг как ты обявишь то куда ты хочеш положить результат readd.
хоть байтом обзови. варианту пофик.
хочешь добиться того чего надо - читай все 4 байта через readb
и преобразуй их в кардинал вручную.
Думал можно как то легче. Значит будем делать функцию ReadCrd...
А может через жопу получится? :)
Максимальное значение integer плюс то что "не влезло" в переменную.
var
z:Cardinal;
z:=2147483647+abs(ReadD(10));
зы: я понимаю что если число может быть в 2-5 раз больше чем 2ккк и тогда это не сработает, но если оно только немного больше ... :)
А может через жопу получится? :)
Максимальное значение 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 байтами?
Пробовал делать возвращаемое значение тип Cardinal. Но когда пытаешься преобразовать в строку через IntToStr, то опять получается отрицательное число.
Код кривой, из-за использования 8 байт вместо 4. Можно ли как то обойтись 4 байтами?
Добавь, что тебе нужно в пакетхак. Исходники открыты.
Это не часто используемая функция, переделывать изза этого лпх неохота =)
var A : Cardinal;
B : integer;
begin
A:=0;
B:= -12345;
A := Cardinal(B);
end;
Как я понял нужно конвертировать ЦЕЛЫЙ знаковый тип в ЦЕЛЫЙ без знаковый тип?
Но боюсь в фастскрипт не поддерживает.
alexteam
28.05.2010, 23:02
Это не часто используемая функция, переделывать изза этого лпх неохота
нипакериш. ты первый на моей памяти кому это понадобилось.
vBulletin® v3.6.11, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot