Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Работа с поинтерами: корректен ли этот код?   Найти похожие ветки 

 
chai   (2006-04-27 00:33) [0]

Ув. Мастера! Корректен ли этот код:

procedure GetArguments(const ArgStr: PChar; var Arg1,Arg2: PChar; ArgSize: Integer);
var
 Arguments: array[0..1] of Pointer;
 ArgStrLen,I,ArgN,X: Integer;
begin
 ArgStrLen := Length(ArgStr) -1;
 Arguments[0] := Arg1; Arguments[1] := Arg2;
 for I := Low(Arguments) to High(Arguments) do
   ZeroMemory(Arguments[I],ArgSize); // убираем крокозябры
 ArgN := 0; X := 0;
 for I := 0 to ArgStrLen do
 begin
   if ArgStr[I] <> ";" then
   begin
     if Arguments[ArgN] <> nil then
     begin
       Move(ArgStr[I],PChar(@Arguments[ArgN]^)[X],1);
       Inc(X);
     end;
   end else begin
     Inc(ArgN);
     X := 0;
   end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 a1,a2: PChar;
begin
 GetMem(a1,255);
 GetMem(a2,255);
 GetArguments("very long arguments string 1;very long arguments string 2",a1,a2,255);
 ShowMessage(a1);
 ShowMessage(a2);
 FreeMem(a1);
 FreeMem(a2);
end;

У меня есть сомнения на счет присваивания элементам локального массива Arguments адресов локальных же
переменных. Процедура работает без ошибок, но хотел бы уточнить: можно ли так делать? Спасибо!


 
balepa ©   (2006-04-27 06:03) [1]

Arguments: array[0..1] of Pointer;
Тоже бы GetMem сделать


 
ЮЮ ©   (2006-04-27 06:30) [2]


> Тоже бы GetMem сделать


Думаешь двух указателей маловато будет? :)

>на счет присваивания элементам локального массива Arguments адресов локальных же переменных.

Arg1 и Arg2 вовсе не локальные для GetArguments.
А после Arguments[0] := Arg1 далее работаешь, по существу, с Arg1

P.S. А зачем вообше городить "глюкодром", не проще так:

uses Types;

function StringToArray(Text: string): TStringDynArray;
var
 p: integer;
begin
 Result := nil;
 while Text <> "" do begin
   p := Pos(";", Text);
   if p < 1 then p := Length(Text) + 1;
   SetLength(Result, Length(Result) + 1);
   Result[High(Result)] := Copy(Text, 1, p - 1);
   Text := Copy(Text, p + 1, Length(Text));
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 s: TStringDynArray;
begin
 s := StringToArray("very long arguments string 1;very long arguments string 2");
 for i := 0 to High(s) do
     ShowMessage(s[i]);
end;


Не нравится TStringDynArray, можно использовать TStringList


 
balepa ©   (2006-04-27 08:29) [3]


> ЮЮ ©   (27.04.06 06:30) [2]


Да я шибко не присматривался к коду.

Причина:

> P.S. А зачем вообше городить "глюкодром", не проще так


 
chai   (2006-04-27 09:25) [4]

> А зачем вообше городить "глюкодром", не проще так:
Эта процедура испльзуется в DLL, а в ней только uses Windows


 
MBo ©   (2006-04-27 09:43) [5]

посмотри в system.pas ParamStr() и GetParamStr



Страницы: 1 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.034 c
2-1145769990
Александр123123
2006-04-23 09:26
2006.05.14
Как в цикле прообежаться по свойствам компонента


1-1144304985
Alex_C
2006-04-06 10:29
2006.05.14
Событие при активации приложения?


2-1145789779
sysop
2006-04-23 14:56
2006.05.14
Выравнивание строки


3-1143008249
abhtr
2006-03-22 09:17
2006.05.14
Последующий поиск


1-1144235102
Arm79
2006-04-05 15:05
2006.05.14
Call Stack в RunTime