Newsgroup: it.comp.lang.c
Titolo: Creazione matrice dinamica: non funziona :(

Qualche anima pia potrebbe aiutarmi dicendomi cosa non va nel seguente
programma?
#include <stdio.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
typedef int boolean;
int R,C,risultato;
int ** A;
boolean create_matrix(int **, int, int);
void read_matrix(int **, int, int);
main()
{
printf("Questo programma crea una matrice dinamica di dimensioni RxC con R e
C forniti come parametri e la restituisce con ciascun elemento inizializzato
al valore dato dalla somma tra il corrispondente indice di riga e quello di
colonna\n\n");
do {
printf("\n\nInserisci il numero di righe:");
scanf("%d", &R);
printf("\n\nInserisci il numero di colonne:");
scanf("%d", &C);
} while (R==0 || C==0);
risultato = create_matrix(A, R, C);
if (risultato == FALSE)
   printf("\n\nImpossibile creare matrice");
else
   read_matrix(A, R, C);
}
boolean create_matrix(int ** A, int righe, int colonne)
{
int i,j;
*A=(int *)malloc(sizeof(int)*righe*colonne);
if(*A==NULL)
  return FALSE;
else
  for (i=0; i<righe; i++)
      for (j=0; j<colonne; j++)
      {
        *A[i*righe+j]=i+j+2;
      }
  }
   return TRUE;
}
void read_matrix(int ** A, int righe, int colonne)
{
int i,j;
  for (i=0; i<righe; i++)
    printf("\n\n");
      for (j=0; j<colonne; j++)
      {
        printf("%d ", *A[i*righe+j]);
      }
  }
}
A parte che nelle matrici 2x2 sbaglia a fare i conti, il problema principale
è comunque che non riesce a fare matrici da 2x3 (o 3x2) in su.
Dove sbaglio?
Grazie mille a chi mi vorra rispondere.
Palmina

 *A=(int *)malloc(sizeof(int)*righe*colonne);
questo occupa spazio solo per int, non per puntatori int e quindi deve
essere un:
*A=(int *)malloc(sizeof(int *)*righe*colonne);
"t2t" <palm...@NOSPAMfreemail.it> wrote in message
news:LPwg7.24916$TS4....@news2.tin.it...


 *A=(int *)malloc(sizeof(int *)*righe*colonne);
Ti ringrazio, adesso sembra andare.
Il problema è che non riesco a farlo funzionare come voglio.
Ex uan matrice 3x3 anziché venire:
2   3   4
3   4   5
4   5   6
viene
0   6   6
6   6   6
6   6   6
Perchè? Sicuramente sbaglio qualcosa ma non capisco cosa :(

 Perchè? Sicuramente sbaglio qualcosa ma non capisco cosa :(
Ci sono ancora due errori (in realta' tre, ma si tratta di una decisione
tua):
se dichiari un array di puntatori su puntatori di int dovresti ancora
assegnare alla colonna (o riga) i valori dei puntatori.
come modello di memoria hai creato con il primo malloc (forse ne hai creato
troppi????):
[puntatore 1]
[puntatore 2]
[puntatore 3]
...
[puntatore n-colonne]
ad ogni puntatore dovresti ora assegnare un altro array con malloc per le
righe...
a[0]=malloc(...);
a[1]=malloc(...);
[...]
a[colonne-1]=malloc(...); // un bel for non sarebbe male
Con questo metodo le tue assegnazioni sono da riscrivere completamente e
diventano qualcosa come
a[j][i]=i+j+2;
invece puoi anche usare
int *a;
a=malloc(colonne * righe * sizeof(int));
nei due loop per scrittura e lettura toglie *:
        a[i*righe+j]=i+j+2; // e qui c'e' ancora un errore...
In questo caso usi un array della dimensione uno per avere una array a due
dimensioni (dipende come lo vuoi tu).
Controlla bene questa parte:
  for (i=0; i<righe; i++)
  {
      for (j=0; j<colonne; j++)
      {
        *A[i*righe+j]=i+j+2;
      }
  }
ovviamente crei dei indici sbagliati ('riga' * righe + colonna) [qualcosa
come righe al quadrato)
devi immaginarti che una riga e lunga il numero delle colonne:
i*colonne+j...
Riordina un po' tutto ;-)
J.
"t2t" <palm...@NOSPAMfreemail.it> wrote in message
news:dlMg7.11308$vC1.1...@news1.tin.it...


 i*colonne+j...
Ma quello che vorrei  fare è memorizzare i valori della matrice su un array
monodimensionale, e facendo i*righe+j posso (almeno credo).
Ad esempio in una matrice 3x3 il valore x11 ("Ics-uno-uno") è il primo
elemento dell'array, il valore x12 il secondo, x13 il terzo, x21 il quarto
x22 il quinto, x23 il sesto, x31 il settimo, x32 l'ottavo e x33 il nono.
Così cosa c'è che non va?
Per ora mi hai messo ancora più confusione in testa :D


 Per ora mi hai messo ancora piů confusione in testa :D
:)
Quando ci sono problemi cerca di usare esempi atomici e chiari,una matrice
3*3 non e' una buona scelta, 1*2 sarebbe meglio (che ne pensi di 1x1?).

 ha scritto nel
messaggio news:i93h7.3734$i81.1...@news.infostrada.it...

Ok, cosě dovrebbe andare ma non č esattamente l'esercizio che mi č stato
chiesto.
In questo modo (correggimi se sbaglio, visto che č da molto poco che studio
il C) potrei creare una matrice dinamica ma poi non potrei richiamare i dati
di questa per lavorarci (ad esempio per fare la trasposta, l'inversa o
altro).
dimmi se sparo cavolate :)

 dimmi se sparo cavolate :)
