创建struct实例数组,然后在其他struct中调用函数传递对象数组(指针)

时间:2015-08-13 15:13:23

标签: c++ arrays pointers struct

我已经发布了一个与我在大学考试中可以预期的类似问题的问题,现在这是我面临的另一个具体问题,可能是由于缺乏对指针的重要理解。

问题定义了几个struct

其中一个是struct Question{},它有指针属性,还有一个数组,用于保存为该特定问题给出的所有答案。在目的地,我应该能够遍历所有问题,以便逐一向用户显示它们。

当我实例化考试时(这是入学考试的模拟),我需要传递学生的公民身份证号码和考试题目。

// pi._prijavljeniKandidati[1]->_JMBG is the ID number in question
// 'questions' is supposed to carry all the questions I've hard-coded
// to save myself from entering manually

pi.StartExam(pi._prijavljeniKandidati[1]->_JMBG, questions);

这是我尝试的方式:

Question* questions = new Question;

// this initializes a single question
// 'answers' is the attribute that is holding all the answers
// the correct answer is BTW determined by an integer that is also
// sent in the below function

char* answers1[4];
answers1[0] = "London";
answers1[1] = "Berlin";
answers1[2] = "Helsinki";
answers1[3] = "Rome";

questions[0].Create("What is the capital of Finland?", answers1, 2);

// another question
char* answers2[3];
answers2[0] = "Ljubljana";
answers2[1] = "Paris";
answers2[2] = "Prague";

questions[0].Create("What is the capital of France?", answers2, 1);

这就是StartExam函数实际看起来的样子,虽然没有什么特别之处,除了它显示了我如何尝试获取某些问题的某些值(基于其索引):

// I also tried void PokreniIspit(char* ID, Question* questions[])
void StartExam(char* ID, Question* questions)
{
    // this is just some dummy code line, to make sure it works
    cout << questions[1]._txtOfQuestion << endl;
}

当我运行应用程序时,控制台崩溃了。有什么明显会让它崩溃吗?

为了完整起见,这里是整个问题结构:

// THIS IS HOW I IMAGING THIS STRUCT 'VISUALLY'
//= _txtOfQuestion ["Koji je glavni grad Njemacke?"]
//= _answers[10] //max 10 answers
//==== [0] Peking
//==== [1] London
//==== [2] Berlin
//==== [3] Seattle
//==== [4] Ljubljana
//= _posOfCorrect [2]
//= _points [4]

struct Question{

    char* _txtOfQuestion;
    char* _answers[4];
    int _posOfCorrect;
    int _points;

    void Unos(char* txt, char* answers[], int posCorrect, int points)
    {
        _txtOfQuestion= new char[strlen(txt) + 1];
        strcpy_s(_txtOfQuestion, strlen(txt) + 1, txt);

        for(int i = 0; i < 4; i++){
            _answers[i] = new char;
            strcpy_s(_answers[i], strlen(_answers[i]) + 1, _answers[i]);
        }

        _posOfCorrect = posCorrect;
        _points = points;

}

2 个答案:

答案 0 :(得分:0)

谢谢大家的帮助。发布这个问题并通过所有这些代码以便从波斯尼亚语翻译成英语帮我注意到了什么问题。

此外,由于我 ,最初尝试初始化Question,如下所示:

Question* questions = new Question[2];

我重新使用它,因为我确实需要一系列问题。

但真正的罪魁祸首(以及控制台破解的原因)是我在for循环中使用4硬编码的事实。

当我第二个问题包含4个选项/答案时,就像第一个问题一样 - 它起作用了。

for (int i = 0; i < 4; i++){
    _odgovori[i] = new char;
    strcpy_s(_odgovori[i], strlen(odgovori[i]) + 1, odgovori[i]);
}

答案 1 :(得分:0)

void Unos(const char* txt, const char* answers[], int posCorrect, int points)
{
    if (points < 4)
        points = 4; //max 4 answer possibilities

    _txtOfQuestion= new char[strlen(txt) + 1];
    strcpy_s(_txtOfQuestion, strlen(txt) + 1, txt);

    for(int i = 0; i < points; i++){
        _answers[i] = new char[strlen(answers[i]) + 1];
        strcpy_s(_answers[i], strlen(answers[i]) + 1, answers[i]);
    }
    _posOfCorrect = posCorrect;
    _points = points;
}

我改变了一点:

由于您使用字符串文字调用该函数,因此该参数的类型应为const char*

你应该限制points参数(如果有人用5个答案调用它会怎么样?)。

for循环应该从0运行到points。如果它运行到4并且只有3个答案,那将是未定义的行为。

您需要一个char个数组,而不仅仅是char以保存答案。

for循环中存在一些拼写错误(answers_answers不同)。

我建议使用std::string代替char*std::vector或类似代替数组。

您应该调用以下函数:

questions[0].Create("What is the capital of Finland?", answers1, 2, 3);

只有3个答案,因此您传递3作为最后一个参数。