Newsgroup: it.comp.lang.c
Titolo: dimensioni array

Ciao a tutti
Utilizzando lcc-win32 per la prima volta mi e' capitato di dover allocare
dinamicamente degli array bidimensionali ma la cosa strana e' che, se
dichiaro le due dimensioni (inseribili dall'utente) come variabili di tipo
int, la compilazione va a buon fine ma in generale il programma da' un
errore generale di protezione; il tutto curiosamente si risolve con due
printf delle dimensioni inserite dall'utente; poi mi e' balzato alla mente
un lontano ricordo riguardo al fatto di dichiarare le dimensioni di un array
come static int; a questo punto vi chiedo, esiste una giustificazione?
(Anche perche' non su tutte le piattaforme succede la stessa cosa...)
Grazie in anticipo.
Ciao
-- 
Alessandro Toso
Dipartimento di Ingegneria Aerospaziale
Politecnico di Milano
Tel 
+39 02 2399 8032

 (Anche perche' non su tutte le piattaforme succede la stessa cosa...)
Questo sembra proprio indice di accesso scorretto alla memoria...
Il codice aiuterebbe a capire il problema.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
news:556c5718e7e7b409911...@mygate.mailgate.org...

Scusate, ora posto il codice:
Nel main che include l'header my_lib.h
________________________________________
static int righe,colonne;
double** mat;
printf("\nInserire il numero di righe : ");
scanf("%d",&righe);
printf("\nInserire il numero di colonne : ");
scanf("%d",&colonne);
mat = alloca_matrice(0,righe,colonne,0.);
________________________________________
Nel file my_lib.c
________________________________________
double** alloca_matrice(int type,int row,int col,double val)
{
     int i,j;
    double** mat;
    mat = (double**)malloc(row*sizeof( void* ));
    for ( i = 0; i < row; i++)
        mat[i] = (double*)malloc(col*sizeof( double ));
    for ( i = 0; i < row; i++)
         for ( j = 0; j < col; j++)
                mat[i][j] = val;
    return mat;
}
Grazie Ciao


 }
Per il resto mi sembra che la funzione sia ok (a parte la considerazione 
sul size_t).
-- 
Enrico `Trippo' Porreca

 sul size_t).
Anche a me sembra che il programma sia corretto (cast inutili a parte),
il problema dev'essere da qualche altra parte.


 altro puntatore).
Possibile, ma lo standard garantisce solo che sizeof (void*) == sizeof 
(char*), e dato che non costa molta fatica (in questo caso) rendere il 
codice portabile, perche` non farlo?
-- 
Enrico `Trippo' Porreca


Intendevo `possibile' nel senso che in diverse implementazioni di cui 
sono a conoscenza accade che tutti i puntatori abbiano la stessa dimensione.
-- 
Enrico `Trippo' Porreca

"Alessandro Toso" ha scritto: 
: static int righe,colonne;
: double** mat;
: 
: printf("\nInserire il numero di righe : ");
: scanf("%d",&righe);
: 
: printf("\nInserire il numero di colonne : ");
: scanf("%d",&colonne);
io sostituirei la riga precedente con (nota lo spazio prima del %):
scanf(" %d", &colonne);
printf("righe: %d; colonne %d\n", righe, colonne);
da testare con una matrice con piu` di tredici colonne.
Massimo


Perche` tutto cio`? Lo spazio bianco viene comunque saltato.
E perche` proprio 13 colonne?
-- 
Enrico `Trippo' Porreca

 (char*),
Ma sembra che lo standard non affermi nemmeno questo... :-)


"Enrico `Trippo' Porreca" ha scritto
: 
: Perche` tutto cio`? Lo spazio bianco viene comunque saltato.
Lo spazio dovrebbe servire a saltare il newline che vale 13, che
verrebbe assegnato a colonne se avesse usato %c. 
In effetti il suo errore dovrebbe essere quello di non verificare 
se la scanf fallisce.
Massimo

 Ma sembra che lo standard non affermi nemmeno questo... :-)
     6.2.5 Types
     [...]
  27 A pointer to void shall have the same representation and
     alignment requirements as a pointer to a character type.
-- 
Enrico `Trippo' Porreca

 verrebbe assegnato a colonne se avesse usato %c. 
Ma appunto, l'OP non ha usato "%c" ma "%d", quindi il newline viene 
semplicemente scartato. Prova a compilare ed eseguire le due versioni,
il risultato e` identico.
-- 
Enrico `Trippo' Porreca

 wrote in message
news:3F717CC5...@lombardiacom.it...

Risolto!
era molto piu' subdolo nel senso che dopo le due scanf ne usavo un'altra per
prendere un altro parametro (char) ma ahime in modo sbagliato cosicche'
andava a sovrascrivere su una zona di memoria occupata da una delle due
variabili precedenti. L'artificio dello static risolveva allocando in una
zona diversa di memoria.
A questo punto chiedo scusa per aver aperto un dibattito fuorviante.
Grazie a tutti
Ciao
-- 
Alessandro Toso
Dipartimento di Ingegneria Aerospaziale
Politecnico di Milano
Tel 
+39 02 2399 8032

 
http://www.eskimo.com/~scs/C-faq/q5.17.html
Ogni giorno si impara qualcosa :-)
