Oppure

Loading
21/05/11 12:08
Phi
Salve a tutti.

Ho un piccolo problemino legato ad un RunTime Error 216 in un programma che sto scrivendo per Windows.
L'errore avviene in una procedura adibita a ricevere stringhe da un socket client che è connesso ad un server ed ad aggiungerle ad una "null-terminated string"(offero Pchar) perché questa possa essere successivamente inserita in un Edit Control con le WinApi.

Per realizzare il programma sto usando le funzioni della unit string

Le variabili sono queste:
const
empty:pchar='';
cr:pchar=#13#10;
av:pchar=#9' - '#9;

var
 Sin,Sout: Text;
 hhost, hedit, huri : hwnd;
 testo, add : pchar;
 buffer:string[255];
 doc:boolean;


Il testo incriminato, preso
dal programma, è il seguente:
procedure agg(s:string);
 begin
  s:=concat(s,#13#10#0);
  add:=stralloc(length(s)+1);
  add:=strpcopy(add,s);
  testo:=strcat(testo, add);
  writeln('add:"', add,'"');
  dispose(add);
  add:=nil;
 end;
{$i-}
 testo:='';
 doc:=false;
 repeat
  buffer:='';
  system.Readln(Sin,Buffer);
  if not doc then begin //aggiunge davanti ad ogni header http la stringa "av"
   if (length(buffer)=0) then begin doc:=true; end
   else begin
    testo:=strcat(testo, av); 
   end;
  end;
  agg(buffer);
 until (ioresult <> 0) or eof(sin);
 Close(sout);
 setwindowtext(hedit,testo);
{$I+}


Durante il debug ho scoperto che l'errore risulta solamente la quarta volta che esegue la linea
testo:=strcat(testo, av);
.

Non so proprio perché succeda.
Chi ha qualche ipotesi ??
Magari se avete anche suggerimenti per migliorare il codice.

Grazie, in anticipo
aaa
21/05/11 23:00
Goblin
al momento non posso provare il pascal, in quanto ho solo la console di delphi, ma prometto di testare quanto dico, dunque prendi tutto con le "molle" ...
Perchè non lavori con le stringhe e quando chiami l'API di windows gli passi la stringa castata a pchar ?
var testo: string;
...
setwindowtext(hedit,Pchar(testo));

Di solito con delphi funziona e non mi devo smazzare tutte le menate dei PChar, con il pascal "standard" non ho provato, ma come ho detto mi riprometto di farlo.

G.
Ultima modifica effettuata da Phi 22/05/11 9:03
Ibis redibis non morieris in bello
22/05/11 9:01
Phi

Perchè non lavori con le stringhe e quando chiami l'API di windows gli passi la stringa castata a pchar ?

var testo: string;
...
setwindowtext(hedit,Pchar(testo));



Perché la lunghezza di testo va molto oltre i 255 caratteri.
Ultima modifica effettuata da Phi 22/05/11 9:02
aaa
22/05/11 10:04
Goblin
Var Test: String;
    i: Integer;
begin
  for i:= 1 to 100 do
   Test := test+'pippo';
  SetWindowText(Edit1.Handle, PChar(test));
  ShowMessage(IntToStr(length(Edit1.Text)));


Questo codice funziona e la stringa è lunga 500 bytes, ma come ho detto io uso il pascal di delphi
Ibis redibis non morieris in bello
22/05/11 21:35
Phi
Purtroppo nel Pascal standard le stringhe sono al massimo di 255 caratteri.
Però ora provo ad usare un array of char(dinamico).

Comunque, qualcuno ha qualche idea su perché questo errore si presenti ??
aaa
24/05/11 17:15
Phi
Questo codice non dà errori:

var
 req, testo : array of char;
 Sin,Sout: Text;
 buffer:array[0..4095] of char;
 doc:boolean;
 l, i : longint;
const
av:array[0..11] of char=' - Header: '#9'';
cr:array[0..1] of char=#13#10;
procedure agg(s:array of char);
var i, lt : longint;
 begin
  i := 0;
  lt:=length(testo);
  setlength(testo,lt+length(s));
  while (i<length(s))and(s[i]<>#0) do begin
   testo[lt+i]:=s[i];
   inc(i);
  end;
  setlength(testo,lt+i);
 end;
function bufferlength:longint;
 begin
 i:=0;
 while (buffer[i]<>#0) and (i<length(buffer)) do inc(i);
 bufferlength:=i;
 end;
 repeat
  buffer:=stringofchar(#0, 4095);
  system.Readln(Sin,Buffer);
  if not doc then begin
   if (bufferlength=0) then begin doc:=true; end
   else begin
    agg(av);
   end;
  end;
  agg(buffer);
  agg(cr);
 until (ioresult <> 0) or eof(sin);
 setlength(testo, length(testo)+1);
 testo[high(testo)]:=#0;
 setwindowtext(hedit,@(testo[0]));


Resta comunque il problema riguardo al perché l'errore si sia presentato.
Ultima modifica effettuata da Phi 24/05/11 17:16
aaa