2017-08-13 1 views
2

Je suis encore en train d'apprendre C et je fais un exercice où je dois programmer une base de données voiture. Dans la fonction principale, j'ai déclaré un tableau de 100 pointeurs aux structures 'carinfo_t'. Dans la fonction '* createcarinfo', une nouvelle instance carinfo_t doit être créée. Mais j'ai le problème que la variable 'brandOfCar' n'est pas déclarée. Je ne comprends pas vraiment pourquoi je reçois ce message parce que le compilateur devrait savoir que cette variable fait partie de la structure, n'est-ce pas? La structure est déclarée comme type de données dans le programme et un pointeur sur la structure est initialisé au début de cette fonction.Variable non déclarée c dans la fonction pointeur de structure

Je suis désolé si cette question a déjà été posée quelque part. Toute aide est fortement appréciée.

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 
#include <limits.h> 

struct carinfo_t 
{ 
    char *brandOfCar; 
    char *modelOfCar; 
    int yearCarWasBuilt; 
    float valueOfCar; 
}; 


struct carinfo_t *createCarinfo(char *brand, char *model, int year, float 
value) 
{ 
    struct carinfo_t *newCarInfo=(struct carinfo_t*) malloc(sizeof(struct 
carinfo_t)); 
    newCarInfo->brandOfCar=(char*)malloc(sizeof(char)* 
(strlen(brandOfCar)+1));  

//Message: error: 'brandOfCar' undeclared (first use in this function) 

//function not finished 
} 


int main() 
{ 
    struct carinfo_t *carbase[100]={}; 

    return 0; 
} 

Répondre

3

C'est parce que vous avez appelé la variable passée dans votre fonction constructeur brand, pas brandOfCar. De même, vous avez appelé la variable de modèle model, et non modelOfCar. C'est pourquoi strlen ne compile pas.

Il est une bonne idée de nommer des variables identiques aux champs de la structure de la cohérence, et d'ajouter const où il convient:

struct carinfo_t *createCarinfo(
    const char *brandOfCar 
, const char *modelOfCar 
, int yearCarWasBuilt 
, float valueOfCar) { 
    struct carinfo_t *newCarInfo=malloc(sizeof(struct carinfo_t)); 
    newCarInfo->brandOfCar=malloc(strlen(brandOfCar)+1); 
    ... 
} 

Notez également que C vous ne rejetez pas malloc, et ne multiplier par sizeof(char), ce qui nécessite d'être 1 sur toutes les plates-formes.

+0

Je suggère aussi d'utiliser 'strdup' (si disponible) au lieu de' malloc (strlen (...) + 1) '... –

+0

@KeineLust J'adore' strdup', ça me sauve beaucoup de taper . Je suis réticent à le recommander pour des raisons de portabilité, cependant. J'aimerais qu'il fasse partie de la norme, surtout vu sa simplicité. – dasblinkenlight

+0

vrai, pas 100% portable, mais pourquoi ces fonctions (qui nécessite une allocation dynamique) comme 'strdup',' itoa', 'trim' ... ne sont pas inclus dans la bibliothèque standard? juste pour la compatibilité avec les systèmes embarqués? –