Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: AndreaM - Agosto 21, 2022, 08:14:26 am

Titolo: lavorare con la TFPObjectList
Inserito da: AndreaM - Agosto 21, 2022, 08:14:26 am
Buongiorno a tutti.
Ho una lista di oggetti (Way Points con relative coordinate) salvata in una TFPObjectList che devo analizzare per valutare se tra un WP e l'altro è presente una distanza minore di m metri.
L'idea è quella di prendere il primo e confrontarlo con tutti i successivi.. il secondo e confrontarlo con tutti i successivi e cosi via...
Codice: [Seleziona]
for i:=0 to Count-2 do // dal primo punto in avanti
  for k:=i+1 to Count-1 do // dal punto successivo al precedente, in avanti
    begin
    // confrono della distanza trà il punto i ed il punto k
    // azioni da prendere
    end;
Se la lista rimane integra il sistema funziona. Ma se l'azione da intraprendere è un
Codice: [Seleziona]
Delete(k)
ovvero elimino fisicamente l'oggetto k allora il problema che sorge è che i riferimenti Count-2 e Count-1 non sono più validi.
Questo codice non funzionerebbe! :-\
Esiste un metodo per fare la scansione della lista senza perdere i riferimenti sul fine lista anche cancellando elementi durante la scansione?
Spero di aver chiarito il problema.
Grazie per l'aiuto.
Andrea.
Titolo: Re:lavorare con la TFPObjectList
Inserito da: bonmario - Agosto 21, 2022, 10:01:25 am
Ciao,
non ho mai usato quell'oggetto, ma di solito quando devi scorrere un elenco, e sai già in partenza che probabilmente andrai a cancellare almcno un elemento, allora lo devi leggere al contrario, usando "downto" invece di to.

Ecco un esempio:
Codice: [Seleziona]
    //Cancello dall'elenco tutti i files con dimensione = 0
    for Idx:=ListaFiles.Count - 1 downto 0 do begin
      NomeFile:=ListaFiles[Idx];
      if (DimensioneFile(NomeFile) = 0) then begin
        ListaFiles.Delete(Idx);
      end;
    end;

Ciao, Mario
Titolo: Re:lavorare con la TFPObjectList
Inserito da: AndreaM - Agosto 21, 2022, 06:46:16 pm
Grazie Mario, stupidamente non ho preso in considerazione questo semplice escamotage!
Ora Provo.
Titolo: Re:lavorare con la TFPObjectList
Inserito da: SB - Agosto 28, 2022, 08:51:15 am
Hai comunque cicli annidati. Devi tenere aggiornato il Count per entrambi

Invece di cancellarli subito potresti contrassegnarli come da cancellare e poi fai una passata finale di cancellazione con un unico ciclo

Oppure, se interpreto correttamente la reference di TFPObjectList, eviti di cancellare i nodi della lista ma cancelli solo gli oggetti. Alla fine fai un bel Pack() e la classe si arrangia a fare pulizia dei nodi diventati inutili.

Una osservazione sull'algoritmo che stai usando.
Se cancelli un WP, questo non sarà più usato per altri confronti...