Autore Topic: aggiungere elemento strutturato in un array di oggetti  (Letto 394 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
aggiungere elemento strutturato in un array di oggetti
« il: 23 Ottobre 2014, 14:21:33 »
perche' nella seguente procedura infilo con successo elementi nel vettore di "strutture" ... e dal debug sembrano tutti "nodi" diversi, ma poi il vettore risultante a piu' copie dello stesso elemento?

Codice: [Seleziona]
'------ Struttura dati della playlist sull'HARD DISK ---
Public Struct LocalClip
  Indice As Integer
  Path As String
  Data As Date
End Struct

Public LocalPlaylist As New LocalClip[]   'Playlist sul FILE server       .... nota ci serve il NEW senno' non lo crea in memoria e non ci accedo
'////// Struttura dati della playlist sull'HARD DISK ////

Codice: [Seleziona]
Public Sub LoadLocalPlaylist(MediaChannel As String, When As Date)
Dim MediaRoot As String 'la root della playlist di oggi
Dim Giorno As String
Dim Clips As String[] 'la lista dei file contenuti in mediaroot (ovvero gli mlt di oggi per il canale in esame)

Dim ClipDaAggiungere As New LocalClip 'aggiungero' una clip al vettore delle clip in playlist sul file server ma che FORSE devono essere aggiunte al playback server

Dim I As Integer
Dim DataClip As Date  'estrae dal nome del file la data (ora e giorno) di sua competenza

  Giorno = Format(When, "yyyymmdd")
  MediaRoot = ShareName & "/" & MediaChannel & "/MEDIA/" & Giorno & "/"
 
  Try clips = Dir(MediaRoot, "*.mlt").Sort(gb.Ascent) 'carico tutti gli mlt di oggi ... in ordine crescente
  If Error Then
    'puo' essere che la directory non esista, non e' stata fatta alcuna playlist per questo giorno (oggi)
    Print "No playlist for today (" & Now & ")"
    Return  'non c'e' nulla da caricare
  Endif
 
  If clips.Count = 0 Then Return  'non ci sono nuove clip nella cartella di OGGI
 
  'svuota il vettore della playlist locale in memoria
  LocalPlaylist.Clear
 
  For i = 0 To clips.Count - 1
    DataClip = DataDellaClip(MediaRoot & clips[i])
    'controllo se la CLIP e' "scaduta"
    If DateDiff(DataClip, When, gb.Second) <= 0 Then  'la scadenza e' parametrica rispetto alla chiamata (potrei voler caricare la playlist di ieri ... normalmente e' ad ADESSO ....
     
      ClipDaAggiungere.Data = DataClip
      ClipDaAggiungere.Path = MediaRoot & clips[i]
      ClipDaAggiungere.Indice = i
      LocalPlaylist.Add(ClipDaAggiungere, i)
    Endif
  Next
 
End
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: aggiungere elemento strutturato in un array di oggetti
« Risposta #1 il: 23 Ottobre 2014, 16:32:58 »
Poiché la variabile vettoriale di tipo della tua Struttura non ha un numero già definito di elementi, nel ciclo va prevista la creazione di ogni variabile di tipo della tua Struttura, alla quale vai ad assegnare i valori ai membri, e che a sua volta sarà assegnata alla variabile vettoriale di tipo Struttura.

Ti rinvio ad uno specifico paragrafo di questa pagina della nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Strutture:_dichiarazione_ed_uso#Vettori_con_numero_di_elementi_indefinito


La questione è stata già posta tempo fa:
http://www.gambas-it.org/smf/index.php?topic=3412.msg33406#msg33406


Ad ogni modo la ragione di quel comportamento dovrebbe risiedere  nella circostanza che la variabile ad una Struttura non è in fondo altro che un Puntatore all'area di memoria riservata, occupata dalla Struttura. Pertanto nel tuo caso iniziale inserisci sempre il medesimo indirizzo di memoria nel vettore; quindi sempre l'area di memoria avente i medesimi valori.
« Ultima modifica: 19 Giugno 2015, 09:42:36 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: aggiungere elemento strutturato in un array di oggetti
« Risposta #2 il: 23 Ottobre 2014, 17:44:17 »
provero' a mettere

Codice: [Seleziona]
For i = 0 To clips.Count - 1
    DataClip = DataDellaClip(MediaRoot & clips[i])
    'controllo se la CLIP e' "scaduta"
    If DateDiff(DataClip, When, gb.Second) <= 0 Then  'la scadenza e' parametrica rispetto alla chiamata (potrei voler caricare la playlist di ieri ... normalmente e' ad ADESSO ....
      
ClipDaAggiungere=new LocalClip

      ClipDaAggiungere.Data = DataClip
      ClipDaAggiungere.Path = MediaRoot & clips[i]
      ClipDaAggiungere.Indice = i
      LocalPlaylist.Add(ClipDaAggiungere, i)
    Endif
  Next
« Ultima modifica: 23 Ottobre 2014, 17:45:50 da allegfede »
se corri, morirai stanco (motto degli sniper)