PDA

Visualizza la versione completa : [C] problema allocazione matrice dinamica


mariella_88
24-05-2014, 11:50
Salve, ho scritto questo codice:
#include <stdio.h>
#include<stdlib.h>





int main(void) {


int righe, colonne, i, j;
//printf(" righe");
scanf("%d", &righe);
//printf("\n");
//printf("colonne");
scanf("%d", &colonne);
//printf("\n");


int **matrice;
matrice = (int**)malloc((righe * sizeof(int*)));
for (i = 0; i < righe; i++) {
matrice[i] = (int*) malloc(colonne * sizeof(double));
}


for(i=0;i<righe;i++){
for(j=0;j<colonne;j++){
printf("inserisci elemento riga %d e colonna %d",i,j);
scanf("%d",&matrice[i][j]);
printf("\n");
}
}


for(i=0;i<righe;i++){
for(j=0;j<colonne;j++){
printf("matrice[%d][%d]= %d ",i,j,matrice[i][j]);


}
printf("\n");
}
return 0;
}

per l'allocazione dinamica di una matrice, però (e non riesco a capire il motivo) va il loop.
Se lo eseguo dal terminale di Ubuntu, non esce fuori nessuna stampa, e se provo a chiudere il terminale esce l'avviso: "processo in esecuzione", se invece lo provo su windows, con IDE eclipse, non visualizza nessuna stampa, ma se inserisco gli interi righe e colonne, e premo stop, a quanto pare alloca la matrice perchè questo è il risultato che ottengo:

inserisci elemento riga 0 e colonna 0
inserisci elemento riga 0 e colonna 1
inserisci elemento riga 0 e colonna 2
inserisci elemento riga 1 e colonna 0
inserisci elemento riga 1 e colonna 1
inserisci elemento riga 1 e colonna 2
inserisci elemento riga 2 e colonna 0
inserisci elemento riga 2 e colonna 1
inserisci elemento riga 2 e colonna 2
matrice[0][0]= 11014128 matrice[0][1]= 11010244 matrice[0][2]= 67108868
matrice[1][0]= 11014680 matrice[1][1]= 11015656 matrice[1][2]= 1548765276
matrice[2][0]= 11014680 matrice[2][1]= 11015656 matrice[2][2]= 1936421487



Non riesco a capire!:dottò::dottò::dottò:

M.A.W. 1968
24-05-2014, 12:47
Il codice presentato non contiene particolari errori, anche se è grave la mancanza di ogni tipo di controllo sia sull'input utente (in particolare le dimensioni dell'array), sia sul successo delle varie operazioni di allocazione: controlli obbligatori per la robustezza del programma.

Al di là di questo, l'unica svista significativa consiste nell'uso di un "sizeof(double)" in luogo di un "sizeof(int)" nell'allocazione delle righe. Per il resto, ho apportato un paio di banalissimi ritocchi e compilato rapidamente il seguente sorgente con BCC 5.5.1 in ambiente Windows 7: funziona perfettamente.



#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int righe, colonne, i, j;
int **matrice;

printf(" Righe........: ");
scanf("%d", &righe);
printf(" Colonne......: ");
scanf("%d", &colonne);
puts("");

matrice = (int**)malloc((righe * sizeof(int*)));
for (i = 0; i < righe; i++)
{
matrice[i] = (int*)malloc(colonne * sizeof(int));
}

for(i = 0; i < righe; ++i)
{
for(j = 0; j < colonne; ++j)
{
printf("Inserisci elemento riga %d e colonna %d: ", i, j);
scanf("%d", &matrice[i][j]);
puts("");
}
}

for(i = 0; i < righe; ++i)
{
for(j = 0; j < colonne; ++j)
{
printf("matrice[%d][%d]= %d ", i, j, matrice[i][j]);
}
puts("");
}

return 0;
}



Eccone l'output per una semplice sessione di prova:


Y:\>compile array2d.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
array2d.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

Y:\>array2d
Righe........: 3
Colonne......: 3

Inserisci elemento riga 0 e colonna 0: 9

Inserisci elemento riga 0 e colonna 1: 8

Inserisci elemento riga 0 e colonna 2: 7

Inserisci elemento riga 1 e colonna 0: 6

Inserisci elemento riga 1 e colonna 1: 5

Inserisci elemento riga 1 e colonna 2: 4

Inserisci elemento riga 2 e colonna 0: 3

Inserisci elemento riga 2 e colonna 1: 2

Inserisci elemento riga 2 e colonna 2: 1

matrice[0][0]= 9 matrice[0][1]= 8 matrice[0][2]= 7
matrice[1][0]= 6 matrice[1][1]= 5 matrice[1][2]= 4
matrice[2][0]= 3 matrice[2][1]= 2 matrice[2][2]= 1

Y:\>

