Newsgroup: it.comp.lang.pascal
Titolo: array

Ciao a tutti,
scusate la mia ignoranza, e' possibile dichiarare deglli array che
hanno come dimensione una variabile che viene chiesta ll'utente?
Se si come?
Grazie!! 
Ciao

 wrote in message
news:36bde5c6...@news.queen.it...


Se si come?
Nel pascal standard questo non e' consentito, o meglio, non ci sono gli
strumenti per poterlo fare, a meno di non implementare l'array come lista
concatenata.
Nel turbo pascal si puo' fare aggirando il compilatore e compiendo la stessa
operazione che si fa in C per l'allocazione dei puntatori.
Osserva il listato seguente :
{$R-}
{ La direttiva R- comunica al compilatore di non eseguire il controllo sugli
indici degli array, evitando quindi di segnalare come errore un'eventuale
fuoriuscita dai limiti consentiti }
type IntegerArrayType = array [0..0] of integer;
     IntegerArrayPtr  = ^IntegerArrayType;
{ Definizione molto simile a quella che avviene in C per un puntatore ad intero.
  Il problema in Pascal e' che i puntatori e gli array non possono
intercambiarsi la notazione per l'accesso agli elementi e quindi l'intero va
definito come array di 1 solo elemento }
var  IntegerPtr : IntegerArrayPtr;
{ Praticamente un puntatore ad intero, esattamente come in linguaggio C }
     Dimension, I : word;
begin
  write('Numero di interi da accettare : ');
  readln(Dimension);
  writeln('Memoria disponibile prima della allocazione = ',memavail);
  getmem(IntegerPtr, Dimension * sizeof(integer));
{ Funzione simile a "malloc()" del linguaggio C }
  writeln('Memoria disponibile dopo la allocazione = ',memavail);
 
  for I := 0 to Dimension - 1 do
  begin
    write('IntegerPtr^[',I,'] = '); readln(IntegerPtr^[I]);
  end;
end.
Questa "presa in giro" nei confronti del compilatore mi ha consentito di
scriverti il seguente listato, dove ti mostro come si puo' creare dinamicamente,
sfruttando la programmazione ad oggetti, una matrice quadrata generica :
{$R-}
uses crt;
type MatrixElementType = real;
     ColumnType        = array [0..0] of MatrixElementType;
     ColumnTypePtr     = ^ColumnType;
     MatrixType           = array [0..0] of ColumnTypePtr;
     MatrixTypePtr        = ^MatrixType;
     SquareMatrixObjectPtr = ^SquareMatrixObject;
     SquareMatrixObject    = object
                               Data : MatrixTypePtr;
                               Dim  : word;
                               constructor Init(Dimension : word);
                               procedure Put(Row, Col : word;
                                     Value : MatrixElementType);
                               function Get(Row, Col : word) :
                                     MatrixElementType;
                               destructor Destroy;
                             end;
     constructor SquareMatrixObject.Init;
     var Row : word;
     begin
       Dim := Dimension;
       getmem(Data, sizeof(ColumnTypePtr) * Dim);
       for Row := 0 to Dim - 1 do
           getmem(Data^[Row], sizeof(MatrixElementType) * Dim);
     end;
     procedure SquareMatrixObject.Put;
     begin
       Data^[Row]^[Col] := Value;
     end;
     function SquareMatrixObject.Get;
     begin
       Get := Data^[Row]^[Col];
     end;
     destructor SquareMatrixObject.Destroy;
     var Row : word;
     begin
       for Row := 0 to Dim - 1 do
           freemem(Data^[Row], sizeof(MatrixElementType) * Dim);
       freemem(Data, sizeof(ColumnTypePtr) * Dim);
     end;
var  Dimension, R, C : word;
     M : SquareMatrixObjectPtr;
     V : MatrixElementType;
begin
  clrscr;
  write('Dimensione matrice quadrata ? '); readln(Dimension);
  writeln;
  writeln('Mem Avail = ', memavail);
  writeln;
  new(M, Init(Dimension));
  for R := 0 to Dimension - 1 do
  begin
      for C := 0 to Dimension - 1 do
      begin
        write('Coefficiente(',R+1,';',C+1,') = ');
        readln(V);
        M^.Put(R, C, V);
      end;
      writeln;
  end;
  writeln('Matrice memorizzata : ');
  writeln;
  for R := 0 to Dimension - 1 do
  begin
      write('[');
      for C := 0 to Dimension - 1 do
        write(M^.Get(R, C):5:2,' ');
      writeln(']');
  end;
  writeln;
  writeln('Mem Avail = ', memavail);
  writeln;
  dispose(M, Destroy);
  writeln('Matrice distrutta.');
  writeln;
  writeln('Mem Avail = ', memavail);
  writeln;
end.
Andrea, mica uno qualunque...
--------------------------------------------------
"Ho cambiato signature, si vede ?" 
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

programmazione pulita).
Diciamo pure che anche l'altra tecnica, quella che consente di allocare
dinamicamente un array (in Turbo Pascal), non e' tanto pulita.
Nel senso che e' soggetta a tutti quei pericoli a cui vanno incontro i puntatori
del linguaggio C, dovendo essere disabilitata la direttiva $R del compilatore.
Sforare con un indice oltre il limite massimo di un array puo' significare,
infatti, invadere zone di memoria particolarmente delicate.
Volevo sottolineare una cosa : quello che dice Ale e' giustissimo, non bisogna
considerare il caso del TP (che consente l'allocazione dinamica) come la
dimostrazione del contrario.
A livello di standard (contrariamente al C) in Pascal allocare un array
dinamicamente non e' una cosa fattibile.
Andrea, mica uno chiunque...


...
Non ho controllato, ma sono sicuro che tutto funziona per il meglio.
Solo che e' il classico esempio di programmazione pascal scorretta.
Se devi usare il pascal come useresti il C tanto vale usare direttamente il
C (e probabilmente otterresti risulatati anche migliori).
Ciao

C (e probabilmente otterresti risulatati anche migliori).
Be', ma se ragionassimo cosi' il Pascal lo dovremmo buttare !
E poi, presumendo l'utilizzo del TP da parte di chi ha posto la domanda, e'
chiaro che bisogna far vedere come, limitatamente a questo dialetto del pascal
standard, sia possibile effettuare un'operazione del genere.
Andrea, mica uno qualunque...


standard, sia possibile effettuare un'operazione del genere.
ma il pascal, con che idea è nato? 
nel senso, cosa voleva ottenere Mr Wirth definendo il Pascal?
ciao
--
Carotino
Member #2 and PR of POTA (founded by Zarkan)
ICQ 19905752
Amiga's Paradise:
www.geocities.com/timessquare/labyrinth/5925/index.htm
Retrogamers Krew!

nel senso, cosa voleva ottenere Mr Wirth definendo il Pascal?
Il testo originale di riferimento del linguaggio recita :
"Il linguaggio PASCAL e' stato sviluppato puntando a due obiettivi principali :
anzitutto rendere disponibile un linguaggio adatto all'insegnamento della
programmazione come una disciplina sistematica, basata su dei concetti base
riflessi dal linguaggio in modo chiaro e naturale; indi sviluppare delle
implementazioni che siano efficienti ed affidabili sugli elaboratori attualmente
disponibili"
Come vedi e' un linguaggio nato per scopi didattici.


Come vedi e' un linguaggio nato per scopi didattici.
aaaaaaaaaaaahhhhhhhhhhhhhh:)))))))))))))))))))))))))))))))))))))))))))))
grazie:)
ciao!
