Gambas-it

Gambas3 => Programmazione => Topic aperto da: akrobaticone - 08 Febbraio 2013, 23:17:11

Titolo: far partire indice array da 1
Inserito da: akrobaticone - 08 Febbraio 2013, 23:17:11
esiste in Gambas l'opzione "option base" di Visual basic che permette di far partire l'indice di un array da 1 piuttosto che da 0?

grazie
Titolo: Re: far partire indice array da 1
Inserito da: Picavbg - 08 Febbraio 2013, 23:43:29
esiste in Gambas l'opzione "option base" di Visual basic che permette di far partire l'indice di un array da 1 piuttosto che da 0?

Mai sentita.
 Effettivamente farebbe comodo. A volte infatti capita di dovere eseguire comandi su sottostringhe e correlativamente su array. Capita allora che l'indice "i" debba essere valorizzato a partire da 1 per eseguire "mid($stringa, x,2)" mentre l'array deve essere induividuato con $array[x-1].
 :ciao:
Titolo: Re: far partire indice array da 1
Inserito da: Top Fuel - 08 Febbraio 2013, 23:59:39
Nel VB era pure possibile stabilire gli indici di partenza e arrivo, tipo:

DIM array(5 TO 20) AS STRING

Anche questa era una cosa molto comoda. In effetti sono cose che mi sono un po' mancate nel passaggio a Gambas. Sarebbe bello riaverle.
Titolo: Re: far partire indice array da 1
Inserito da: akrobaticone - 09 Febbraio 2013, 00:30:31
è molto comoda poichè spesso ci si incasina non poco tra array che partono da o e quelli che partono da 1, soprattutto se sono dinamici.
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 09 Febbraio 2013, 00:43:55
Nel VB era pure possibile stabilire gli indici di partenza e arrivo, tipo:

DIM array(5 TO 20) AS STRING


Comunque... basta un ciclo For:   :-\
Codice: gambas [Seleziona]

Dim a As New Byte[21]
Dim j As Byte

  For j = 5 To 20
    a.Add(j, j)
  Next
Titolo: Re: far partire indice array da 1
Inserito da: Top Fuel - 09 Febbraio 2013, 11:30:04
Ma così restano degli elementi inutilizzati. Nel VB no.
Titolo: Re: far partire indice array da 1
Inserito da: fsurfing - 09 Febbraio 2013, 12:36:32
a me sembra del tutto inutile.. far partire l' arrai da un indice che non sia 0 :)
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 09 Febbraio 2013, 13:51:01
Ma così restano degli elementi inutilizzati. Nel VB no.

E' vero, però io non riesco a capire come si possa "iniziare" ad assegnare valori, per esempio, dal 6° elemento senza lasciare inutilizzati i precedenti 5.  :-\

Inoltre, concordo con quanto affermato da fsurfing:
a me sembra del tutto inutile.. far partire l' arrai da un indice che non sia 0 :)
Infatti, le funzioni di Gambas proprie dell'array consentono una varietà di manovra e gestione dell'array (togli e metti in questo o in quell'indice dell'array, ed altro) che lo rendono sufficientemente versatile, duttile... malleabile.  ;D
Titolo: Re: far partire indice array da 1
Inserito da: akrobaticone - 09 Febbraio 2013, 14:04:19
può essere utile quando per esempio si fa un array.count
è fastidioso mettere o togliere dall'indice un 1

e poi migliora a volte la comprensibilità del programma
 in questo opinione del tutto personale
Titolo: Re: far partire indice array da 1
Inserito da: fsurfing - 09 Febbraio 2013, 14:45:04
Citazione
Inserisci citazione
può essere utile quando per esempio si fa un array.count
è fastidioso mettere o togliere dall'indice un 1

basta fare un array.max

Citazione
e poi migliora a volte la comprensibilità del programma
 in questo opinione del tutto personale
