Autore Topic: [Risolto] Leggere da un array di strutture  (Letto 3382 volte)

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 287
    • Mostra profilo
[Risolto] Leggere da un array di strutture
« il: 15 Dicembre 2024, 19:19:19 »
Anzi tutto un saluto a tutti, vi leggo piu' di quel che scrivo. Mi scuso pure per il titolo deviante.

In un modulo, ho dichiarato una struttura, e c'e' una funzione generica che mi prende i valori da una base dati e me li restituisce come array di questa struttura. Cerco di semplificare il codice

Codice: [Seleziona]
Public Struct MyStruct
    nome As String
    info As String
End Struct
La funzione e' una cosa tipo questa:

Codice: [Seleziona]
function Generale(basedati as string) as Mystruct[]
dim MioArray as Mystruct[]
    ' qui mi lavoro basedati, e ritorno un array di questa struttura
   return MioArray
end function

Essendoci nell'array piu' item e ognuno con il suo motivo, quasi mai da usare insieme, vorrei leggere una parte del valore alla volta, con altre funzioni: potrebbe essere fatto tutto in una, ma a spese della leggibilita'.

Codice: [Seleziona]
Public Function Parziale(base as string, cosaleggere as string) as string
dim dati as MyStruct[]
dim s as string = ""
dati = Generale(base)
For i = 0 To dati.count - 1
  s &= dati[i].nome
Next 

return s
end function

E qui cade l'asino (cioe' io), che non ho piu' la memoria di una volta. Supponendo che io voglia leggere, in tutti, il valore dati.nome, vorrei pero' chiamare la funzione Parziale() in modo da essere usabile genericamente, passando in "cosaleggere" sia "nome" che "info". Ma come scrivo la cosa? In questi modi no, certo

Codice: [Seleziona]
dati[i].cosaleggere

Certo che sia una banalita' (non ho piu' l'allenamento con Gambas come una volta, che poi non era chissa' cosa), vi saluto per ora. Anche se cose nuove ho ben poco tempo per farle, comunque, uso ancora molto Gambas, piu' che altro come interfaccia, ma e' sempre godibile.
« Ultima modifica: 21 Dicembre 2024, 20:52:55 da pastrank »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #1 il: 15 Dicembre 2024, 20:44:11 »
... passando in "cosaleggere" sia "nome" che "info".
Ciao pastrank,
mi "pare" di aver capito che nell'argomento "cosaleggere" vi sia una stringa contenente due parole che intendono rappresentare un "nome" e una "informazione".
...tu vuoi filtrare gli elementi dell'array di quel tipo di struttura (dichiarato nel tuo esempio) sulla base dei valori stringa, contenuti nell'argomento "cosaleggere", in base alla corrispondenza di tali due parole ai due membri di ciascun elemento di tipo Struttura ?
Vogliio dire: se le due parole presenti in "cosaleggere" corrispondono rispettivamente al membro "nome" e al membro "info" di un elemento dell'array, allora vanno presi in considerazione ?
In caso affermativo, solo se corrispondono entrambi ?

Mi spiego meglio.
Poniamo il caso che la variabile "cosaleggere" contenga la stringa "aaa bbb".
Tu vuoi che si prendano in considerazione gli elementi dell'array di quel tipo Struttura, come specificato nel tuo esempio, aventi rispettivamente:
- il membro ".nome" contenente la stringa "aaa";
- il membro ".info" contenente la stringa "bbb".
Sbaglio ?
« Ultima modifica: 15 Dicembre 2024, 20:52:15 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 pastrank

  • Maestro Gambero
  • ****
  • Post: 287
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #2 il: 16 Dicembre 2024, 01:11:17 »
mi "pare" di aver capito che nell'argomento "cosaleggere" vi sia una stringa contenente due parole che intendono rappresentare un "nome" e una "informazione".

Aspetta, forse l'ho spiegata male. Il dato che mi arriva e' un array, formato da item con questa struttura. La struttura, diciamo (e' un piu' complicata, diciamo saranno una 15ina di possibili membri), ha i membri nome e info. Io ne rileggerei uno alla volta. Per questo vorrei passare alla funzione il nome di uno di questi, e poi enumerare tutti gli item. Ma se in questo modo me li legge

Codice: [Seleziona]
print dati[i].nome

io vorrei passare, nel parametro cosaleggere, il nome da rileggere. Se io volessi leggere info, per esempio, vorrei richiamare la funzione come

