Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: g.grandi - 19 Settembre 2014, 16:59:07

Titolo: [Risolto] Creare array ad indice irregolare
Inserito da: g.grandi - 19 Settembre 2014, 16:59:07
Salve a tutti,
avrei un quesito da sottoporvi: è possibile creare una collection di soli interi con lo scopo di avere un array con indice irregolare? Cerco di spiegarmi meglio: voglio creare un array di 3 elementi di interi con i seguenti indici i[3], i[40] e i[100] senza dover dimensionare un intero di 101 elementi. La mia idea era quella di creare una collection di soli interi dove aggiungevo i 3 elementi con la chiave desiderata. Ma non è permesso istanziare un Integer con la parola chiave New (perchè è una classe nativa). Sono costretto quindi a ripiegare su un Integer[1] o su una classe costituita da un solo intero. Avete qualche scappatoia in merito?

Grazie anticipatamente per il tempo dedicatomi.

Salulti a tutti.
Giovanni
Titolo: Re: Creare array ad indice irregolare
Inserito da: vuott - 19 Settembre 2014, 17:14:49
...voglio creare un array di 3 elementi di interi con i seguenti indici i[3], i[40] e i[100] senza dover dimensionare un intero di 101 elementi
L'indice è legato al numero di elementi.  
Non comprendo come un elemento del vettore possa, ad esempio, essere il 39° (quindi n. 40 dell'indice), se la quantità di elementi è 3 !   :-\


Segnalo anche questa discussione:
http://www.gambas-it.org/smf/index.php?topic=2550.0
Titolo: Re: Creare array ad indice irregolare
Inserito da: g.grandi - 19 Settembre 2014, 21:56:45

In pratica ho una discreta quantità di numeri, senza alcuna logica, cui devo assegnare un valore, e la soluzione ideale sarebbe appunto un array che copra l'intero range dal più piccolo al più grande. Volendo cimentarmi in una finezza (per così dire di non sprecare memoria) avevo valutato la versatilità della collection che si presta bene a tale scopo. Ma mi sono imbattuto nel limite di non poter allocare dinamicamente un intero. Non posso scrivere DIM I AS NEW INTEGER e stoccare poi tale I nella collection con Add. Per ottenere questo risultato sono costretto a dichiarare un array di interi di un solo elemento, ossia DIM I AS NEW INTEGER[1]. Mi chiedevo quindi se vi fosse una scappatoia a questo limite...

Ciao, Giovanni
Titolo: Re: Creare array ad indice irregolare
Inserito da: Picavbg - 19 Settembre 2014, 23:30:43

In pratica ho una discreta quantità di numeri, senza alcuna logica, cui devo assegnare un valore, e la soluzione ideale sarebbe appunto un array che copra l'intero range dal più piccolo al più grande. Volendo cimentarmi in una finezza (per così dire di non sprecare memoria) avevo valutato la versatilità della collection che si presta bene a tale scopo. Ma mi sono imbattuto nel limite di non poter allocare dinamicamente un intero. Non posso scrivere DIM I AS NEW INTEGER e stoccare poi tale I nella collection con Add. Per ottenere questo risultato sono costretto a dichiarare un array di interi di un solo elemento, ossia DIM I AS NEW INTEGER[1]. Mi chiedevo quindi se vi fosse una scappatoia a questo limite...

Ciao, Giovanni

Scusa, ma non riesco a capire bene la casistica che ti si possa presentare. Forse vuoi dire che dei tuoi ipotetici 100 possibili numeri interi, da 1 a 100, potresti trovartene svariate combinazioni più o meno ampie, come per es. 20, 15, 80, 32. Più avanti potresti dovere aggiungere un altro numero, per es., 5, poi 2 e così via. Ora tu vorresti probabilmente sapere in quale posizione si trovi ciascuno dei numeri presenti ad un bel momento nell'array o solamente uno di essi?
 :ciao:

Titolo: Re: Creare array ad indice irregolare
Inserito da: vuott - 20 Settembre 2014, 01:23:39
In pratica ho...
Perdonami, ma io, pur rileggendo i tuoi due interventi, non ho ben capito quello che vorresti fare.  :-\
Puoi farci anche vedere un esempio del codice che vorresti idealmente scrivere ?
Titolo: Re: Creare array ad indice irregolare
Inserito da: Top Fuel - 20 Settembre 2014, 14:10:45
Se ho capito, vorrebbe usare un array di 3 elementi con il primo elemento in posizione 3, il secondo in posizione 40 e il terzo in posizione 100, ma senza nessun elemento in mezzo a loro. Poi aggiungere nuovi elementi tra di loro nelle posizioni libere. Ho capito bene?
Titolo: Re: Creare array ad indice irregolare
Inserito da: vuott - 21 Settembre 2014, 02:42:58
Se ho capito, vorrebbe usare un array di 3 elementi con il primo elemento in posizione 3, il secondo in posizione 40 e il terzo in posizione 100, ma senza nessun elemento in mezzo a loro. Poi aggiungere nuovi elementi tra di loro nelle posizioni libere. Ho capito bene?

Se fosse così, è come se uno volesse costruire una casa costituita dai soli piani 3°, 40° e 100° senza costruire gli altri piani che naturalmente dovrebbero trovarsi fra quei tre piani !   :rolleyes:

Ecco, gli elementi di un vettore (array), identificati da un indice, sono esattamente come i piani di una casa: se esiste il 40° piano vuol dire che ne esistono altri 39 prima !
Altro discorso è assegnare un valore diverso da zero o da Null a questo anziché a quest'altro elemento.

Si consideri anche che, quando si procede all'eliminazione di un elemento, non resta un vuoto, ma l'elemento che lo segue, prende all'interno dell'indice del vettore il posto dell'elemento eliminato. Esempio:
Codice: gambas [Seleziona]
Public Sub Main()

 Dim bb As Byte[] = [10, 11, 12, 13, 14, 15, 16]

  Print bb.Count, bb[3]

' Eliminiamo l'elemento di indice 3, ossia il 4° elemento:
  bb.Remove(3, 1)
  Print bb.Count, bb[3]

End


Provate, insomma, a lanciare questo semplice codice:
Codice: gambas [Seleziona]
Public Sub Main()

   Dim bb As Byte[] = [10, 11,, 13,, 15, 16]

End
Titolo: Re: Creare array ad indice irregolare
Inserito da: Top Fuel - 21 Settembre 2014, 22:50:19
Appunto, la cosa mi sembrava un pò impossibile da fare. E comunque, con le praterie immense di ram che abbiamo al giorno d'oggi, il computer manco se ne accorge di 100 byte in più o in meno. ;D
Titolo: Re: Creare array ad indice irregolare
Inserito da: vuott - 21 Settembre 2014, 23:32:20
... il computer manco se ne accorge di 100 byte in più o in meno.
Da aggiungere anche che lui potrebbe, tenendo conto del valore numerico più alto previsto assegnabile, giostrare con un tipo di variabile a bassa occupazione di memoria (byte, short), anziché per forza gli Interi (Integer).  :-\
Titolo: Re: Creare array ad indice irregolare
Inserito da: g.grandi - 22 Settembre 2014, 10:28:24

Penso di aver portato tutti fuori strada spiegnado cosa dovevo fare! E' esattamente come avete pensato e che ho risolto usando l'oggetto collection che mi permette di indicizzare gli elementi lasciando dei vuoti. Il mio quesito invece riguardava la possibilità di istanziare una classe nativa da una funzione. Questo è il passaggio che uso:

PRIVATE iEccePor AS NEW Collection

PUBLIC SUB _new(cFlussi AS Collection)

  DIM o AS Object
  DIM i AS Integer
  DIM i1 AS Integer[]

  FOR EACH o IN cFlussi
    i = cFlussi.Key
    i1 = NEW Integer[1]
    iEccePor.Add(i1, i)
  NEXT

END

In pratica per aggiungere alla collection iEccePor degli elementi che sono singoli interi, sono costretto ad usare un vettore di interi di un solo elemento (i1[]). Non posso istanziare un semplice integer da infilare nella collection. O come altra soluzione, creare una classe che contenga un solo integer. La mia domanda è quindi, vi è un modo di istanziare un semplice integer senza tirare in ballo una classe od un array?

Titolo: Re: Creare array ad indice irregolare
Inserito da: Picavbg - 22 Settembre 2014, 14:46:24
vi è un modo di istanziare un semplice integer senza tirare in ballo una classe od un array?

Ma tu l'intero da inserire nella collection lo conosci già o lo devi, in qualche modo, calcolare?
 :ciao:
Titolo: Re: Creare array ad indice irregolare
Inserito da: g.grandi - 22 Settembre 2014, 18:21:31
Citazione
Ma tu l'intero da inserire nella collection lo conosci già o lo devi, in qualche modo, calcolare?

Il programma all'avvio deve riservare lo spazio di memoria per stoccare gli interi che via via arriveranno durante l'esecuzione dello stesso. In pratica legge le temperature di un parco serbatoi ed in base al numero dello stesso va a registrarla nella relativa posizione della collection. Siccome tali silos hanno una numerazione creata ad hoc dal cliente (ma univoca) può capitare il caso che il numero di tale silos sia composto da un codice piuttosto lungo (ad esempio 3 cifre che identificano la provincia, 2 cifre per l'impianto e 3 cifre per il numero specifico del serbatoio). Ecco perchè non volevo dimensionare un vettore enorme.
Rimane però la domanda di fondo.
Se leggo da un file la numerazione dei serbatoi e voglio, a mano a mano che ne trovo uno, istanziare un intero e aggiungerlo alla collection, è possibilie? In C++ è possibile istanziare un singolo intero nello heap, in Gambas2 invece sembra non sia permesso.

Titolo: Re: Creare array ad indice irregolare
Inserito da: Picavbg - 22 Settembre 2014, 21:57:10
Il programma all'avvio deve riservare lo spazio di memoria per stoccare gli interi che via via arriveranno durante l'esecuzione dello stesso. In pratica legge le temperature di un parco serbatoi ed in base al numero dello stesso va a registrarla nella relativa posizione della collection. Siccome tali silos hanno una numerazione creata ad hoc dal cliente (ma univoca) può capitare il caso che il numero di tale silos sia composto da un codice piuttosto lungo (ad esempio 3 cifre che identificano la provincia, 2 cifre per l'impianto e 3 cifre per il numero specifico del serbatoio).
Benissimo. Ora il concetto è un pò più chiaro. Servirebbe sapere ancora una cosa: il parco serbatoi è riferito ad un solo cliente o può comprende i serbatoi di tutta la clientela? Se gestisci un cliente alla volta la soluzione è ovviamente più semplice.
 :ciao:
Titolo: Re: Creare array ad indice irregolare
Inserito da: Top Fuel - 22 Settembre 2014, 23:19:04
Da quello che leggo nella guida come chiave si possono usare solo stringhe, mentre come valore solo variant. Quindi niente interi, mi sa.
Titolo: Re: Creare array ad indice irregolare
Inserito da: Picavbg - 22 Settembre 2014, 23:30:17
Da quello che leggo nella guida come chiave si possono usare solo stringhe, mentre come valore solo variant. Quindi niente interi, mi sa.

I valori variant possono accettare qualsiasi tipo di carattere alfanumerico, quindi anche gli interi. Io, per es., utilizzo il type variant negli array destinati a ricevere sia stringhe che numeri.
La difficoltà di g.grandi, per quello che ho potuto capire è quella di non riuscire a caricare nuovi elementi o aggiornare quelli già esistenti, senza creare un array di un solo elemento.
Personalmente non vedo le difficoltà menzionate, però prima di pronunciarmi vorrei capire bene la casistica che il programma potrebbe dover gestire.
 :ciao:
Titolo: Re: Creare array ad indice irregolare
Inserito da: g.grandi - 23 Settembre 2014, 09:00:33

Sono riuscito a risolvere il mio dilemma facendo una serie di prove. La mia lacuna derivava dal non aver capito bene il funzionamento della collection. In pratica pensavo che memorizzasse il puntatore della variabile passata, invece si comporta con la stessa logica dei parametri passati alle funzioni, se sono oggetti memorizza il puntatore, mentre se sono variabili ne fa una copia. In questo modo non ho più la necessità di usare un array per un solo elemento ma posso usare un intero dimensionato nella Sub e riciclarlo a piacere. Questo è l'esempio corretto di conseguenza...

PRIVATE iEccePor AS NEW Collection

PUBLIC SUB _new(cFlussi AS Collection)

  DIM o AS Object
  DIM i AS Integer
  DIM j AS Integer

  FOR EACH o IN cFlussi
    i = cFlussi.Key
    j = 0
    iEccePor.Add(j, i)
  NEXT

END

Grazie comunque per la cortesia ed il tempo dedicatomi

Ciao, Giovanni

Titolo: Re: Creare array ad indice irregolare
Inserito da: Picavbg - 23 Settembre 2014, 23:56:38
Mi fa piacere sentire che superato l'ostacolo.
Allora, hai risolto?
Titolo: Re: Creare array ad indice irregolare
Inserito da: g.grandi - 24 Settembre 2014, 08:59:22
Si. Ho risolto.

Grazie mille.
Giovanni