Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с поинтерами: корректен ли этот код? [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 сделать


Наверх

Титульная страница Поиск, карта сайта Написать письмо