Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Carlo Bergamini - Novembre 13, 2015, 12:19:48 pm

Titolo: Classe Tbits
Inserito da: Carlo Bergamini - Novembre 13, 2015, 12:19:48 pm
Buongiorno a tutti,
qualcuno di voi ha avuto esperienze nell'uso della classe in oggetto?

Ne sto testando i metodi per l'utilizzo in una mia classe e genera un runtime error che mi sembra
assolutamente impossibile.

Nello specifico ho un errore utilizzando la FindFirst e la FindNext per scorrere i valori alla ricerca dei bit impostati a True.

Dalla documentazione il comportamento corretto che ci si aspetta è che la chiamata a FindNext ritorni con -1 quando non trova più valori ( fine array).

Il codice elementare che uso

Codice: [Seleziona]
procedure TForm1.FormCreate(Sender: TObject);
begin
  b := TBits.Create(10);
  m1.Append('b := TBits.Create(10)');
  m1.Append('');

  m1.append('bitState.Clearall');
  b.Clearall;
  m1.Append('');

  m1.append('bitState.Get(0) : ' + BoolToStr(b.Get(0),True));
  m1.Append('');

  b.SetOn(0);
  m1.append('bitState.SetOn(0)');
  m1.Append('');

  m1.append('bitState.Get(0) : ' + BoolToStr(b.Get(0),True));
  m1.Append('');

  m1.append('bitState.Clearall');
  b.Clearall;
  m1.Append('');

  m1.append('FindFirstBit(True) : '+ IntToStr(b.FindFirstBit(True)));
  m1.Append('');

  b.SetOn(6);
  m1.append('bitState.SetOn(6)');
  m1.Append('');

  b.SetOn(8);
  m1.append('bitState.SetOn(8)');
  m1.Append('');

  b.SetOn(10);
  m1.append('bitState.SetOn(10)');
  m1.Append('');

  m1.append('bitState.FindFirstBit(True) : ' + IntToStr(b.FindFirstBit(True)));
  m1.Append('');

  m1.append('bitState.FindNextBit : ' + IntToStr(b.FindNextBit));
  m1.Append('');

  m1.append('bitState.FindNextBit : ' + IntToStr(b.FindNextBit));
  m1.Append('');

  m1.append('bitState.FindNextBit : ' + IntToStr(b.FindNextBit));
  m1.Append('');

L'ultima chiamata a FindNextBit provoca il messagio di errore
Invalid bit index : 11

Dal testo sembra ovviamente che la ricerca sia andata oltre la fine.
E questo mi sembra inverosimile.
Evidentemente sbaglio qualcosa ma non riesco a vederlo.

Vi ringrazio per l'attenzione.
Titolo: Re:Classe Tbits
Inserito da: nomorelogic - Novembre 14, 2015, 10:51:09 am
in effetti FindNext dovrebbe ritornare -1

ho fatto una prova con un loop con while ed ottengo lo stesso errore
probabilmente hai trovato un bug
Titolo: Re:Classe Tbits
Inserito da: Carlo Bergamini - Novembre 14, 2015, 12:41:17 pm
Grazie per la tua risposta, che fortuna  8)...

Mi servivano quelle funzioni per implementare una undo.
Il problema è facilmente aggirabile.
Nel mio caso è bastato fare una for da 0 alla size - 1 dell'oggetto.

Che si fa in questi casi?
Si segnala?

Carlo
Titolo: Re:Classe Tbits
Inserito da: Legolas - Novembre 14, 2015, 10:38:13 pm
http://bugs.freepascal.org/view.php?id=25398

Dovrebbe essere corretto nella release 3.0.0. In proposito, proprio oggi è stato esportato il tag del branch 3.0.0 final, quindi in una decina di giorni si dovrebbe avere la release disponibile per il download.
Titolo: Re:Classe Tbits
Inserito da: Carlo Bergamini - Novembre 15, 2015, 12:47:10 pm
Ottimo, non ho ancora cercato nel forum....ma da qualche parte ci sarà un doc
su come fare ad aggiornare solo fpc.

Ho letto qualcosa in giro ma non mi è sembrato un processo molto banale.
Qualche problema sembra esserci.

Grazie comunque per le info.

Ora mi spunto sui db perchè ho dei buchi con sqlite.

Carlo