2010-06-04 6 views
1

provenant de cette question "What does (int (*)[])var1 stand for?" J'ai essayé d'accéder au résultat de la distribution comme un tableau multidimensionnel. Mais j'obtiens l'erreur suivante: "assignment from incompatible pointer type" suivi d'une erreur de segmentation. J'ai aussi essayé d'autres variations, mais aucune d'entre elles n'a fonctionné. Comment puis-je accéder directement aux éléments de var1 dans la fonction example?Puis-je accéder au type int (*) [] avec [] []?

Merci!

#include <stdlib.h> 

int i(int n,int m,int var1[n][m]) { 
    var1[0][0]=5; 
    return var1[0][0]; 
} 

int example() { 
    int *var1 = malloc(100); 

    // works 
    int var2; 
    var2 = i(10,10,(int (*)[])var1); 
    printf("var2=%i",var2); 
    //doesn't work I 
    int *var3; 
    var3=(int (*)[])var1; //"assignment from incompatible pointer type" 
    printf("var3[0][0]=%i",var3[0][0]); 


    //doesn't work II 
    int *var4; 
    var4=var1; 
    printf("var4[0][0]=%i",var4[0][0]); //" error: subscripted value is neither array nor pointer" 

    //doesn't work III 
    int **var5; 
    var5=var1; 
    printf("var5[0][0]=%i",var5[0][0]); // assignment from incompatible pointer type 


    return(1); 

} 

int main(){ 
    int a; 
    a=example(); 
    return(1); 
} 

Répondre

1

Essayez cette photo. Ce qui suit compilé sans avertissement et couru sous C99 (gcc -std=c99 -pedantic -Wall):

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

int i(int n, int m, int (*var1)[m]) // C89 requires constant expression for 
{         // array size 
    int j, k; 
    for (j = 0; j < n; j++) 
    for (k = 0; k < m; k++) 
     var1[j][k] = j*m+k; 
    return var1[0][0]; 
} 

int example(void) 
{ 
    int *var1 = malloc(100 * sizeof *var1); // Thanks, Joseph! 
    int var2 = i(10, 10, (int (*)[10]) var1); // note the cast of var1 includes 
              // the array size 
    int (*var3)[10] = (int (*)[10]) var1;  // note the type of var3 

    int j, k; 
    for (j = 0; j < 100; j++) 
    printf("var1[%2d] = %d\n", j, var1[j]); 

    for (j = 0; j < 10; j++) 
    for (k = 0; k < 10; k++) 
     printf("var3[%2d][%2d] = %d\n", j, k, var3[j][k]); 

    free(var1); 
    return var2; 
} 

int main(void) 
{ 
    int x = example(); 
    printf("x = %d\n", x); 
    return 0; 
} 

D'abord, notez les types et les moulages (surtout, notez comment ils correspondent). Notez que je spécifie la taille de la dimension de tableau dans les moulages pointeur vers tableau. Notez également que je déclare var3 comme un pointeur vers un tableau, pas un simple pointeur.

+0

Merci, lancer var3 de cette façon 'int (* var3) [10] = (int (*) [10]) var1;' est la solution pour moi! – Framester

+0

Vous comprenez * pourquoi * cela fonctionne, non? –

+0

Je pense que vous vouliez dire 'malloc (400)', pas 'malloc (100)', selon votre cible. Voir http://stackoverflow.com/questions/2973856/can-i-access-type-int-with/2976113#2976113 pour une manière propre de faire cela. –

3
int *var3; 
var3 = (int (*)[])var1; 

Vous jettes var1 qui est déjà int* à int(*)[] (pointeur sur un tableau de int) et l'assigner à var3 qui est à nouveau int*.

Il suffit de faire

var3 = var1 
+0

Bonjour Amarghosh, J'ai essayé de mettre en œuvre votre exemple, mais j'ai le message d'erreur "la valeur indicée n'est ni tableau ni pointeur".Peut-être que je t'ai mal compris. Pourriez-vous vérifier l'édition que j'ai faite à la question? Merci! – Framester

+0

@Framester vous ne pouvez pas indiquer (utilisez '[]' on) un 'int *' deux fois. Déclarer var3 comme «int **» et lui assigner '& var1' ou lire' var3 [0] '. Qu'est-ce que vous essayez de faire exactement? – Amarghosh

+0

Je veux éviter le détour en utilisant une fonction séparée. J'essaie d'accéder à 'var1' dans la fonction' example' quand on accède à la fonction 'i' via [] []. – Framester

0

var3 doit être un int** au lieu d'un int*.

Modifier

Vous essayez d'utiliser la syntaxe de tableau 2D où les données réelles que vous avez créé est en fait un tableau 1D. Vous pouvez utiliser votre fonction i() pour vous donner la sémantique souhaitée, mais l'accès aux données doit être converti en indexation 1D à l'intérieur de la fonction. Il suffit de faire votre fonction ressembler à ceci:

int i(int n,int m,int* var1, int maxM) { 
    return var1[(maxM * n) + m]; 
} 
+1

Ce n'est pas une syntaxe C valide. – sepp2k

+0

whoops mélanger les langues ... la première partie est toujours valide. – bshields

+0

Salut bshields, j'ai ajouté un exemple de comment je vous ai compris. Voir '// ne marche pas III' Mais j'obtiens le message d'erreur' // affectation du type de pointeur incompatible' – Framester

0
int example() { 
    int *var1 = malloc(100); 

    ... 

    int *var3; 
    var3=var1; 
    printf("var3[0][0]=%i",var3[0][0]); //" error: subscripted value is neither array nor pointer" 

    return(1); 
} 

Ici, var1 et var3 sont tous deux de type int*, qui est à peu près analogue à int[]. Vous avez créé un tableau à une dimension et essayez d'y accéder en tant que tableau à deux dimensions. Changer leur type à int**, allouer la mémoire nécessaire, et cela devrait résoudre votre problème.

0

Peut-être ce que vous recherchez est:

int (*var1)[10][10] = malloc(sizeof *var1); // 400 bytes 
i(10, 10, *var1); 
printf("var1[0][0]=%i\n", (*var1)[0][0]); 

Ajouté: Un fragment de code complet pour gcc pourrait être:

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

void i(int n, int m, int var1[][m]) { // n not needed 
    var1[0][0] = 5; 
    var1[1][2] = 6; 
} 

int main(void) { 
    int n = 10, m = 10; 
    int (*var1)[n][m] = malloc(sizeof *var1); // 400 bytes 
    i(n, m, *var1); 
    printf("var1[0][0]=%i\n",(*var1)[0][0]); 
    printf("var1[1][2]=%i\n",(*var1)[1][2]); 
    return 0; 
} 

Pour msvc, vous ll doit faire n et m constantes, comme dans:

enum {n = 10, m = 10}; 

void i(int var1[][m]) { 
    var1[0][0] = 5; 
    var1[1][2] = 6; 
} 

int main(void) { 
    int (*var1)[n][m] = malloc(sizeof *var1); 
    i(*var1); 
    // ... 
}