2010-01-19 6 views
2

code:Passer un tableau contenant des pointeurs à une fonction bien

/* 
* code.c 
*/ 
#include <stdio.h> 

void printArray(int iXArray, int iSize); 

int main() { 
    int array1[] = {7, 9, 3, 18}; 
    int *array2[] = {array1 + 0, array1 + 1, array1 + 2, array1 + 3}; 

    printArray(array2, 4); 

    return 0; 
} 

// This should print the values in array1 
void printArray(int iXArray, int iSize) { 
    int iCntr; 
    for (iCntr = 0; iCntr < iSize; iCntr++) { 
     printf("%d ", *iXArray[iCntr]); 
    } 
    printf("\n"); 
} 

Mon compilateur n'approuve pas ce code. - [Avertissement] passer arg 1 de `printArray 'rend entier à partir du pointeur sans un cast - printArray (array2, 4); - [Erreur] la valeur indicée n'est ni un tableau ni un pointeur - printf ("% d", * iXArray [iCntr]);

Qu'est-ce que je fais de mal, et pourquoi? Comment puis-je réparer ça?

Répondre

7

Essayez ceci:

void printArray(int **iXArray, int iSize) ... 

Dans votre exemple, vous fournissez un tableau de (int *) référence donc comme l'un, vous devez dire au compilateur d'attendre un tableau de pointeurs.

Par défaut, un tableau est référencé. Si vous changez le contenu du tableau, cela change aussi du côté de l'appelé. Le pointeur lui-même est passé par valeur, donc changer la valeur du paramètre iXArray (iXArray = (int**)123;) ne changera pas le pointeur array2 du côté de l'appelé.

Si vous voulez passer le tableau par valeur, il faudra l'envelopper dans un type de valeur:

typedef struct { 
    int A[123]; 
} Array; 

Array incrementArray(Array array, int count) { 
    for (int i=0; i<count; i++) { 
     array.A[i]++; 
    } 
    return array; 
} 
+0

Je devrais mentionner que je veux que le premier tableau reste intact si je décide de l'éditer avec cette fonction. Si je devais éditer array2, je changerais les pointeurs. – Pieter

+0

La modification avec les structures devrait vous permettre de faire cela. –

3

Vous passez un tableau de pointeurs vers int:

void printArray(int *ixArray[], int iSize) 
+0

Oups. Cela ne le résout pas cependant. – Pieter

+0

Oups. Oui. –

+0

@ Leonardo: Richard avait initialement 'int iXArray []', et cela ne corrigeait pas le problème de Pieter. –

0

En ce qui concerne la "Restez intacte". Vous passez les choses par référence, donc la façon de les empêcher d'être éditées est de les faire const. Vous avez plusieurs options différentes selon la partie que vous ne voulez pas changer. Cependant, cela ne vous laissera pas les changer dans vous fonctionnez. Ce que cela donne, c'est que vous voulez une valeur de passage que vous ne pouvez pas obtenir en C++ en utilisant des tableaux à moins de faire votre propre copie manuelle.

0

Cela semble fonctionner sans rendre array1 modifiable par printArray.

/* 
* code.c 
*/ 
#include <stdio.h> 

void printArray(int *iXArray[], int iSize); 

int main() { 
    int array1[] = {7, 9, 3, 18}; 
    int *array2[] = {&array1[0], &array1[1], &array1[2], &array1[3]}; 

    printArray(array2, 4); 

    return 0; 
} 

// This should print the values in array1 
void printArray(int *iXArray[], int iSize) { 
    int iCntr; 
    for (iCntr = 0; iCntr < iSize; iCntr++) { 
     printf("%d ", *iXArray[iCntr]); 
    } 
    printf("\n"); 
} 
0

Cela fonctionne aussi:

/* 
* code.c 
*/ 
#include <stdio.h> 

void printArray(int **iXArray, int iSize); 

int main() { 
    int array1[] = {7, 9, 3, 18}; 
    int *array2[] = {array1 + 0, array1 + 1, array1 + 2, array1 + 3}; 

    printArray(array2, 4); 

    return 0; 
} 

// This should print the values in array1 
void printArray(int **iXArray, int iSize) { 
    int iCntr; 
    for (iCntr = 0; iCntr < iSize; iCntr++) { 
      printf("%d ", *iXArray[iCntr]); 
    } 
    printf("\n"); 
} 

pointeur Arithmétique fonctionne parfaitement.

Questions connexes