Newsgroup: it.comp.lang.pascal
Titolo: Matrici dinamiche

Ciauz,
qualcuno saprebbe dirmi se in pascal č possibile creare array dinamici (che
cioč non abbiano un numero fisso deciso a design time di elementi ma un
numero variabile deciso a runtime) ?
Se si come si dichiarano e usano?
Grazie.

 cioè non abbiano un numero fisso deciso a design time di elementi ma un



Mi pare non sia possibile fare quello che chiedi, almeno con le matrici;
potresti usare dei puntatori per ottenere lo stesso risultato ma perderesti
molte delle facilitazioni che mettono a disposizione strutture dati come i
vettori e le matrici.
Ciauz
--
KNOWLEDGE IS POWER
http://www.sverzat.com


wrote:

Guarda la procedura CreaMatr nel sorgente del programma MrCircus al
sito
 
www.lagrandezucca.cjb.net
Non ho voglia di fare il copia-incolla, scusami.
Omega e' omega e basta.

 ha scritto nel messaggio
news:AyxJ8.33198$ie.7...@twister2.libero.it...

Certo che si puņ, una una struttura dati dinamica, nella fattispecie una
lista.
Cooper.
PS: Matrici e vettori sono strutture dati statiche....

Rimedio alla mia precedente pigrizia, il mattino ha l'oro in bocca
(odio questo proverbio).
PROGRAM RikiTikiTavi;
CONST
  nmax = 1000;
TYPE
  tipo=REAL;
  vett  = ARRAY[1..nmax] OF tipo;
  vettd = ^vett;
  matr  = ARRAY[1..nmax] OF vettd;
  matrd = ^matr;
VAR
  n : INTEGER;
  S : matrd;
PROCEDURE CreaMatr(VAR m : matrd; dim : INTEGER);
{ routine per l'allocazione dinamica con controllo sull'heap }
VAR
  i       : LONGINT;
  sp1,sp2 : WORD;
BEGIN
    sp1:=dim*SIZEOF(vettd);
    sp2:=(dim+1)*SIZEOF(tipo);
    { </ qui i e' usato anche per la memoria totale }
    i:=sp1+dim*sp2;
    { />}
    IF i>MAXAVAIL THEN
        m:=NIL
    ELSE
      BEGIN
        GETMEM(m,sp1);
        FOR i:=1 TO dim DO
          BEGIN
            GETMEM(m^[i],sp2);
            FILLCHAR(m^[i]^,sp2,0);
          END;
      END;
END;
BEGIN
  n:=2;
  CreaMatr(S,n);
  S^[1]^[1]:=1.0;
  S^[1]^[2]:=1.0;
  S^[2]^[1]:=1.0;
  S^[2]^[2]:=1.0;
END.


 ha scritto nel messaggio
news:AyxJ8.33198$ie.7...@twister2.libero.it...


   matrd = ^matr;
....con un po' di ottimizzazione :-)    Beh,   questo perchè il pascal
elimina le strutture ridondanti.... alla compilazione.... :)

tutto a priori... ma di volta in volta.
Quella che viene creata e' una lista di puntatori a vettori che
vengono allocati contiguamente in memoria (infatti si usa MaxAvail che
ritorna la dimensione del blocco piu' grande dell'heap e non MemAvail
che da' la somma di tutti i blocchi), per tale motivo non ci sono
puntatori al nodo successivo in quanto basta conoscere il "passo" dato
dalla lunghezza di ogni vettore. Tale lunghezza puo' essere fornita a
run-time tramite l'inserimento in una variabile (anche se nel
programmino di esempio veniva posta a 2) purche' sia inferiore a nmax
(anche qui 1000 e' di comodo, di fatto si puo' mettere qualunque
numero accetti il compilatore come dimensione di un array senza temere
di occupare memoria in quanto e' un tipo non una variabile); la lista
puo' anche venire naturalmente deallocata usando al posto della GetMem
la FreeMem in modo del tutto simile. Quindi mi sembra che le
operazioni siano dinamiche e non statiche, la "matrice" viene
memorizzata nell'heap, dove poi il compilatore piazzi quest'area e' un
problema suo.
Omega e' omega e basta.
PS: Un sentito ringraziamento a Cooper per l'aiuto a vincere la mia
ignobile pigrizia :-)


Ok Ok, ma č quello che avevo detto...  ho solo precisato che.... un nodo č
formato da un campo informazione e un campo puntatore.
Un campo informazione puņ essere anche un vettore come una qualsiasi
struttura dati, array, record, variabili, etc etc... e da qui che una lista
non č altro che una concatenazione sequenziale di nodi...
In altre parole ho detto quello che tu avevi gią ripetuto :-)
Per rendere meglio l'idea.... supponiamo che A, B, C, D fossero dei nodi...
una lista sarebbe:
     ^start --> A  -->  B .--> C --> D
 ma nulla vieta di definire il campo informazione di A o di altri nodi come
vettori, es:
Type LISTA = ^TLISTA;
         TLISTA = Record
                             INFO: ARRAY [1..1000] OF Longint;
                             PUNT:  LISTA;
                          End;
Giusto per fare un esempio....  e quindi quello che si era detto in
partenza....
Con stima, Cooper.

 wrote in message
news:AyxJ8.33198$
ie.7...@twister2.libero.it

dato il fatto che una matrice e' un array di array , basta avere array
dinamici.
ESISTONO
dove?
il pascal non li ha.
il delphi ha gli open array (non te li spiego, scusami)
il FreePascal ha gli open array e cio' che chiedi tu, 
ma solo nella versione 1.1 non ufficiale, quindi ancora con qualche
 problema esistenziale :-)
il sito e' 
www.freepascal.org
 
ftp.freepascal.org
esempio var a:array of ilmiotipo;  non ho messo la quantita' :-) 
(mi pare che il primo elemento sia nella posizione 0)
esiste la funzione setlength o simile....bisogna leggere l'halp
La compatibilita' col pascal e' quasi totale. ti consiglio di passare 
al freepascal. ha molte caratteristiche in +
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG