Newsgroup: it.comp.lang.c
Titolo: int **x o int *x[]?

ciao a tutti.
sto scrivendo --in windows, compilatore visual c++ 6 sp5-- un
programma dove devo costruire una matrice bidimensionale quadrata di
interi. le dimensioni della matrice vengono decise runtime sulla base
di un numero letto da un file, plausibilmente diverso ad ogni
esecuzione.
dunque devo lavorare con un puntatore ad un'area di memoria che vado
ad ottenere con una malloc, ma poi non so come gestire gli indici,
perche' se faccio un:
int **x;
...
	if ((predecessori=(TIPOINDICE
**)malloc(nnodi*nnodi*sizeof(TIPOINDICE)))==NULL)
		return (-1);
...
x[s][i]=15;
...
ho un access violation.
se facessi un:
int *x[];
andrei meglio? dopo non saprei come gestire gli indici... e poi non
sono nemmeno convinto di  come fare la malloc, in quel caso...
non so: che consiglio mi date --a parte il "lascia stare", cosa che
non posso fare perche' e' per la mia tesi =)--?
saluti e grazie in anticipo.
-- 
      Gianni "bugbarbeq" Rondinini, 26+15, RA, 193, 152
   VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 BMW 530D "BatMobile EVO" Driver - Subarone da 500 CV dreamer
Kawasaki "Gas Gas" ZZ-R 1100 - HD Electra Ultra Classic Dreamer
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

 programma dove devo costruire una matrice bidimensionale quadrata di
devi fare cosi`:
 int **m;
 int ind, dim_x, dim_y;
 dim_x = 5; /* o valori letti a runtime... */
 dim_y = 7;
 m = (int **) malloc(dim_y * sizeof(int *));
 if (m == NULL)
 	return;
 for (ind = 0; ind < dim_x; ind++) {
 	m[ind] = (int *)malloc(dim_x * sizeof(int));
        if (m[ind] == NULL)
        	return;
 }
Ciao
Stefano
-- 
SG

devi fare cosi`:
[...]
ti ringrazio molto.
non avevo pensato di inizializzare singolarmente il primo layer di
puntatori.
saluti.


 letto da un file, plausibilmente diverso ad ogni esecuzione. dunque 
Che bisogno hai di fare un doppio puntatore?
Puoi usare la forma:
int *matrix = NULL;
matrix = (int *) malloc (DIM*DIM*sizeof(int));
if (matrix == NULL)
	ERRORE;
else
	FAI CIO' CHE VUOI
Per lavorare sulla matrice poi, puoi benissimo gestire ogni elemento sapendone
la posizione e la dimensione della matrice (se l'hai allocata sai 
quanto è la sua dimensione ;) ).
Se ad es la dimensione è 10*10 e vuoi accedere alla riga 4 colonna 8
basta che utilizzi la forma:
matrix[4*10+8]  (riga*numerocolonne+colonna)
tutto qui ;)
Ciao :)

matrix[4*10+8]  (riga*numerocolonne+colonna)
esatto, ma matrix[4][8] non e' ancora piu' facile, veloce ed
immediato? :)
tu dirai: bravo pirla, ma intanto non sapevi come allocarla :)
e io ti rispondo che hai ragione, solo che una volta imparato, sono a
posto tutta la vita :)
saluti e grazie comunque per il consiglio.


 }
Solo una nota che poco ha a che fare con i giochi... comunque
ho visto spesso ignorato l'approccio:
  m = my_malloc(dim_y * sizeof(int *));
  m[0] = my_malloc(dim_x * dim_y * sizeof(int));
  for (i=1; i<dim_y; i++)
    m[i]=m[i-1]+dim_x;
che rispetto alla versione che vedo piu' spesso usata (la tua)
ha solo due allocazioni e permette sia di accedere con
doppio indice che usando un accesso lineare visto che
tutti gli elementi della matrice risultano contigui (altra
proprieta' interessante per le CPU moderne).
Si potrebbe anche usare una sola allocazione, ma si dovrebbe
litigare con gli allineamenti...
Andrea
BTW:
  Ovviamente il loop che hai scritto voleva usare dim_y
  come limite e non dim_x ... giusto ?

  come limite e non dim_x ... giusto ?
sicuramente si'.
comunque nel mio caso --sono quello della domanda iniziale-- le
dimensioni sono *sempre* uguali e quindi sono a posto comunque.
saluti e grazie anche a te.


 dimensioni sono *sempre* uguali e quindi sono a posto comunque.
Beh, questo è suicidarsi, se il codice lo copi da un altra parte o non sono
più uguali? Significa che ti salvi, ma un bug del genere per ritrovarlo in
seguito ci metteresti un paio d'anni(non perché tu sia incapace, ma perché è
così; oltretutto i bug coi puntatori sono già stronzi di loro, l'errore ti
può comparire decine di linee dopo).
Ciao
--
Paolo Giarrusso
Per rispondere togliere solo "TOGLIMI" dall'indirizzo, non _spam.