Niente cavolate
Allora, non e' un problema del C, ma soltanto un problema dei algoritmi e di
astrazione.
Scrivere funzioni che facilitano' l'accesso a delle matrici e le sue
trasformazioni sono indipendente dal modello del salvataggio dei dati.
Ad esempio lo schermo grafico (semplificato): in realta' un array di una
dimensione, viene poi visualizzato dal Hardware in 2 dimensioni.
Il programmatore crea modelli 3 dimensionali li butta in 2 dimensioni, ma in
realta' sono monodimensionale nella memoria del computer. Ma quando crea il
modello tridimensionale non pensa affatto come verra' salvato nella memoria
del computer (o della scheda grafica).
quindi scrivi funzioni come:
inversa(MATRIX *a);
scalar(MATRIX *a, MATRIX *b, int val);
nel tuo caso puoi sempre leggere e scrivere i dati, e quindi creare le tue
funzioni richieste... Forse all'inizio un po' complesso ma alla fine diventa
il pane quotadiano....
altro esempio se tu scrivi una funziona:
int getMatrixElement(int *a, int colonna, int riga)
{
    return a[riga*MAXCOLONNA+colonna];
}
la puoi usare senza calcolare sempre l'index nella matrice a mano:
int sumMatrix(MATRIX *a) // stupido sommare dei singoli elementi...
{
    int x,y;
    int somma=0;
    for (x=0; x < MAXCOLONNA; x++)
    for (y=0; y < MAXRIGA; y++)
        somma+=getMatrixElement(a,x,y);
    return somma;
}
Con questo livello di astrazione aumenti la leggibilita' del codice della
funzione sumMatrix; la scrivi solo una volta dopodiche' non devi piu'
pensare.
J.


Ok, il problema è che non ho ancora capito cosa non va nel primo programma
che ho postato, ovvero perché gira ma di fornisce risultati sbagliati.
Vorrei sapere cosa modificare in quel sorgente per far andare tutto a posto,
non un altro programma realizzato con un sistema totalmente diverso.
Mi rendo conto di stare abusando della tua disponibilità, ma non so proprio
dove sbattere la capoccia :(

 dove sbattere la capoccia :(
Sbattendosi si impara... :-P
Direi di riscrivere il programmino senza guardare (o pensare, facile dirsi)
il vecchio sorgente.
Sicuramente esci con qualcosa che funziona meglio. Anche se ci sono solo due
tre problemini in quel sorgente.
Altro consiglio, cerca di abituarti in casi difficili di usare un debugger,
guardando le variabili, il flusso del programma.
Si impara davvero molto con questi.
;-)
Che sistema usi?
J.

 J.
Per osa uso djgpp come compilatore e basta
che debugger mi consigli?
Ho provato a rifare il programma semplificando tutto e eliminando le
funzioni (si lo so che è meno leggibile ma mi serve per capire dove sbaglio
:))
Provando a fare una matrice NxN identica il seguente programma funziona alla
perfezione (EVVAII! :D):
#include <stdio.h>
#include <malloc.h>
int n,i,j;
int * p;
main()
{
printf("\n\nIntroduci n:");
scanf("%d", &n);
p=(int *)malloc((sizeof(int))*n*n);
for (i=0; i<n; i++)
{
  for (j=0; j<i; j++)
        p[i*n+j]=0;
    p[i*n+i]=1;
    for (j=i+1; j<n; j++)
        p[i*n+j]=0;
}
for (i=0; i<n; i++)
{
 printf("\n\n");
  for (j=0; j<n; j++)
        printf("%d", p[i*n+j]);
}
}
ora se però voglio provare se funziona utilizzando un doppio puntatore (che
mi servirà se volgio spezzare il programma uilizzando delle funzioni) non
funziona più ma mi fornisce una matrice NxN non identica. Esempio
(n = 3)
011
111
111
anziché
100
010
001
Il sorgente è questo:
#include <stdio.h>
#include <malloc.h>
int n,i,j;
int ** p;
main()
{
printf("\n\nIntroduci n:");
scanf("%d", &n);
*p=(int *)malloc((sizeof(int))*n*n);
for (i=0; i<n; i++)
{
  for (j=0; j<i; j++)
        *p[i*n+j]=0;
    *p[i*n+i]=1;
    for (j=i+1; j<n; j++)
        *p[i*n+j]=0;
}
for (i=0; i<n; i++)
{
 printf("\n\n");
  for (j=0; j<n; j++)
        printf("%d", *p[i*n+j]);
}
}
Dov'è che sbaglio?