Форум: "Начинающим";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
ВнизПеревод типов на API Найти похожие ветки
← →
Dmitry_177 (2006-11-02 14:14) [0]Как можно на API перевести тип Integer в PChar или String и обратно? Т.е. не использовать функции IntToStr и StrToInt из модуля SysUtils. Можно конечно скопировать их от туда, но может есть еще какойнибудь способ получше?
← →
RWolf © (2006-11-02 14:17) [1]написать свою - дело пары минут.
← →
Сергей М. © (2006-11-02 14:17) [2]
> Dmitry_177 (02.11.06 14:14)
> перевести тип
Галиматья.
← →
Anatoly Podgoretsky © (2006-11-02 14:17) [3]PChar(Integer) но я бы не рискнул так делать, и тем более String(Integer)
← →
Dmitry_177 (2006-11-02 14:20) [4]RWolf, я бы написал, только в какую сторону копать?
Anatoly Podgoretsky, я об этом думал, а почему этот способ не очень?
← →
Gero © (2006-11-02 14:23) [5]Str, Val
← →
Gero © (2006-11-02 14:24) [6]> [4] Dmitry_177 (02.11.06 14:20)
> Anatoly Podgoretsky, я об этом думал, а почему этот способ
> не очень?
Попробуй, узнашь, почему «не очень».
← →
Anatoly Podgoretsky © (2006-11-02 14:29) [7]
> Anatoly Podgoretsky, я об этом думал, а почему этот способ
> не очень?
Потому что для Integer/PChar это нормальное явление, особенно для API (именно так передавались PChar строки/целые в Win3.11, что передалось определялось по смещению), это простые типы, то для строкие нет, это сложная, динамическая структура.
← →
sniknik © (2006-11-02 14:32) [8]Anatoly Podgoretsky © (02.11.06 14:17) [3]
ну это же не перевод, а приведение типа, выдача одного за другое. не совсем то о чем вопрос.
Dmitry_177 (02.11.06 14:14)
и кстати, типа String на API нету, это уж скорее класс (как в C bstr, только посложнее) чем тип.
← →
Dmitry_177 (2006-11-02 14:33) [9]Label1.Caption := PChar(10020);
Попробовал, компилируется, но при переводе вылетает ошибка AV...
← →
Anatoly Podgoretsky © (2006-11-02 14:36) [10]> sniknik (02.11.2006 14:32:08) [8]
Попросил бы перевод в строкое представление, то и ответ бы был другой, там
элементарный цикл и две операции / и MOD и один оператор сравнения.
← →
Anatoly Podgoretsky © (2006-11-02 14:37) [11]Так вопрос криво поставлен. Integer смело можно перевести в PChar и обратно, одно число в 4 байта, второе указатель, тоже в 4 байта. String хоть и указатель, но на сложную структуру, управляемую помимо программиста.
← →
sniknik © (2006-11-02 14:37) [12]> но при переводе вылетает ошибка AV...
правильно вылетает, ты из числа сделал указатель на zтерминированную строку, но этот указатель указывает в никуда/область для программы закрытую, а вовсе не на строку с нулем в конце.
← →
Dmitry_177 (2006-11-02 14:43) [13]Подскажите, а как тогда число перевести в строковое представление и обратно?
← →
Dmitry_177 (2006-11-02 14:50) [14]я имел ввиду как сказал Anatoly Podgoretsky,
> тамэлементарный цикл и две операции / и MOD и один оператор
> сравнения.
← →
Сергей М. © (2006-11-02 15:01) [15]
> Dmitry_177 (02.11.06 14:43) [13]
>
> Подскажите, а как тогда число перевести в строковое представление
> и обратно?
Пример:
Chislo: Integer = 1234;
StrokovoyePredstavlenieChicla: String;
...
StrokovoyePredstavlenieChicla := IntToStr(Chislo); //нате вам строковое представление числа, хранящегося в переменной Chislo, в десятичном виде.
?
← →
Gloomer © (2006-11-02 15:01) [16]>[13] Так чем же тебе не нравятся стандартные IntToStr и StrToInt???
← →
DevilDevil © (2006-11-02 15:06) [17]Непонятно, честно говоря, что нужно автору топика. Тем не менее:
{------------------------------------------------------------------}
function MyIntToStr(X : Int64) : string;
begin
Str(X, Result);
end;
{------------------------------------------------------------------}
function MyFloatToStr(X : Extended) : string;
begin
Str(X:0:2, Result);
end;
{------------------------------------------------------------------}
function MyStrToInt(const S : string; Def : integer = 0) : Integer;
var Code, I : integer;
begin
{$R-}
Val(S, I, Code);
if Code <> 0 then Result := Def
else Result := I;
{$R+}
end;
{------------------------------------------------------------------}
function MyStrToFloat(const S : string; Def : Extended = 0) : Extended;
var Code : integer; F : Extended;
begin
{$R-}
Val(S, F, Code);
if Code <> 0 then Result := Def
else
Result := F;
{$R+}
end;
{------------------------------------------------------------------}
← →
sniknik © (2006-11-02 15:54) [18]Сергей М. © (02.11.06 15:01) [15]
DevilDevil © (02.11.06 15:06) [17]
строка как уже говорилось не совсем тип, и уж не API точно.
Dmitry_177 (02.11.06 14:50) [14]
> я имел ввиду как сказал Anatoly Podgoretsky,
function IntToPChar(Buf: PChar; int: integer): PChar;
var
n: integer;
begin
n:= length(Buf)-1;
FillChar(Buf[0], n+1, " ");
while int > 0 do begin
Buf[n]:= Chr(int mod 10 + 48);
int:= int div 10;
Dec(n);
if n < 0 then break;
end;
result:= Buf;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s: array[0..11] of char; // это чтоб не парится со всякими выделениями памяти,
begin //
s:= "01234567890"#0; //и тд. кто в конце концов на API хочет писать? разбирайся зачем.
Label1.Caption:= IntToPChar(s, 4569891);
end;
← →
Плохиш © (2006-11-02 15:56) [19]Видно у аФФтара семестр начался не 1го сентября, а 1го ноября и сразу с лабораторной :-)
← →
DevilDevil © (2006-11-02 16:25) [20]А мне вот непонятно, чем string не устраивает.
← →
Dmitry_177 (2006-11-04 14:55) [21]
> Anatoly Podgoretsky © (02.11.06 14:37) [11]
> Integer смело можно перевести в PChar и обратно, одно число в 4 байта,
> второе указатель, тоже в 4 байта.
Что-то не переводится...
var
i: integer;
begin
i := 1234;
Caption := PChar(i);
end;
← →
sniknik © (2006-11-04 15:10) [22]> Что-то не переводится...
да нет же, переводится (вернее приводится) но не присваивается(!!! разница однако), а не присваивается потому что... [12], не буду повторяться. указатель и данные на которые он указывает это не одно и то же.
var
i: integer;
p: PChar;
begin
i := 1234;
p := PChar(i);
//////////////////
Caption := p; //ошибка (AV) будет здесь, если строку убрать то ее не будет.
end;
p.s. тебе не API замахиваться, а сначала элементарных базовых знаний поднабраться бы...
← →
Anatoly Podgoretsky © (2006-11-04 18:07) [23]
> Caption := PChar(i);
Чего ты это вдруг решил подобное делать, ерунда получится.S := "1234";
Caption := PChar(S);
> тебе не API замахиваться, а сначала элементарных базовых
> знаний поднабраться бы...
И Дельфи тоже пока рано.
← →
Chose © (2006-11-05 01:29) [24]>[22] sniknik © (04.11.06 15:10)
>[23] Anatoly Podgoretsky © (04.11.06 18:07)
Автор пишет DLL для внедрения ее через AppInit_DLLs,
и ему нужно обойтись без SysUtils
← →
Германн © (2006-11-05 02:05) [25]
> Chose © (05.11.06 01:29) [24]
>
...
> Автор пишет DLL для внедрения ее через AppInit_DLLs,
> и ему нужно обойтись без SysUtils
>
Ну и? Предложи своё решение сабжа.
Мастера "созвучные" по "короткому" имени его не поняли. :-)
Таки тебе все карты в руки!
← →
Германн © (2006-11-05 02:40) [26]
> Chose © (05.11.06 01:29) [24]
>
Да и ещё. Очень смущает дата появления ника Chose ©!
Может ты попробуешь "более грамотно" задать свой вопрос?
← →
Chose © (2006-11-05 10:15) [27]>Да и ещё. Очень смущает дата появления ника Chose !
Чем это тебе мой ник не понравился ?
P.S. Я не автор этой ветки :)
← →
Anatoly Podgoretsky © (2006-11-05 11:42) [28]
> Chose © (05.11.06 01:29) [24]
С чего ты это решил, тут элементарная лабораторная.
← →
sniknik © (2006-11-05 12:25) [29]> элементарная лабораторная.
при которой кстати ещё более менее оправданно отсутствие базовых знаний, ну учится человек, просто взялся не с того конца.
но если он уже что-то там пишет... не дай бог по работе, а не просто так, попробовать.
в любом случае рано взялся, пусть либо лекции перечитает, либо найдёт книгу с основами языка, и читает выполняя задания в ней. что такое указатели разберётся.
> P.S. Я не автор этой ветки :)
а откуда тогда знаешь что он пишет? может графический редактор, а на WinApi т.к. решил сделать его поменьше размером, типа в инете выкладывать. чужое ТЗ потёмки... (тут в своём часто разобраться не получается, такой бред дают, а уж чужое не читая... ;о)))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.054 c