Codice: [Seleziona]
risultato = Parziale(dati, "info")

pero' poi non e' che possa scrivere

Codice: [Seleziona]
print dati[i].[cosaleggere]

In altre parole, sicuramente si fara', ma non riesco a ritrovare la sintassi. Il perche' di tutta questa confusione: leggo un file in formato CSV, dove le intestazioni che mi interessano non sono tutte, e non sempre ci sono o sono nello stesso ordine: se io voglio leggere quelle che corrispondono all'intestazione info, per esempio, chiamo dalla funzione Parziale la procedura Generale, leggo il file, associo i numeri delle intestazioni a quelle delle "colonne", e ritorno tutto ordinato, e solo dopo leggerei una parte. Esisterebbero altri modi di arrivare a questa cosa, ma, per diversi motivi, sono ancora piu' lunghi e complicati.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #3 il: 16 Dicembre 2024, 01:33:39 »
Poiché i membri della Struttura, suppongo, siano tutti di tipo String, perché hai preferito usare una Struttura anziché un array di tipo String?

« Ultima modifica: 16 Dicembre 2024, 01:36:29 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 Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.288
  • Tonno verde
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #4 il: 16 Dicembre 2024, 10:46:49 »
 :ciao:

Probabilmente non ho capito e non sarebbe certo una novità, ma se non erro, la Funzione Parziale con:
Codice: [Seleziona]
For i = 0 To dati.count - 1
  s &= dati[i].nome
Next 
restituisce tutti i nomi della struttura, forse prima dovresti individuare l'indice della struttura e solo successivamente passare alla funzione che cicla solo le cose da leggere.

Oltre al suggerimento di vuott, considererei l'uso, visto che prendi i dati da un file CSV, anche un database semplice e leggero come SQLite

Mi è venuto in mente anche questo, scusa le ingenuità ma siamo nel 2018:
https://www.gambas-it.org/smf/index.php?topic=6369.msg43941#msg43941
« Ultima modifica: 16 Dicembre 2024, 11:25:52 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 287
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #5 il: 16 Dicembre 2024, 22:54:35 »
forse prima dovresti individuare l'indice della struttura e solo successivamente passare alla funzione che cicla solo le cose da leggere.

Questo magari no, perche' dovrei fare un sacco di funzioni separate, la base e' comune, e li' dentro pero' dovrei leggere una volta in un modo, una volta in un altro, e cosi' via

Oltre al suggerimento di vuott, considererei l'uso, visto che prendi i dati da un file CSV, anche un database semplice e leggero come SQLite

Sono nemico dei db, e comunque il formato della base non lo posso scegliere :-)

Mi è venuto in mente anche questo, scusa le ingenuità ma siamo nel 2018

Qui mi hai dato un'idea  ???

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 287
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #6 il: 16 Dicembre 2024, 22:57:21 »
Poiché i membri della Struttura, suppongo, siano tutti di tipo String, perché hai preferito usare una Struttura anziché un array di tipo String?

Lo troverei di piu' facile lettura di un array multidimensionale. Vero anche che potrei impostare come costanti corrispondenti all'indice i nomi che ora assegno alla struttura, poi potrei richiamare il valore come

Codice: [Seleziona]
dati[1][nome]

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #7 il: 17 Dicembre 2024, 00:15:43 »
Con un array di array la procedura è appunto più agevole.
Quello che vuoi fare tu con le Strutture, non si può fare: non è possibile, dopo aver "individuato" con una stringa l'identificatore di un membro di una Struttura, renderlo utile alla lettura del suo contenuto.

Conoscere via codice i nomi identificatori di una Struttura è possibile:
   https://www.gambas-it.org/wiki/index.php/Conoscere_i_nomi_identificatori_dei_membri_di_una_Struttura
e quindi puoi confrontare la parola stringa, passata, con il nome di ciascun membro ritornato dal codice presente nella pagina qui segnalata.... ma poi come lo utilizzi come membro effettivo della Struttura ?
Voglio dire, anche volendo utilizzare quel codice, a te resta sempre la parola passata mediante la funzione e il nome corrispondente ritornato dal codice nella pagina wiki..... come li utilizzi concretamente ?  :-\
« Ultima modifica: 17 Dicembre 2024, 00:26:48 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.213
  • Ne mors quidem nos iunget
    • Mostra profilo
