Προς το περιεχόμενο

Απλή απορία με πέρασμα δισδιάστατου πίνακα σε συνάρτηση


Amadeus7

Προτεινόμενες αναρτήσεις

Δημοσ.

Κάνω ένα προγραμματάκι στη C όπου πρέπει να περάσω ένα δισδιάστατο πίνακα σε μία συνάρτηση η οποία πρέπει να είναι της μορφής

>int A(int **G)

στη main όμως όταν πάω να δώσω ως παράμετρο τον πίνακα μου λέει πως τον δίνω με λάθος τρόπο. τον περνώ έτσι

>Α(G);

πώς ακριβώς πρέπει να τον περάσω ώστε να δουλέψει?

Δημοσ.

>
#include <stdio.h>

#define X 10
#define Y 20

void fill(int A[][Y]){ //τροπος 1
     for(size_t i=0;i<X;i++){
          for(size_t j=0;j<Y;j++){
              A[i][j] = i * Y + j;
          }
     }
}

void test(int A[X][Y]){//τρόπος 2
     for(size_t i=0;i<X;i++){
          for(size_t j=0;j<Y;j++){
              if(A[i][j]!= i * Y + j)
		printf("error\n");
          }
     }
}

int main(){
    int A[X][Y];
    fill(A);
    test(A);
    for(size_t i=0;i<X;i++){
         for(size_t j=0;j<Y;j++){
        if(A[i][j]!= i * Y + j)
	     printf("error\n");
         }
    }
    return 0;
}

 

εφόσων δεν είναι δυναμικά δημιουργημένος (που σημαίνει μονοδιάστατος), έχει συγκεκριμένη οριοθέτηση. Ολες οι διαστάσεις απο δεξια προς αριστερά πρέπει να δηλωθούν εκτος απο την πρωτη αριστερα που είναι προαιρετική (δεν τη νοιάζει τη C αν την ξεπεράσεις και "καταστρέψεις" τη μνήμη).

Αν ήταν δυναμικά δημιουργημένος, θα αρκούσαν οι δείκτες.

Δημοσ.
δυναμικά δημιουργημένος εννοεις με Malloc & realloc?

 

Ναι.

 

Οι πίνακες στη C είναι πάντα μονοδιάστατοι, αλλά ο compiler προσπαθεί να μας κάνει τη ζωή εύκολη όταν μπορεί. Στους δυναμικούς αγνώστου μεγέθους, δεν μπορεί να κάνει πολλά.

Βέβαια υπάρχουν και οι δυναμικοί γνωστού μεγέθους (δες το παρακάτω typedef):

 

π.χ.

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

typedef int mhtsos[10][32][34];

void foo(mhtsos x){
   size_t i,j,k,a=0;
   printf("sizeof x=%u\n",sizeof(x));
       for(i=0;i<10;i++)
            for(j=0;j<32;j++)
                for(k=0;k<34;k++) {
                        assert(x[i][j][k] == 0);
                        x[i][j][k] = a++;
                }
}

void chk(mhtsos x){
   size_t i,j,k,a=0;
   printf("sizeof x=%u\n",sizeof(x));
       for(i=0;i<10;i++)
            for(j=0;j<32;j++)
                for(k=0;k<34;k++) {
                        assert(x[i][j][k] == a);
                        a++;
                }
}

int main(){
    mhtsos *m = malloc(sizeof(mhtsos));
    assert(m);
    memset(m,0,sizeof(*m));
    foo(*m);
    chk(*m);
}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...