2

エラーが発生している私のコードのセクション:

int disk::access (const char fname[]){

    int char_count=77;
    int actual_count=0; //just to pass the tests.
    char c;

    cout << "the file name is " << fname << ", and the mode is " << mode << endl;
    if(strcmp(mode, "w")==0){
        for (int i = 0; i < size; i++) {
            //cout << "sgm to be written is " << sgm[i];
            fp=fopen(fname, "w");
            fprintf(fp, "%s\n",sgm[i]);
         }
        fclose(fp);
    }       
    if(strcmp(mode,"a")==0){
        fp=fopen(fname, "a");
        fprintf(fp, "%s\n", sgm);
        fclose(fp);
    }

    fp=fopen(fname, "r");

    do{
        c=fgetc(fp);
        if(c!=' ' && c!='\n')
        actual_count++; 
     }while(c!=EOF);
    fclose(fp);


    return actual_count;        
}

私のエラー:

disk.cpp:メンバー関数内'int disk :: access(const char *)':

disk.cpp:67:警告:非PODタイプのオブジェクトを「クラスセグメント」から「...」まで渡すことはできません。呼び出しは実行時に中止されます

67行目の編集は次のとおりです。fprintf(fp、 "%s \ n"、sgm [i]);

SGMの編集:

cppコード:

disk::disk(int num_of_segments, const char* temp_mode){

    size=num_of_segments;
    sgm = new segment[size];  //initializes num_of_segments in a disk

    count=0;        
    if(strcmp(mode, "w")!=0||strcmp(mode, "a")!=0){
        strcpy(mode, "w");
    }

}

disk::disk(){

    sgm = new segment[20]; //initialize 20 segments in a disk
    size=20;  //keeps track of how many are initialized
    count=0;  //keeps track of how many are added
    strcpy(mode, "w"); //initialize disk access mode to w


}

ヘッダーコード:

class disk {
    private:
        int size, count; //to keep a track of number of segments 
        char mode [2]; //a for append and w for write 
        segment* sgm;
        FILE *fp;

    public:
        disk(int num_of_segments, const char *temp_mode);
        disk();
        ~disk();
        const char* get_mode( ) const;
        segment get_segment(int pos) const;
        int get_segment_count( ) const;
        const segment* get_all_segments( ) const;
        int access(const char fname[ ]);
        disk& operator+=(const segment &rhs);
        disk& operator=(const disk &dk);
};

私はこれまでこのような警告に出くわしたことがありません。私はいくつかの検索を行い、PODを収集したものから、「コンストラクタ、デストラクタ、および仮想メンバー関数のない構造であるプレーンな古いデータ」です。-グレッグヒューギル

それで、それを正しく理解した場合、私のエラーは、非PODであるため、コンストラクタまたはデストラクタ、あるいは仮想メンバー関数を持っているということですか?

私は自分自身を混乱させていると思います。このエラーを修正する方法や、問題が発生している場所を特定する方法がわかりません。

すべての提案を歓迎し、大いに感謝します、

ありがとう。

4

2 に答える 2

3

推測して、「セグメント」は構造体またはクラスであり、「%s」文字列として出力しようとしていると言います。

セグメントを文字列に変換する関数を実装する必要があります。または、セグメントの個々のネイティブフィールドを印刷します。

たとえば、このようにセグメントを定義した場合

struct segment { char name[10]; int index; }

次のいずれかとして処理する必要があります

print("%s:%d\n", seg.name, seg.index);

またはとして

inline std::ostream& operator << (std::ostream& os, const struct segment& seg)
{
return os<<seg.name<<":"<<seg.index;
}

メソッド呼び出しは次のようになります。

std::ostringstream os;
os<<seg;
std::string segStr = os.str();
printf("%s\n", segStr.c_str());

toString()型関数を手動でコーディングして、セグメントの文字列表現を取得することもできます。

于 2012-07-24T18:18:59.110 に答える
1

メソッドがsgm含まれている場合、またはがまたはである場合は、次の行の実装に依存しています。virtualclassstruct

fprintf(fp, "%s\n",sgm[i]);

あなた%sが言っfprintfているsgm[i]のはそれですchar*。に仮想関数がある場合sgm[i]、これはおそらくfalseになります(のためvfptr)。タイプのメンバーレイアウトが最初のデータメンバーとしてを配置しない場合char*、これもまたfalseになります。

于 2012-07-24T17:52:17.383 に答える