mariella_88
24-05-2014, 13:06
Io come compilatore uso gcc sia per windows che per ubuntu.. Potrebbe essere questo il problema?! Una config sbagliata?! Però devo dire che, se compilo altri programmi più semplici fila tutto liscio..

M.A.W. 1968
24-05-2014, 13:42
Ho appena compilato ed eseguito il medesimo codice, sempre con le minime modifiche da me apportate, con gcc in ambiente OpenSUSE 13, con il seguente risultato:



MAW@OpenSUSE:~/C-Cpp> gcc array2d.c -oarray2d
MAW@OpenSUSE:~/C-Cpp> ./array2d
Righe........: 3
Colonne......: 3

Inserisci elemento riga 0 e colonna 0: 1

Inserisci elemento riga 0 e colonna 1: 2

Inserisci elemento riga 0 e colonna 2: 3

Inserisci elemento riga 1 e colonna 0: 4

Inserisci elemento riga 1 e colonna 1: 5

Inserisci elemento riga 1 e colonna 2: 6

Inserisci elemento riga 2 e colonna 0: 7

Inserisci elemento riga 2 e colonna 1: 8

Inserisci elemento riga 2 e colonna 2: 9

matrice[0][0]= 1 matrice[0][1]= 2 matrice[0][2]= 3
matrice[1][0]= 4 matrice[1][1]= 5 matrice[1][2]= 6
matrice[2][0]= 7 matrice[2][1]= 8 matrice[2][2]= 9
MAW@OpenSUSE:~/C-Cpp>

mariella_88
24-05-2014, 14:02
Ho capito che a te funziona, a me no. Hai idea del perchè?!

M.A.W. 1968
24-05-2014, 14:26
Ho capito che a te funziona, a me no. Hai idea del perchè?!

Evidentemente il problema risiede nel tuo ambiente di sviluppo e non ha a che vedere con la sintassi del sorgente.
Presumo che tu abbia già apportato le modifiche indicate. Hai anche provato a cambiare compilatore? In ambiente Windows ce ne sono almeno mezza dozzina disponibili (gratuitamente e legalmente), dal classico BCC ai vari Digital Mars, Open Watcom, Visual Studio Express, eccetera.

mariella_88
24-05-2014, 14:34
Facendo un'altra prova, commentando tutte le printf, mi fa inserire tutto da tastiera, e poi alla fine stampa il risultato in modo coretto. A sto punto potrebbe trattarsi di un problema printf/scanf!?

inserisco matrice 3x3:
3//righe
3//colonne
1
2
3
4
5
6
7
8
9
inserisci elemento riga 0 e colonna 0
inserisci elemento riga 0 e colonna 1
inserisci elemento riga 0 e colonna 2
inserisci elemento riga 1 e colonna 0
inserisci elemento riga 1 e colonna 1
inserisci elemento riga 1 e colonna 2
inserisci elemento riga 2 e colonna 0
inserisci elemento riga 2 e colonna 1
inserisci elemento riga 2 e colonna 2
matrice[0][0]= 1 matrice[0][1]= 2 matrice[0][2]= 3
matrice[1][0]= 4 matrice[1][1]= 5 matrice[1][2]= 6
matrice[2][0]= 7 matrice[2][1]= 8 matrice[2][2]= 9

mariella_88
24-05-2014, 14:36
E su ubuntu?! Cmq certo ho apportato le modifiche da te suggerite, ma mi effettua tutte le print dopo.. Dovrei cambiare compilatore anche su ubuntu..

oregon
24-05-2014, 14:41
Prova ad utilizzare una
fflush(stdout);

subito dopo ogni printf

Potrebbe trattarsi di questo bug


https://bugs.eclipse.org/bugs/show_bug.cgi?id=173732

mariella_88
24-05-2014, 14:56
usando fflush funziona meglio, però prima mi fa inserire i dati e poi fa le stampe.. Forse non l'ho messa nei punti giusti, ti linko il codice:


#include <stdio.h>#include <stdlib.h>


int main(void)
{
int righe, colonne, i, j;
int **matrice;


printf(" Righe........: ");
scanf("%d", &righe);
fflush(stdout);
printf(" Colonne......: ");
scanf("%d", &colonne);
fflush(stdout);
puts("");


matrice = (int**)malloc((righe * sizeof(int*)));
for (i = 0; i < righe; i++)
{
matrice[i] = (int*)malloc(colonne * sizeof(int));
}


for(i = 0; i < righe; ++i)
{
for(j = 0; j < colonne; ++j)
{
printf("Inserisci elemento riga %d e colonna %d: ", i, j);
fflush(stdout);
scanf("%d", &matrice[i][j]);
puts("");
}
}


for(i = 0; i < righe; ++i)
{
for(j = 0; j < colonne; ++j)
{
printf("matrice[%d][%d]= %d ", i, j, matrice[i][j]);
fflush(stdout);
}
puts("");
}


return 0;
}

Loading