Autore Topic: far partire indice array da 1  (Letto 3608 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #15 il: 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
« Ultima modifica: 09 Febbraio 2013, 17:42:04 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 milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #16 il: 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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #17 il: 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
« 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 akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #18 il: 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


"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #19 il: 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.  :-\
« 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 akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #20 il: 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



"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #21 il: 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.

« Ultima modifica: 09 Febbraio 2013, 23:26:38 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 akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #22 il: 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....
"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #23 il: 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.
« Ultima modifica: 10 Febbraio 2013, 23:55:39 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #24 il: 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.
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.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #25 il: 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.
« 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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #26 il: 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:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #27 il: 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.
« Ultima modifica: 11 Febbraio 2013, 01:17: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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #28 il: 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:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: far partire indice array da 1
« Risposta #29 il: 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