Autore Topic: [Risolto] Creare array ad indice irregolare  (Letto 2082 volte)

Offline g.grandi

  • Gambero
  • **
  • Post: 51
    • Mostra profilo
[Risolto] Creare array ad indice irregolare
« il: 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
« Ultima modifica: 25 Settembre 2014, 10:23:26 da g.grandi »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #1 il: 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
« Ultima modifica: 20 Settembre 2014, 01:18:46 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 g.grandi

  • Gambero
  • **
  • Post: 51
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #2 il: 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

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #3 il: 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:

:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #4 il: 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 ?
« 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #5 il: 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?
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #6 il: 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
« 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #7 il: 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
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #8 il: 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).  :-\
« 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 g.grandi

  • Gambero
  • **
  • Post: 51
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #9 il: 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?


Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #10 il: 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:
:ciao:

Offline g.grandi

  • Gambero
  • **
  • Post: 51
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #11 il: 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.


Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #12 il: 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:
:ciao:

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #13 il: 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.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Creare array ad indice irregolare
« Risposta #14 il: 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:
:ciao: