Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C] problema allocazione matrice dinamica

    Salve, ho scritto questo codice:
    #include <stdio.h>
    #include<stdlib.h>




    codice:
    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!
    Maria

  2. #2
    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.

    codice:
    #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:
    codice:
    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:\>
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  3. #3
    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..
    Ultima modifica di mariella_88; 24-05-2014 a 13:13
    Maria

  4. #4
    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:

    codice:
    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>
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  5. #5
    Ho capito che a te funziona, a me no. Hai idea del perchè?!
    Maria

  6. #6
    Quote Originariamente inviata da mariella_88 Visualizza il messaggio
    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.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  7. #7
    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
    Maria

  8. #8
    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..
    Maria

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    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:

    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;
    }
    Maria

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.