Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Errore 216: pchar, strings e socket.
Forum - Pascal - Errore 216: pchar, strings e socket.

Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 14:08
Sabato, 21/05/2011
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:
Codice sorgente - presumibilmente Pascal

  1. const
  2. empty:pchar='';
  3. cr:pchar=#13#10;
  4. av:pchar=#9' - '#9;
  5.  
  6. var
  7.  Sin,Sout: Text;
  8.  hhost, hedit, huri : hwnd;
  9.  testo, add : pchar;
  10.  buffer:string[255];
  11.  doc:boolean;



Il testo incriminato, preso
dal programma, è il seguente:
Codice sorgente - presumibilmente Pascal

  1. procedure agg(s:string);
  2.  begin
  3.   s:=concat(s,#13#10#0);
  4.   add:=stralloc(length(s)+1);
  5.   add:=strpcopy(add,s);
  6.   testo:=strcat(testo, add);
  7.   writeln('add:"', add,'"');
  8.   dispose(add);
  9.   add:=nil;
  10.  end;

Codice sorgente - presumibilmente Delphi

  1. {$i-}
  2.  testo:='';
  3.  doc:=false;
  4.  repeat
  5.   buffer:='';
  6.   system.Readln(Sin,Buffer);
  7.   if not doc then begin //aggiunge davanti ad ogni header http la stringa "av"
  8.    if (length(buffer)=0) then begin doc:=true; end
  9.    else begin
  10.     testo:=strcat(testo, av);
  11.    end;
  12.   end;
  13.   agg(buffer);
  14.  until (ioresult <> 0) or eof(sin);
  15.  Close(sout);
  16.  setwindowtext(hedit,testo);
  17. {$I+}



Durante il debug ho scoperto che l'errore risulta solamente la quarta volta che esegue la linea
Codice sorgente - presumibilmente Plain Text

  1. 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

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 1:00
Domenica, 22/05/2011
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 ?
Codice sorgente - presumibilmente Pascal

  1. var testo: string;
  2. ...
  3. 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 il 22/05/2011 alle 11:03


Ibis redibis non morieris in bello
PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 11:01
Domenica, 22/05/2011
Testo quotato


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 il 22/05/2011 alle 11:02
PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 12:04
Domenica, 22/05/2011
Codice sorgente - presumibilmente Delphi

  1. Var Test: String;
  2.     i: Integer;
  3. begin
  4.   for i:= 1 to 100 do
  5.    Test := test+'pippo';
  6.   SetWindowText(Edit1.Handle, PChar(test));
  7.   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
PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 23:35
Domenica, 22/05/2011
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 ??

PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 19:15
Martedì, 24/05/2011
Questo codice non dà errori:

Codice sorgente - presumibilmente Delphi

  1. var
  2.  req, testo : array of char;
  3.  Sin,Sout: Text;
  4.  buffer:array[0..4095] of char;
  5.  doc:boolean;
  6.  l, i : longint;
  7. const
  8. av:array[0..11] of char=' - Header: '#9'';
  9. cr:array[0..1] of char=#13#10;

Codice sorgente - presumibilmente Delphi

  1. procedure agg(s:array of char);
  2. var i, lt : longint;
  3.  begin
  4.   i := 0;
  5.   lt:=length(testo);
  6.   setlength(testo,lt+length(s));
  7.   while (i<length(s))and(s[i]<>#0) do begin
  8.    testo[lt+i]:=s[i];
  9.    inc(i);
  10.   end;
  11.   setlength(testo,lt+i);
  12.  end;
  13. function bufferlength:longint;
  14.  begin
  15.  i:=0;
  16.  while (buffer[i]<>#0) and (i<length(buffer)) do inc(i);
  17.  bufferlength:=i;
  18.  end;

Codice sorgente - presumibilmente Delphi

  1. repeat
  2.   buffer:=stringofchar(#0, 4095);
  3.   system.Readln(Sin,Buffer);
  4.   if not doc then begin
  5.    if (bufferlength=0) then begin doc:=true; end
  6.    else begin
  7.     agg(av);
  8.    end;
  9.   end;
  10.   agg(buffer);
  11.   agg(cr);
  12.  until (ioresult <> 0) or eof(sin);
  13.  setlength(testo, length(testo)+1);
  14.  testo[high(testo)]:=#0;
  15.  setwindowtext(hedit,@(testo[0]));



Resta comunque il problema riguardo al perché l'errore si sia presentato.

Ultima modifica effettuata da Phi il 24/05/2011 alle 19:16
PM Quote