certamente è una cosa personale , a me non piacerebbe che fosse diverso , anche perchè poi si potrebbe generare confusione considerando che ogni oggetto utilizza quel tipo di indicizzazione
Titolo: Re: far partire indice array da 1
Inserito da: Top Fuel - 09 Febbraio 2013, 16:09:55
a me sembra del tutto inutile.. far partire l' arrai da un indice che non sia 0 :)

Metti caso che l'indice di partenza sia calcolato. Mi è capitato di vedere pure questo. :)
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 09 Febbraio 2013, 16:23:08

Metti caso che l'indice di partenza sia calcolato. Mi è capitato di vedere pure questo. :)

Scusami, puoi fare un semplice esempio pratico ?
Titolo: Re: far partire indice array da 1
Inserito da: Top Fuel - 09 Febbraio 2013, 16:40:15
Esempio banalissimo: devo caricare in un array dei dati che vanno dall'anno 1982 fino al 2008.
Sarà più pratico scrivere:

DIM dati(1982 TO 2008) AS variabilestrutturata
puntando direttamente all'anno desiderato, oppure:

Dim variabilestrutturata[26]
dovendo calcolare quale elemento usare tenendo conto dell'anno di partenza scalato poi lo zero?
E' solo un esempio semplicino, ma si può fare di meglio. :)
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 09 Febbraio 2013, 16:52:34
Esempio banalissimo: devo caricare in un array dei dati che vanno dall'anno 1982 fino al 2008.
Sarà più pratico scrivere:

DIM dati(1982 TO 2008) AS variabilestrutturata
puntando direttamente all'anno desiderato, oppure:

Dim variabilestrutturata[26]
dovendo calcolare quale elemento usare tenendo conto dell'anno di partenza scalato poi lo zero?
E' solo un esempio semplicino, ma si può fare di meglio. :)

In Gambas dovrebbe essere:
Codice: gambas [Seleziona]

Dim variabilestrutturata[27] As ...quel_che_è

dato che dal 1982 al 2008 sono 27 anni (tutti compresi).

Insomma, il VB ti fa il calcolo lui, in Gambas il calcolo te lo fai prima tu.

Ma potresti fare lo stesso con il ciclo FOR:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim variabilestrutturata As New Integer[]
  Dim j As Integer

    For j = 1982 To 2008
      variabilestrutturata. Add(j)
    Next

' Se andiamo a vedere la quantità di elementi caricati,
     Print variabilestrutturata.Count

' avremo il risultato di 27 !

End


Insomma, non mi sembra poi chissà quale grande problema, eh ?   :-\
Titolo: Re: far partire indice array da 1
Inserito da: Top Fuel - 09 Febbraio 2013, 16:59:21
Ma gli indici effettivi vanno da 1982 a 2008 o da 0 a 26?

Edit: provato, la numerazione non viene memorizzata e parte sempre da 0.
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 09 Febbraio 2013, 17:31:58
Ma gli indici effettivi vanno da 1982 a 2008 o da 0 a 26?

Edit: provato, la numerazione non viene memorizzata e parte sempre da 0.

Del resto, in un array di quantità di elementi non-definita (e con elementi non ancora valorizzati), non ha senso partire, ad esempio, da 1982.  :-\

Questo può avere senso in un array definito, come ho più volte mostrato innanzi.
Esempio:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim variabilestrutturata As New Integer[27]
  Dim j As Integer


' Partiamo dal 21° elemento (cioè indice 20):

       For j = 20 To 27
' Inserisce un valore nell'elemento di indice
' indicato ad ogni giro dal ciclo FOR:
         variabilestrutturata.Add(j, j)
      Next


' Verifica:
    For j = 0 To 27
      Print variabilestrutturata[j]
    Next

End
Titolo: Re: far partire indice array da 1
Inserito da: milio - 09 Febbraio 2013, 17:42:36
potete anche usare una bella collection, cosi' come chiave gli mettete quello che vi pare... io la uso spesso
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 09 Febbraio 2013, 17:47:10
potete anche usare una bella collection, cosi' come chiave gli mettete quello che vi pare... io la uso spesso

