Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [c] matrice calloc

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50

    [c] matrice calloc

    voglio eseguire la matrice trasposta con un unico ciclo for come nell'esempio sottostante...
    quando vado a stampare il primo indirizzamento per righe riesce a stamparmi l'indice i 0,1,2,3 ecc.. mentre il secondo indirizzamento per colonne mi stampa l'indice sempre 0,0,0,0 ecc...sapete il perchè?
    for(i=0;i<n;i++)
    {
    *(mat+0*n+i)=i;
    *(mat+i*n+0)=i; <-------non funzionante
    }

    codice:
     #include <stdio.h>
    #include <stdlib.h>
    
    void costr_mat(int mat[9][9],int n);
    void visualizza(int mat[9][9],int n);
    void vedi_nodo(int mat[9][9],int n);
    int main()
    {
        int *mat;
        int n;
        int i,j;
        int scelta;
    
        printf("Inserisci la grandezza della tabella (MAX 8) = ");
        scanf("%d",&n);
        n++;
        mat=calloc(n,sizeof(int));
        /* Metto i nodi */
        for(i=0;i<n;i++)
        {
            *(mat+0*n+i)=i;
            *(mat+i*n+0)=i;
        }
        costr_mat(mat,n);
        printf("\nLa Prima riga e la Prima colonna visualizzano i nodi creati, nodo 0 non esiste\n\n");
        do
        {
            printf("\n\n");
            printf("0 - Esci\n");
            printf("1 - Vedi info nodo\n");
            printf("2 - Visualizza MATRICE\n");
            scanf("%d",&scelta);
            printf("\n\n");
            switch(scelta)
            {
                case 0:
                        printf("Grazie per aver usufruito del nostro programma\n\n");
                        break;
                case 1:
                        vedi_nodo(mat,n);
                        break;
                case 2:
                        visualizza(mat,n);
                        break;
            }
        }while(scelta != 0);
    system("pause");
    }
    void costr_mat(int mat[9][9],int n)
    {
        int i,j;
        printf("Inserisci gli elementi, 1 e 0\n");
    
        for(i=1;i<n;i++)
        {
            for(j=i;j<n;j++) /* Inserisco dalla diagonale in su (triangolo superiore) */
            {
                printf("mat[%d][%d] = ",i,j);
                scanf("%d",&mat[i][j]);
            }
        }
    }
    void vedi_nodo(int mat[9][9],int n)
    {
        int i,j,cont=0;
    
        printf("\nQuale nodo preferisci visualizzare le informazioni? ");
        scanf("%d",&i); /* Controllo sulla riga */
    
            for(j=1;j<n;j++)
                 if(mat[i][j] == 1) /* Conto quante connessioni ci sono */
                      cont++;
        printf("\nIl nodo e' collegato con %d nodi\n\n",cont);
    }
    void visualizza(int mat[9][9],int n)
    {
        int i,j;
        printf("\nEcco la matrice\n");
        for(i=0;i<n;i++)
        {
            printf("\n");
            for(j=0;j<n;j++)
                printf("%d ",mat[i][j]);
        }
    
    }
    codice:
    code

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa, ma cosa intendi fare con

    mat=calloc(n,sizeof(int));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    alloco uno spazio di memoria di n elementi di tipo int
    codice:
    code

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da asteroid
    alloco uno spazio di memoria di n elementi di tipo int
    Sì, ma se vuoi trattare una matrice quadrata di ordine n, devi allocare n x n elementi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    si giusto
    mat=calloc(n*n,sizeof(int));

    for(i=0; i<n; i++){

    *(mat+0*n+i)=i; //accedo per righe 0 1 2 3 ecc...

    *(mat+i*n+0)=i; //accedo per colonne
    0
    1
    2
    3
    ecc...
    dovrebbe essere così?
    codice:
    code

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da asteroid
    si giusto
    mat=calloc(n*n,sizeof(int));
    Meglio

    mat = (int *)(n*n, sizeof(int));


    for(i=0; i<n; i++){

    *(mat+0*n+i)=i; //accedo per righe 0 1 2 3 ecc...

    *(mat+i*n+0)=i; //accedo per colonne
    0

    mat+0*n+i è come dire mat+i e mat+i*n+0 è come dire mat+i*n

    Al posto degli zeri devi inserire, nel primo caso la riga che ti serve, nel secondo la colonna.

    Ma se vuoi trattare tutti gli elementi allora basta

    *(mat+i*n+i)=i;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.