Форум: "Начинающим";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
ВнизРабота с поинтерами: корректен ли этот код? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.012 c