0

これがコード全体です。コンパイルすると、次のエラーが表示されます。

エラー LNK2019: 未解決の外部シンボル "void __cdecl CandyBarFunc(struct CandyBar &,char const *,double,int)" (?CandyBarFunc@@YAXAAUCandyBar@@PBDNH@Z) 関数 _wmain で参照

致命的なエラー LNK1120: 1 つの未解決の外部

#include "stdafx.h"
#include <iostream>
using namespace std;

struct CandyBar
{
    char name[40];
    double weight;
    int calories;
};

void CandyBarFunc(CandyBar & astruct, const char * aname = "Millennium Munch", double aweight = 2.85, int acalories = 350);
void CandyBarFunc(const CandyBar & astruct);

int _tmain(int argc, _TCHAR* argv[])
{
    CandyBar MyCandyBar;
    CandyBarFunc(MyCandyBar, "Hello World Candy Bar", 1.25, 200);
    CandyBarFunc(MyCandyBar);
    return 0;
}

void CandyBarFunc(CandyBar & astruct, char * aname, double aweight, int acalories)
{
    strncpy(astruct.name,aname,40);
    astruct.weight = aweight;
    astruct.calories = acalories;
}

void CandyBarFunc(const CandyBar & astruct)
{
    cout << "Name: " << astruct.name << endl;
    cout << "Weight: " << astruct.weight << endl;
    cout << "Calories: " << astruct.calories;
}
4

5 に答える 5

3

nameは と定義されているため、配列のアドレスを変更しようとしているとchar name[40]書くことはできません。ただし、配列のアドレスは変更できません。したがって、エラー。astruct.name = anamename

これを行う: strcpy(astruct.name, aname);

さらに良いことに、次のように定義CandyBarします。

struct CandyBar
{
     std::string name;
     double weight;
     int calories;
};

今、あなたは書くことができます:astruct.name = aname;

于 2011-02-15T16:54:40.427 に答える
1

質問は現在表現されているため、欠けているのは ; 構造体 CandyBar の右中括弧の後。

于 2011-02-15T17:13:16.323 に答える
1

はメモリの変更不可能な領域であるchar * aname = "Millenium Falcon"ため、書き込むこと"Millenium Falcon"はできません。(const char *)可能であれば、関数の署名を変更して a を受け入れconst char * anameます。または、代わりに std::string を使用してください。結局のところ、C++ を書いているのです。

于 2011-02-15T16:51:58.180 に答える
1

CandyBar.name が配列として定義されていますが、これは char ポインターとは異なります。割り当てステートメントの代わりに strcpy のようなものを使用する必要があります。STL 文字列を使用する方がさらに良いでしょう。

コメントの質問に従って、こちらを参照してください。

于 2011-02-15T16:53:00.547 に答える
1

これを使って:

  strncpy(astruct.name, aname, sizeof(astruct.name)); 
  astruct.name[sizeof(astruct.name)-1] = 0;

編集:そして、完全に変更された質問に応えて:

「char * aname」は「const char * aname」と同じではありません。1 つを前方宣言し (未解決の外部を与える)、もう 1 つを実装しますが、これは決して呼び出されません。

于 2011-02-15T16:54:51.823 に答える