![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с поинтерами: корректен ли этот код? [D7, XP]
chai © (2006-04-27 00:33:00)Ув. Мастера! Корректен ли этот код:
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 адресов локальных же
переменных. Процедура работает без ошибок, но хотел бы уточнить: можно ли так делать? Спасибо!
MBo (2006-04-27 09:43:00) [1]посмотри в system.pas ParamStr() и GetParamStr
chai (2006-04-27 09:25:00) [2]> А зачем вообше городить "глюкодром", не проще так:
Эта процедура испльзуется в DLL, а в ней только uses Windows
balepa (2006-04-27 08:29:00) [3]
> ЮЮ © (27.04.06 06:30) [2]
Да я шибко не присматривался к коду.
Причина:
> P.S. А зачем вообше городить "глюкодром",не проще так
ЮЮ (2006-04-27 06:30:00) [4]
> Тоже бы 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 06:03:00) [5]Arguments: array[0..1] of Pointer;
Тоже бы GetMem сделать