2017-02-22 1 views
2

Donc, j'ai une fonction où je déclare une structure qui est remplie et qui veut aussi déclarer une nouvelle fonction. Quand je déclare une nouvelle fonction en haut cela fonctionne, quand je le déclare sur la même ligne après la virgule (,) cela fonctionne mais ça ne marche pas sur la ligne du bas. Des explications? Merci d'avance.Pourquoi ne puis-je pas déclarer la structure 2ème fois en fonction?

void CFilter(float avgprofit, int lines) 
{ 
    //client goodclient[MAX_CLIENT]; THIS WOULD COMPILE 
    client client[MAX_CLIENT], goodclient[MAX_CLIENT]; // THIS COMPILES 
    //client goodclient[MAX_CLIENT]; THIS WOULDN'T COMPILE 
    int i, amount = 0; 
    float userprofit; 
    for (i = 0; i <= lines; i++) { 
     userprofit = client[i].loses - client[i].wins; 
     if (userprofit >= avgprofit) { 
      client[i].goodclient = 1; 
     } else { 
      client[i].goodclient = 0; 
     } 
    } 
} 
+0

Lorsque vous avez 'goodclient' sur la ligne suivante, l'avez-vous retiré de la ligne précédente? C'est flou. BTW s'il vous plaît éviter d'utiliser le même nom pour une variable que son type. Au mieux: confusion, au pire: erreurs. –

+0

* Pourquoi ne puis-je pas déclarer la structure 2ème fois en fonction? * Parce que vous ne pouvez pas. C'est en fait une * définition * qui ne peut pas être dupliquée. Cependant, une double * déclaration *, telle qu'un prototype de fonction ou une variable externe, peut être - tant qu'elles sont toutes identiques. –

+0

Bonne idée de commencer les types avec une lettre majuscule - peut alors les distinguer des variables –

Répondre

5

Le problème est que le nom du tableau client cache le nom du type client.

client client[MAX_CLIENT]; 
client goodclient[MAX_CLIENT]; 

Ainsi, dans la deuxième déclaration, le compilateur considère le nom client comme le nom du tableau.

Ce n'est pas une bonne idée d'utiliser le même nom pour différentes entités.

La manière la plus simple de faire en sorte que le compilateur compile les déclarations consiste à renommer le tableau.

Ou si le type client est un typedef d'un type de structure avec le même nom, alors vous pouvez écrire par exemple

client client[MAX_CLIENT]; 
struct client goodclient[MAX_CLIENT]; 

Une autre façon est tout simplement d'échanger les déclarations

client goodclient[MAX_CLIENT]; 
client client[MAX_CLIENT];