...manca il quarto dei Tre Moschettieri !   ;D
Titolo: Re: far partire indice array da 1
Inserito da: akrobaticone - 09 Febbraio 2013, 19:18:35
nel caso di array dinamici la proprietà count ritorna sempre la lunghezza totale dell'array stesso
se servisse conoscere gli elementi realmente occupati sarebbe necessario utilizzare un'altra variabile, oppure un altro elemento dell'array che funge da contatore
trovo che con una unica istruzione la cosa è più semplice e anche la lettura del codice è migliorata


Titolo: Re: far partire indice array da 1
Inserito da: vuott - 09 Febbraio 2013, 19:33:45
Ma in un caso o nell'altro sei sempre tu che conosci a priori gli elementi che saranno riempiti da valori.  :-\
Titolo: Re: far partire indice array da 1
Inserito da: akrobaticone - 09 Febbraio 2013, 19:51:51
nel caso di un array dinamico non è detto
nel corso del programma cambia dimensione
array.add(x)
 e la dimensione la ottieni con
array.count



Titolo: Re: far partire indice array da 1
Inserito da: vuott - 09 Febbraio 2013, 20:34:29
nel caso di un array dinamico non è detto
nel corso del programma cambia dimensione
array.add(x)
 e la dimensione la ottieni con
array.count


Ma, appunto, non esiste la forza del mistero, né un'anarchia del codice, che impongono l'incremento degli elementi di un array, o quali elementi saranno valorizzati.