« 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 pastrank

  • Maestro Gambero
  • ****
  • Post: 287
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #9 il: 17 Dicembre 2024, 22:34:18 »
Conoscere via codice i nomi identificatori di una Struttura è possibile:

Eh, i nomi li so, pero' dovrei riuscire a passarli alla funzione. Comunque provero' i suggerimenti tuoi e di Gianluigi, guardero' quale e' la soluzione piu' pratica. Che poi le prove su cose che non ho mai fatto sono le cose che mi divertono della programmazione.

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.288
  • Tonno verde
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #10 il: 19 Dicembre 2024, 16:14:40 »
Così a titolo sportivo, oggi ho cercato di approfondire con un esempio quello che hai chiesto.
Purtroppo mi sono bloccato quasi subito perché, in realtà, non ho capito cosa cerchi di ottenere.
Ammesso e non concesso che quanto allegato possa servire da base di partenza, cosa dovresti leggere?

Allego progetto di partenza

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 287
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #11 il: 20 Dicembre 2024, 23:25:40 »
Ammesso e non concesso che quanto allegato possa servire da base di partenza, cosa dovresti leggere?

Signori e signore, saro' breve :-)
Prima di tutto, appena posso vedo anche come applicare questa cosa anche come struttura, grazie. Vediamo quali erano le mie intenzioni: come dicevo tempo fa, sto costruendo/modificando da decenni un'applicazione per gestirmi i miei file multimediali. Delle cose si fanno meglio con Gambas direttamente, altre sarebbero piu' semplici e veloci usando librerie e programmi.
Per le tag, ad esempio, un'applicazione che legge tutti i file (inclusi .dsf e .dxd, i bluray) e' kid3 (potrei dire perche' proprio questo, ma c'entra poco con questo topic). E' interfacciabile tramite shell o tramite dbus. Non e' che la velocita' cambi poi tanto, o meglio, in entrambi i casi e' piuttosto veloce. Ammetto di aver usato anche l'esempio di vuott su taglib ora sulla Wiki, che funzionava benissimo a patto di dichiarare la libreria come "libtag_c", volendo usare pero' altri tag custom non ho trovato che pochissimi esempi. Anche su Dbus non ho trovato molto, ho provato perfino due o tre AI, che in queste cose possono agire come comici.
Comunque, kid3 a linea di comando puo' richiamare un file qml (modificabile e allegato con il programma), e ottenere un file csv con le tag, in un tempo piuttosto breve: la mia idea era di leggere comunque le tag di tutto, pero' a volte le colonne hanno titoli, presenza o meno, e ordine diversi. Provando con gli array, cosa ho fatto (semplifico):

Ho dichiarato delle costanti, con l'idea di associare poi il nome all'array
Codice: [Seleziona]
Private Const fname As Integer = 0
Private Const title As Integer = 1
Private Const track As Integer = 2
...

e poi una struttura :-), che mi servira' per salvare la posizione dei vari campi del file successivamente
Codice: [Seleziona]
Public Struct TagMap
    artist As Integer
    fname As Integer
    xinfo As Integer
   ......
End Struct

Letto il file csv, la prima riga e' quella dei nomi, e quindi la splitto (ha un comodo tab per divisore)
Codice: [Seleziona]
filetags = Split(filerows[0], "\t")

Devo quindi vedere cosa c'e': in pratica associo la posizione al campo
Codice: [Seleziona]
For i = 0 To filetags.count - 1
      Select Case LCase(filetags[i])
        Case "file path"
          MyTag[fname] = i
        Case "track number"
          MyTag[track] = i
        ........

Questo sulla prima riga del file csv: le restanti sono le righe con i tag
Codice: [Seleziona]
    For i = 1 To filerows.Count - 1
      filetags = Split(filerows[i], "\t")
        arrcount += 1
        arr.add(arrItem)     'è un array a lunghezza fissa
        arr[arrcount][fname] = filetags[MyTag[fname]]

A questo punto, ho un array a cui basta controllare se arr[fname] e' uguale al nome del file cercato, e poi prendere i valori (es arr[xinfo])


Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.288
  • Tonno verde
    • Mostra profilo
Re:Leggere da un array di strutture
« Risposta #12 il: 21 Dicembre 2024, 16:12:23 »
Signori e signore, saro' breve :-)
...

 :) Bene, puoi per cortesia mettere Risolto, grazie
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro