2015-12-21 2 views
1

Je définis une structure que j'appelle Neuron.Tableau bidimensionnel dans un pointeur

Dans mon principal, je crée un tableau à deux dimensions:

Neuron N_network[4][10]; //create a neural network 

J'ai une fonction d'imprimer l'élément de structure:

void print_stat_neuron(Neuron * neuron_info) 

Que dois-je écrire à imprimer N_network[i][j] (comme argument de la fonction print_stat_neuron())? J'essaye simplement avec &(N_network[i][j]) et j'obtiens un message d'erreur.

J'ai le message d'erreur avec le compilateur mise en jachère gcc -Wall -Wextra:

2ex4.c: In function 'init_network': 
2ex4.c:168:2: warning: implicit declaration of function'print_stat_neuron' [-Wimplicit-function-declaration] 
print_stat_neuron(&N_network[4][1]); 
^ 
2ex4.c: At top level: 
2ex4.c:191:6: warning: conflicting types for 'print_stat_neuron' [enabled by default] 
void print_stat_neuron(Neuron * neuron_info) 
^
2ex4.c:168:2: note: previous implicit declaration of 'print_stat_neuron' was here 
print_stat_neuron(&N_network[4][1]); 
+0

Quel est le message d'erreur? Il est toujours utile de voir le texte du message d'erreur; il n'est pas forcément utile de voir le nom complet du fichier s'il est profond de dix répertoires (mais le nom de base du fichier est sensé). –

+1

Vous devez également placer une déclaration de fonction plus tôt dans votre code que la première fois que vous appelez la fonction. –

Répondre

1

Les messages d'erreur vous venu tout de ne pas déclarer la fonction avant de l'utiliser, de sorte que le compilateur déduit un type pour la fonction (extern int print_stat_neuron(); sans spécification pour le nombre ou les types de paramètres), puis les objets vous définissant avec un type de retour de void. Notez qu'en C, extern int print_stat_neuron(); n'est pas un prototype pour une fonction sans arguments; c'est extern int print_stat_neuron(void);.

Ce code proprement compile:

typedef struct Neuron 
{ 
    int x; 
} Neuron; 

void print_stat_neuron(Neuron *neuron_info); 

int main(void) 
{ 
    Neuron N_network[4][10]; 
    for (int i = 0; i < 4; i++) 
    { 
     for (int j = 0; j < 10; j++) 
      print_stat_neuron(&N_network[i][j]); 
    } 
    return 0; 
} 

Cette déclare la fonction avant de l'utiliser. Il serait également acceptable de définir la fonction avant de l'utiliser (ce qui évite d'avoir une déclaration séparée). Bien sûr, si la fonction sera utilisée en dehors du fichier source où elle est définie, elle devrait avoir une déclaration dans un en-tête, et l'en-tête devrait être utilisé à la fois où il est défini et où il est utilisé. Si la fonction n'est pas utilisée en dehors du fichier source où elle est définie, elle doit être static.

compilation propre avec GCC vérifié 5.3.0 sous Mac OS X 10.10.5 (ma machine El Capitan est en réparation de garantie, malheureusement):

$ gcc -std=c11 -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes \ 
>  -Wold-style-definition -c neuron.c 
$ 
2

Vous devez changer le paramètre à Neuron (*neuron_info)[10]. Maintenant, vous pouvez appeler cette fonction

print_stat_neuron(N_network); 

ou

print_stat_neuron(&N_network[0]);  
+0

Je ne souhaite pas utiliser le tableau entier, mais un seul élément. – White

+1

Pourquoi cela serait-il nécessaire? –

+0

Bien sûr, mais je peux toujours le faire d'une autre manière, mais j'étais curieux. – White