(http://digilander.libero.it/gliamicidellasino/images/Gif%20animate%20Asino%20(6).gif)
Titolo: Re: far partire indice array da 1
Inserito da: akrobaticone - 09 Febbraio 2013, 21:24:15
nel caso di un array dinamico non è detto
nel corso del programma cambia dimensione
array.add(x)
 e la dimensione la ottieni con
array.count


Ma, appunto, non esiste la forza del mistero, né un'anarchia del codice, che impongono l'incremento degli elementi di un array, o quali elementi saranno valorizzati.
non riesco a seguirti....
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 10 Febbraio 2013, 14:30:53
non riesco a seguirti....
Riprendo l'esempio riportato da TopFuel:

 DIM array(5 TO 20) AS STRING

Voglio dire che, anche in un caso come questo, è evidente che, di qualunque quantità siano stati incrementati gli elementi di un array non-definito,  il programmatore già sa a priori (e l'ha impostato appunto nel codice) che deve andare a leggere i valori contenuti dal 5° al 20° elemento. L'array, in sostanza, dovrà essere comunque di almeno 21 elementi.
Ma questo si può fare, come ho ampiamente dimostrato prima, agevolmente anche con Gambas.

Le azioni fondamentali che si possono svolgere sugli elementi di un array sono, come è noto e palese, riempimento con dei valori, del tipo per i quali tali elementi sono stati definiti, e lettura dei valori presenti.

Riguardo alla fase di assegnazione dei valori ad uno o più elementi dell'array mi sembra che, assegnare valori - ad esempio - dal 5° al 20° elemento, lasci pensare che:
* sono stati già comunque definiti almeno 21 elementi dell'array;
* gli elementi dall'indice 0 all'indice 3, non essendo interessati da alcuna assegnazione, continueranno a possedere valore zero.
E' dunque evidente che l'aver deciso di lasciare vacanti quei quattro primi elementi è stato determinato - qualunque essa sia - da una motivazione.
In Gambas potrei fare avere due casi, e risolvere agevolmente la cosa a seconda del verificarsi di questi:
* array di dimensione definita:
Codice: gambas [Seleziona]

Public Sub Form_Open()

  Dim ss As New String[21]
  Dim j As Byte

    For j = 5 To 20
      ss[j] = "alibaba"
    Next

'  oppure:
    For j = 5 To 20
      ss.Add("alibaba", j)
    Next
    
End


* per un array di dimensione indefinita, quell'esempio di TopFuel non è più conferente, giacché mi pare vada da sé che una definizione da un elemento ad un altro dell'array presuppone una definizione a priori degli elementi almeno minimi dell'array medesimo (come ho anche detto all'inizio).... altrimenti come potremmo parlare di 20° elemento ?

Insomma, mi sembra che VB faccia un lavoro preventivo, che invece in gambas devi svolgere espressamente tu con il codice.
Titolo: Re: far partire indice array da 1
Inserito da: Top Fuel - 10 Febbraio 2013, 14:47:50
* gli elementi dall'indice 0 all'indice 3, non essendo interessati da alcuna assegnazione, continueranno a possedere valore zero.

No, gli elementi da 0 a 3 proprio NON ESISTONO, si parte direttamente dall'elemento n. 5. :)
Se provi ad usarli VB ti manda un messaggio Out of Bound error.
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 10 Febbraio 2013, 16:27:02
* gli elementi dall'indice 0 all'indice 3, non essendo interessati da alcuna assegnazione, continueranno a possedere valore zero.

No, gli elementi da 0 a 3 proprio NON ESISTONO, si parte direttamente dall'elemento n. 5. :)
Se provi ad usarli VB ti manda un messaggio Out of Bound error.
Non capisco come non possano esistere  :-\ , se è vero che « i valori che gli indici possono assumere sono numeri interi contigui che partono da 0 o da 1». Suppongo che VB abbia un comando che gli imponga - in quel caso - semplicemente di ignorarli.
Titolo: Re: far partire indice array da 1
Inserito da: Picavbg - 10 Febbraio 2013, 23:49:22
Amici carissimi, Gambas non è VB, pertanto il mio modesto consiglio è quello di dimenticare VB e di gettare nel cestino i sogni nostalgici. Io sono entrato in Gambas con la consapevolezza di dovere impararae a conoscere un mondo nuovo e mi trovo benissimo.
Che un array cominci da uno o da 0(zero) o da 1 è solamente una convenzione mnemonica, perchè il computer è strutturato secondo lo schema del sistema binario, pertanto in qualsiasi array, sia esso definito dall'utente o incrementato man mano che si va caricando, tutti gli elementi che lo costituiscono sono, per il computer, organizzazti in maniera sequenziale, a partire dal suo primo elemento, cioè l'elemento 0(zero). Anche in VB succede la stessa cosa. La differenza sta nel fatto che il programmatore del linguaggio VB ha manipolato con l'opzione "option base =1" la maniera di gestire gli array, per cui un array di 21 elementi, definito senza l'opzione "option base=1", occupa effetivamente 21 elementi enumerabili da 0 a 20, mentre, dichiarando l'opzione "option base=1", in realtà, ne occupa 22, enumerabili da 0 a 21. Il programmatore utente, ne vede sempre 21, perchè il primo eelemento fisico (l'elemento 0) è tenuto nascosto e ben protetto, per cui non potrà essere mai né letto né scritto.
Spero di essere stato chiaro. É naturalmente possibile ottenere lo stesso risultato in Gambas, solo che, come giustamente ha detto vuott, la gestione resta a carico del programmatore utente, il quale dovrà preoccuparsi di trascurare sempre l'elemento con indice 0.
Come gestire con detta eventuale scelta gli array dinamici, lo possiamo discutere, se volete, nella prossima risposta.  ;)
 :ciao:
Titolo: Re: far partire indice array da 1
Inserito da: vuott - 10 Febbraio 2013, 23:53:23
Amici carissimi, Gambas non è VB, pertanto il mio modesto consiglio è quello di dimenticare VB e di gettare nel cestino i sogni nostalgici. Io sono entrato in Gambas con la consapevolezza di dovere impararae a conoscere un mondo nuovo e mi trovo benissimo.


