Newsgroup: it.comp.lang.delphi
Titolo: Array

Buon giorno a tutti.
Ho un problema con gli array:
Devo creare un oggetto 'tile' a due dimensioni che abbia una struttura
record.
esempio:
Tile[x,y].occupato = 12
ho creato la struttura TypeTile:
  TypeTile = record
    Terreno:    integer;
    Occupato:   integer;
  end;
poi ho dimensionato il mio array
  type Tilea = array of array of TypeTile;
e ho creato la mia variabile
var
  tile: Tilea;
tutto questo non mi funziona, mi da l'errore: ' Array type required'.  Dove
sbaglio?

 ha scritto



mah...io non capisco molto la riga
type Tilea = array of array of TypeTile;
perchè è ripetuto due volte "array" ? E' un errore in questo messaggio o io
sono un po' arrugginito con Delphi ?
Io l'avrei così dichiarato:
type TypeTile = record
      Terreno:    integer;
      Occupato:   integer;
     end;
type Tilea = array [1..100] of TypeTile;
vabbè, ho specificato la dimensione, ma puoi farlo anche dinamico, a seconda
di come serve a te.
Ti saluto....ciao !!
Antonio Tarolla

 di come serve a te.
Mah la dichiarazione che ha fatto sarebbe per un array bidimensionale, il
fatto e' che non so quanto sia buono usarne uno dinamico.
le matrici dinamiche sono quantomai scomode, ad esempio per dimensionarle
devi prima dimensionare la prima dimensione, poi ogniuna delle seconde.
Conviene piuttosto usare un array monodimensionale con dimensione
sizex*sizey, e poi accedervi con l'indice y*sizex+x.
ad esempio per la casella 5,10 si userebbe
tile[5+10*sizex]
e' un po scomodo, ma puoi sempre incapsulare la chiamata in una classe e
metterci una proprieta' array a due dimensioni per accederci.
In alternativa puoi usare una matrice statica con grandezza massima, e
utilizzare solo le tiles che ti servono.. a meno che tu non abbia milioni di
caselle, non e' un grandissimo spreco
ciao!                {MSX}


Sto impazzendo.
Ok, ho creato una matrice statica:
type Tilea = array [1..200, 1..200] of typetile;
pero non funziona ugualmente
 alla riga:
 Tile[x, y].Occupato := NRSprites;
mi da l'errore:
[Error] RTSGame.pas(255): Array type required
le mie variabili 'x y' di che tipo devono essere? io le ho dichiarate come
'integer'. Va  Bene?
le mie dichiarazioni di TypeTile e Tile le ho messe nella sezione
'Interface'

Dopo qualche tentativo credo di aver capito l'origine del problema, non ho
trovato pero la soluzione.
Se dichiaro la variabile
 var tile: Tilea;
nella sezione 'Implementation' l'errore non me lo da, pero' il problema é
che ho un errore di 'Undeclared identifier: 'Tile'' nelle altre unit che
usano questa variabile.
Quindi l'errore non é su come ho dichiarato la variabile ma é dove la
dichiaro e il problema é di renderla pubblica a tutte le Units.

 ha scritto

le altre unit, devono conoscere in qualche modo il tipo "Tilea", altrimenti
ti darà sempre errore.
E' poi logico che per poter usare il tipo "Tilea" devi dichiarare una
variabile che lo rappresenti, altrimenti come gli allochi la memoria ?
Per dichiararla pubblica a tutte le uses, devi dichiarare l'unit che
contiene il tipo "Tilea" nella lista delle uses delle altri unit che
intendono usare questo tipo di dato, altrimenti come fanno a conoscerlo ?
Oppure potresti dichiarare il tipo "Tilea" in ogni unit, ma è meglio evitare
ripetizioni di codice.
Per queste cose, conviene creare un'unit che contiene tutti i tipi e
variabili globali del programma che poi puoi usare nelle varie unit che lo
compongono.
Inoltre vorrei precisare che l'array che ho dichiarato io, è
monodimensionale.
Ora ho riletto il tuo messaggio. Ieri mesà che ero un po' distratto perchè
non ho proprio fatto caso al fatto che a te serviva un array bidimensionale
che avesse come tipo il record sopra dichiarato.
Vabbè, se intendi farlo dinamico usa pure l'idea di "MSX" oppure fai come ti
ho detto nel primo messaggio dichiarando l'array a due dimensioni. Poi
ricordati di usare una variabile ed inoltre se vuoi che sia visibile in
altre unit, tieni presente ciò che ti ho detto in questo messaggio.
Per ulteriori chiarimenti, se vuoi scrivimi pure in privato.
Ti saluto...ciao.
Antonio Tarolla

Quello che non riesco a capire é che se dichiaro la mia variabile
 var Tile: Tilea;
nella sezione interface la mia stessa unit non riesce a vedere questa
dichiarazione dato che mi da l'errore:" Array type required" nella stessa
Unit dove ho dichiarato la mia variabile.
Se la dichiaro nella sezione Implamentetion l'errore non me lo da sulla
stessa Unit ma nelle altre unit, come é logico che sia.
Allora la mia domanda é: perché la mia unit non vede la variabile quando la
dichiaro della sezione Interface?
Tutte le altre variabili le vede, solamentte questa da problemi. E' vero
anche che é la sola che una una matrice bidimesionale ed é di un tipo un po
speciale. Non sara un BUG di delphi 4?
Ciao e grazie per l'interessamento.


Ok ho risolto come mi hai suggerito tu. Comunque la cosa non mi é chiara del
perché non funzionava.
Sono ancora un novellino in delphi. Sto traducendo un motore 2D fatto in VB.
Pensavo che la traduzione fosse molto piu semplice ( meno male che non lo
é!! senno' che noia sarebbe!! ;) )
Grazie Antonio.

 perché non funzionava.
Il fatto e' questo:
Esiste gia' un identificatore Tile, che e' un metodo di TForm.
Per questo, siccome il tuo codice lo scrivi dentro a un metodo di TForm, la
chiamata al metodo Tile ha la precedenza nell'algoritmo di risoluzione degli
identificatori.
La soluzione potrebbe essere cambiare nome o premettere il nome della tua
unit, ad esempio:
miaunit.tile[ecc ecc..
ciao!                {MSX}
--
{MSX}  -  
http://msx.rules.it
Mantenitore delle FAQ di it.comp.lang.delphi,
reperibili qui: 
http://gpi.infomedia.it/abc/delphi/FaqDelphi.txt

 identificatori.
Ok tutto chiaro ora. Grazie