Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Aprile 30, 2024, 04:58:09 pm

Titolo: [Risolto] Errore di Classe su Matrice di una sola riga
Inserito da: petrusic - Aprile 30, 2024, 04:58:09 pm
Casualmente, è capitato che nella formazione di una matrice dinamica  sia stata creata una matrice di una sola riga.
Ebbene, nel trasferire le singole celle nella prima riga di detta matrice, già al momento di impegnare la prima cella della prima ed unica riga, viene fornito il seguente Errore
Citazione
Il progetto DomusRatio ha sollevato una eccezione di classe 'External: SIGSEGV'.
 All'indirizzo 42A23E
dentro la procedura di controllo
Codice: [Seleziona]
procedure TWinControl.KeyDownBeforeInterface(var Key: Word; Shift: TShiftState);
begin
  KeyDown(Key, Shift);
end;               

Ecco anche le istruzioni eseguite fino a quella che scatena l'ERRORE:
Codice: [Seleziona]
if (Length(striAmmortamenti) > 0) then
    begin
      tabSplit:= striAmmortamenti.Split(chr(13));
      WriteLn('Length(tabSplit)= ' + inttostr(Length(tabSplit)));
      SetLength(tbAmmortamenti, Length(tabSplit));
      for i:= 0 to (Length(tabSplit) - 1) do
      begin
        WriteLn('tabSplit[' + inttostr(i) + ']= ~' + tabSplit[i] + '~');
        WriteLn('---');
        tbEl:= tabSplit[i].Split(Chr(9));
        WriteLn('Length(tbEl)= ' + inttostr(Length(tbEl)));
        for j:= 0 to 4 do
        begin
          WriteLn('tbEl[' + inttostr(j) + ']= ~' + tbEl[j] + '~');
        end;
        k:= i;        // Non sarebbe necessaria, ma l'ho agggiunta per togliere ogni mio dubbio
        for j:= 0 to 4 do
        begin
          WriteLn('k= ' + inttostr(i));
          WriteLn('j= ' + inttostr(j));
          tbAmmortamenti[k, j]:= tbEl[j];             //  <-- alla prima esecuzione
          WriteLn('tbAmmortamenti[' + inttostr(k) + inttostr(j) + ']= ~' + tbAmmortamenti[k, j] + '~');
        end;
      end;
    end;                                                   

Riporto anche il contenuto della console al riguardo:
Citazione
Length(tabSplit)= 1
tabSplit[0]= ~110050180   101710180   tenaglia   -4,3   20030103~
---
Length(tbEl)= 5
tbEl[0]= ~110050180~
tbEl[1]= ~101710180~
tbEl[2]= ~tenaglia~
tbEl[3]= ~-4,3~
tbEl[4]= ~20030103~
k= 0
j= 0
Manca l'ultima  "WriteLn" a causa dell'Errore determinato dall'istruzione che la precede nella sequenza.

Che non siano gestite condizioni di matrici dinamiche con una sola riga? Mi pare logicamente impossibile.
Titolo: Re:Errore di Classe su Matrice di una sola riga
Inserito da: nomorelogic - Aprile 30, 2024, 07:25:48 pm
dovresti controllare l'assegnazione seguente
che secondo me non crea una matrice ma un array monodimensionale
Codice: [Seleziona]
SetLength(tbAmmortamenti, Length(tabSplit));

per avere una matrice di 1 sola riga, dovresti fare:
Codice: [Seleziona]
SetLength(tbAmmortamenti, 1, Length(tabSplit));
Titolo: Re:Errore di Classe su Matrice di una sola riga
Inserito da: petrusic - Aprile 30, 2024, 09:40:30 pm
dovresti controllare l'assegnazione seguente
che secondo me non crea una matrice ma un array monodimensionale
Codice: [Seleziona]
SetLength(tbAmmortamenti, Length(tabSplit));

per avere una matrice di 1 sola riga, dovresti fare:
Codice: [Seleziona]
SetLength(tbAmmortamenti, 1, Length(tabSplit));

Si, me ne sono accorto.
L'impostazione corretta é
Codice: [Seleziona]
SetLength(tbAmmortamenti, Length(tabSplit), 5)