Выражение должно быть изменяемым параметром указателя на символ lvalue - PullRequest
0 голосов
/ 15 февраля 2011

Это весь код. После компиляции я получаю ошибку ниже:

ошибка LNK2019: неразрешенный внешний символ «void __cdecl CandyBarFunc (struct CandyBar &, char const *, double, int)» (? CandyBarFunc @@ YAXAAUCandyBar @@ PBDNH @ Z), на который есть ссылка в функции _wmain

фатальная ошибка LNK1120: 1 не устранена * внешние 1006 *

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

Ответы [ 5 ]

3 голосов
/ 15 февраля 2011

Поскольку name определено как char name[40], вы не можете написать astruct.name = aname, который пытается изменить адрес массива name.Но адрес массива нельзя изменить.Отсюда и ошибка.

Сделайте это: strcpy(astruct.name, aname);

Еще лучше, определите CandyBar как,

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

Теперь вы можете написать: astruct.name = aname;

1 голос
/ 15 февраля 2011

Поскольку вопрос в настоящее время сформулирован, то отсутствует; после закрывающей скобки struct CandyBar.

1 голос
/ 15 февраля 2011

Используйте это:

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

РЕДАКТИРОВАТЬ: И в ответ на ваш полностью измененный вопрос:

"char * aname" не то же самое, что "const char * aname".Вы пересылаете объявление одного (которое дает неразрешенное внешнее), а затем реализуете другое, которое никогда не вызывается.

1 голос
/ 15 февраля 2011

CandyBar.name определен как массив, который отличается от указателя на символ.Вы должны будете использовать что-то вроде strcpy вместо оператора присваивания.Было бы даже лучше просто использовать строки STL.

Согласно вашему вопросу с комментариями см. здесь .

1 голос
/ 15 февраля 2011

Вы не можете написать char * aname = "Millenium Falcon", потому что "Millenium Falcon" - это (const char *), неизменяемый объем памяти. Измените свою подпись функции, чтобы принять const char * aname, если можете. Или вместо этого используйте std :: string, ведь вы пишете C ++.

...