Picavbg, santo e benedetto.


Ad ogni modo  :-\ , chiunque ritenga che qualche funzionalità possa essere migliorativa, può suggerirne l'implementazione a Minisini scrivendogli nella Mailing List Internazionale.
Titolo: Re: far partire indice array da 1
Inserito da: Picavbg - 12 Febbraio 2013, 00:02:57
Ora che siamo d'accordo sulla maniera di considerare il puntamento sui singoli elementi di un array (quando cominciai a studiarli si usava l'italiano e si chiamavano, perciò, tabelle), vediamo come potere gestire artigianalmente l'opzione "option base=1" di VB.

Vorrei considerare tre casi possibili di dichiarazione:
 
Codice: [Seleziona]
Dim ArrayUniDim As New String[11] 
 Dim ArrayBiDim As New String[11, 3]
 Dim ArrayDinamico As New String[ ]

La soluzione è semplice e valida per tutti i tipi di array. I primi due esempi permettono di potere scrivere istruzioni di caricamento come le seguenti:
Codice: [Seleziona]
For i = 1 to 11     'trascurando pertanto l'elemento con indice=0
 ArrayUniDim[i] = Str(i)
Next

For i = 1 to 11           'trascurando anche in questo caso l'elemento con indice=0
 ArrayBiDim[i,1] = Str(i)
 ArrayBiDim[i,2] = Str(i)
Next

Diverso è il caso degli array dinamici, che per loro natura, hanno una dimensione imprecisata, dipendente dal numero effettivo degli elementi che risulteranno caricati solo alla fine del caricamento stesso.
Per essi occorre eseguire fra le prime istruzioni della procedura, allo scopo di non dimenticarlo, un caricamento speciale, quello di un elemento vuoto:
Codice: [Seleziona]
ArrayDinamico.Add("")

Tutti i caricamenti successivi potranno avvenire con:
Codice: [Seleziona]
For i = 1 to 11     'trascurando pertanto l'elemento con indice=0
ArrayDinamico.Add(Str(i))
Next

Ci sarebbe ancora da considerare il tipo di array dinamici, pluridimensionali. Essi tuttavia possono essere gestiti come l'ArrayBiDim del secondo esempio:
Codice: [Seleziona]
Dim iDimens as integer
Dim ArrayBiDinamico As New String[iDimens,2 ]    'è dinamico perchè la sua dimensione dipende dal valore numerico contenuto in iDimens

iDimens=Int(Val(TextBox1.Text)) + 1       'la somma di 1 permetterà di trascurare successivamente l'elemento con indice 0
For i = 1 to iDimens     
 ArrayBiDinamico[i,1] = Str(i)
 ArrayBiDinamico[i,2] = Str(i)
Next

Spero di essere stato di aiuto per chi volesse utilizzare in Gambas la tacnica gestita in via automatica in VB. Personalmente penso che il gioco non valga la candela. Secondo me basta abituarsi a gestire come 1° elemento l'elemento con indice 0(zero) ed una volta fatta propria tale modalità di gestione degli array, il futuro diventerà  più semplice.  :D
 :ciao:
Titolo: Re: far partire indice array da 1
Inserito da: fsurfing - 12 Febbraio 2013, 11:56:17
Citazione
Secondo me basta abituarsi a gestire come 1° elemento l'elemento con indice 0(zero) ed una volta fatta propria tale modalità di gestione degli array, il futuro diventerà  più semplice.  Felice
quoto
Titolo: Re: far partire indice array da 1
Inserito da: akrobaticone - 12 Febbraio 2013, 13:58:32
l'opzione di far partire gli array da 1 piuttosto che da 0 da quanto ho capito è facilmente ottenibile con altri sistemi
semplicemente è una cosa in più che a volte può risultare comoda, soprattutto se si è stati abituati ad usarla.