Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C]-Riempimento Array bi-dimensionale

    Salve a tutti, ho un problema con un Array bi-dimensionale. Supponiamo che io debba creare una funzione che mi riempie una matrice(nel caso specifico la voglio riempire di zeri), alla funzione passerò il puntatore alla matrice e le sue dimensioni:


    Codice PHP:
    riempi(int **matrice,int i,int j){
    int x,y

    for(
    0;x<=i-1;x++){ 
      
       for(
    0;y<=j-1;y++){ 
         
          *(*(
    matrice+x)+y) = 0

                     
    printf("%d",*(*(matrice x)+y));

              } 
              
    printf("\n"); 
        } 

    nel main definisco la mia matrice, e poi richiamo su di essa la mia funzione:

    Codice PHP:
    main(){

    int matrice[4][4]; 

    riempi(matrice,4,4); 

    system("pause"); 


    Il codice viene compilato, una volta lanciato va in crash dopo aver scritto la prima riga della matrice:



    Il codice mi sembra "logicamente" corretto, ma evidentemente sbaglio in qualcosa.
    Ho iniziato da poco con il C in ambito universitario.

    PS Credo che il problema sia nel passaggio dei parametri alla funzione, in quanto lo stesso codice schiaffato direttamente nel main non crea alcun problema..
    Grazie in anticipo

  2. #2
    Guarda qui:

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>

    riempi(int** matrice,int i,int j){ 

    int x,y

        for(
    0;x<=i-1;x++)
        {    
            for(
    0;y<=j-1;y++)
            {       
                *(*(
    matrice+x)+y) = x+y;
                
    printf("%d ",*(*(matrice x)+y)); 
            } 
            
    printf("\n"); 
        } 
    }

    int main()
    {
        const 
    int n 4;
        
    int i;
        
        
    int** mat = (int**)malloc(sizeof(int*));
        for(
    0ni++)
            
    mat[i] = (int*)malloc(sizeof(int));
            
        
    riempi(matnn);    
            
        for(
    0ni++)
            
    free(mat[i]);
        
    free(mat);    

    nota la differenza (spero di non aver fatto errori sull'allocazione dinamica, sono un pò arrugginito col C).
    Tra l'altro il compilatore non ti ha dato un warning tipo questo?

    codice:
    main.c: In function ‘main’:
    main.c:22: warning: passing argument 1 of ‘riempi’ from incompatible pointer type
    main.c:4: note: expected ‘int **’ but argument is of type ‘int (*)[4]’

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Nel caso non avessi trattato ancora l'allocazione dinamica della memoria che suggeriva antotan

    (
    Ho iniziato da poco con il C in ambito universitario.
    )

    puoi risolvere la cosa anche con una matrice statica, ma il passaggio dei parametri alla funzione va fatto diversamente: in C le matrici vengono allocate per righe in memoria, e per farlo c'è bisogno di sapere ogni riga quanto è lunga, ossia in pratica quante colonne ha la matrice (il numero di colonne si chiama appunto "Leading Dimension of Array", LDA, che in Fortran ad esempio è invece il numero di righe giacché l'allocazione avviene per colonne).

    Detto questo, puoi risolvere così:

    codice:
    #include <stdio.h>
    
    void riempi(int matrice[][4], int i, int j)
    {
            int x, y;
    
            for (x = 0; x < i; x++) {    
                    for (y = 0; y < j; y++) {       
                            matrice[x][y] = x + y;
                            printf("%d ", matrice[x][y]);
                    }
                    putchar('\n');
            }
    }
    
    int main(void)
    {
            int mat[4][4];
            
            riempi(mat, 4, 4);    
            
            return 0;    
    }
    senza contare comunque che la dimensione (o le dimensioni) statica dell'array potrebbe essere definita con una costante simbolica (direttiva #define) in maniera tale da rendere più semplice eventuali cambiamenti e anche da evitare il passaggio delle dimensioni come parametri della funzione, che risulterebbero inutili.
    every day above ground is a good one

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 © 2024 vBulletin Solutions, Inc. All rights reserved.