2017-08-13 15 views
2

私はまだC言語を学習しており、車のデータベースをプログラムしなければならない練習をしています。主な関数では、私は 'carinfo_t'構造体への100個のポインタの配列を宣言しました。 '* createcarinfo'関数では、新しいcarinfo_tインスタンスを作成する必要があります。しかし、私は 'brandOfCar'変数が宣言されていないという問題を抱えています。コンパイラがこの変数が構造体の一部であることを知っておくべきなので、なぜこのメッセージを受け取っているのか分かりません。構造体はプログラム内のデータ型として宣言され、構造体へのポインタはこの関数の先頭で初期化されます。構造体ポインタ関数の宣言されていない変数c

この問題はすでにどこかで尋ねられている場合は申し訳ありません。どんな助力も非常に感謝しています。

#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; 
} 

答えて

3

あなたはコンストラクタ関数brand、ないbrandOfCarに渡される変数と呼ばれているためです。同様に、モデル変数modelといい、modelOfCarではありません。そのため、strlenはコンパイルされません。

それは一貫性を保つために同一の構造体のフィールドに変数の名前を指定し、それが適切であるところconstを追加することをお勧めします:

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); 
    ... 
} 

はまた、Cであなたがmallocをキャストしていないことに注意してください、とそうでありませんsizeof(char)を掛けます。この標準は、すべてのプラットフォームで1である必要があります。

+0

また、 'malloc(strlen(...)+1)'の代わりに 'strdup'を使うことを提案します。... –

+0

@KeineLust私は' strdup'が大好きです。 。私は移植性の理由でそれをお勧めすることには消極的です。私はそれが標準の一部であることを望んでいます。 – dasblinkenlight

+0

100%ポータブルではなく、 'strdup'、' itoa'、 'trim' ...のような関数(動的割り当てが必要な)が標準ライブラリに含まれていないのはなぜですか?組み込みシステムとの互換性のためだけですか? –

関連する問題