2010-09-18 6 views
2

Je veux numériser un tableau 2D avec l'aide de pointeurs et ont écrit ce code, pourriez-vous me dire pourquoi le compilateur donne des erreurs? I sais comment utiliser les doubles pointeurs pour faire la même chose, je faisais des expériences avec celui-ci.tableau 2D par des pointeurs

#include<stdio.h> 
#include<stdlib.h> 
int main(void) { 
    int i,j,n,a,b; 
    int (*(*p)[])[]; 
    printf("\n\tEnter the size of the matrix in the form aXb\t\n"); 
    scanf("%dX%d",&a,&b); 
    p=(int (*(*p)[b])[a])malloc(b*sizeof(int (*p)[a])); 
    for(i=0;i<b;i++) { 
      p[i]=(int (*p)[a])malloc(a*sizeof(int)); 
      printf("\t\bEnter Column %d\t\n"); 
      for(j=0;j<a;j++) 
        scanf("%d",&p[i][j]); 
    } 
    return 0; 
} 
+0

Il pourrait aider à lister les erreurs du compilateur, vous savez. ;-) – Edmund

+0

Qu'entendez-vous par «celui-ci»? La construction (int (* (* p) [b]) [a]) ?? Que devrait-il faire? Mon gcc ne semble pas aimer ça. –

+0

Ce sont les erreurs que j'obtiens: – n0nChun

Répondre

1

Vous utilisez des pointeurs vers des tableaux, de sorte que vous ne devriez pas indexer directement, comme p[i] donnera *(p+i) dire un tableau suivant celui pointé par p, plutôt que d'un élément de p.

En C, void* convertira en n'importe quel type de pointeur, de sorte que vous n'avez pas besoin de convertir le résultat de malloc. Si vous placez les moulages dedans, cela peut masquer des erreurs, par exemple si vous essayez d'assigner à un non-pointeur (tel que p[i]).

Dans le malloc pour p, sizeof(int (*p)[a]) doit soit utiliser un type ou une expression, pas une déclaration. p est un pointeur sur un tableau de pointeurs vers des réseaux de int, de sorte que le type des éléments de *p est int (*)[].

donc cette compile sans erreur ou d'avertissement sur gcc:

#include<stdio.h> 
#include<stdlib.h> 
int main (void) 
{ 
    int i, j, n, a, b; 

    int (* (* p) []) []; 

    printf ("\n\tEnter the size of the matrix in the form aXb\t\n"); 

    scanf ("%dX%d", &a, &b); 

    p = malloc (b * sizeof (int (*) [])); 

    for (i = 0;i < b;i++) { 
     (*p) [i] = malloc (a * sizeof (int)); 
     printf ("\t\bEnter Column %d\t\n", i); 
     for (j = 0;j < a;j++) 
      scanf ("%d", & (* (*p) [i]) [j]); 
    } 


    return 0; 
} 

Cependant, puisqu'il n'y a aucun avantage à l'aide d'un pointeur sur un tableau contre l'aide d'un pointeur sur son premier élément, mais cela ne signifie que vous devez déréférencer avant de prendre l'élément, il est beaucoup plus facile d'utiliser le pointeur vers une forme de pointeur.

+0

Ceci est une réponse brillante. Je vous remercie! :) – n0nChun

1

Savez-vous ce int (*(*p)[])[] est?
Essayez cdecl.org ... http://cdecl.ridiculousfish.com/?q=int+%28%2A%28%2Ap%29%5B%5D%29%5B%5D

Pour utiliser un tableau 1 dimensions et faire semblant que c'est un 2 dimensions d'une

  1. Déclarez un objet 1 dimensions (pointeur, tableau, peu importe)
  2. malloc une taille rectangulaire
  3. calculer la valeur d'adressage linéaire sur la base de rangée, colonne et taille de la colonne
  4. utilisent
  5. libre du tableau

C'est ce

/* Oh ... and use spaces in your code */ 
/* They are extremely cheap now a days */ 
#include <assert.h> 
/* instead of asserting malloc and scanf, use proper error checking */ 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int i, j, n, rows, cols; 
    int *p;           /* 1. */ 

    printf("Enter the size of the matrix in the form aXb\n"); 
    n = scanf("%dX%d", &rows, &cols); 
    assert((n == 2) && ("scanf failed")); 
    p = malloc(rows * cols * sizeof *p);    /* 2. */ 
    assert((p != NULL) && "malloc failed"); 
    for (i = 0; i < rows; i++) { 
      int rowindex = i * cols;     /* 3. */ 
      for (j = 0; j < cols; j++) { 
        n = scanf("%d", &p[rowindex + j]); /* 3. and 4. */ 
        assert((n == 1) && "scanf failed"); 
      } 
    } 
    free(p);           /* 5. */ 
    return 0; 
} 
0

Vous compliquer inutilement le problème de l'accès aux éléments du tableau à l'aide de pointeurs. Essayez d'utiliser un simple pointeur vers un pointeur p.

int **p; 
... 
p=malloc(a*sizeof(int *)); //create one pointer for each row of matrix 
... 
for(i=0;i<a;i++) 
{ 
... 
p[i]=malloc(b*sizeof(int)); //create b integers in each row of matrix 
... 
} 
+1

Vous pouvez "utiliser" l'objet (plutôt que le type) comme argument de l'opérateur sizeof. Si vous changez p en 'double ** p' dans le futur, vous n'aurez pas besoin de changer les lignes avec mallocs' p = malloc (a * sizeof * p); 'et' p [i] = malloc (b * sizeof * p [i]); ' – pmg

+0

@pmg, merci pour le conseil de codage et le montage! –