Не могу понять, как передать массив структуры в функцию - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть заголовочный файл, основной файл cpp и файл функций, и я пытаюсь передать массив stuct из основной функции в файл функций и не могу понять синтаксис.Я удалил код, чтобы показать, что я делаю, не показывая сотни строк кода.

Я перепробовал все известные мне варианты, чтобы передать массив структуры, и он не скомпилируется;Я прочитал все, что мог найти на нем и не могу найти решение;Я знаю, что это всего лишь синтаксическая вещь, которую я не понимаю.

файл header.h

#ifndef myHeader_h
#define myHeader_h


#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <sstream>


using namespace std;


struct MyStruct
{
    float var1;
    float var2;
    float var3;
};

struct MyStruct2
{
    string var4;
    string var5;
    bool var6;
    MyStruct struct1;
};


int enterFunction(int maxNumber, int & currentNumber, structList);

#endif

Основная программа

#include "myHeader.h"

int main()
{
    int currentNumber = 0, maxNumber = 0;

    MyStruct *structList;
    structList = new MyStuct[maxNumber];

    enterFunction(currentNumber, maxNumber, structList);
    return 0;
}

Файл функций

#include "myHeader.h"

int enterFunction(int maxNumber, int & currentNumber, structList)
{
// DO MORE STUFF HERE
}

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

В вашем файле header.h вместо

int enterFunction(int maxNumber, int & currentNumber, structList);

вам нужно

int enterFunction(int maxNumber, int & currentNumber, MyStruct * structList);

И в вашем файле функций, аналогично, вам нужно

int enterFunction(int maxNumber, int & currentNumber, MyStruct * structList)

И это все!

Кстати, опасно помещать using namespace std (или любую директиву using) в такой заголовочный файл.Это может нарушить код других людей, если они будут включать ваш заголовок.Лучше положить его в файл C.(И даже если никто не собирается включать ваш заголовок, это плохая привычка.) См. этот вопрос о переполнении стека .

0 голосов
/ 02 декабря 2018

Вместо подверженного ошибкам ручного управления памятью вы должны использовать RAII для управления ресурсами.C ++ имеет std::vector для этого, и это делает жизнь намного проще.Я предполагаю, что функция enterFunction должна считывать количество структур из файла или клавиатуры, поэтому задача состоит в том, чтобы создать список входных значений.Вы можете передать ссылку на вектор:

int enterFunction(int maxNumber, int & currentNumber, std::vector<MyStruct2>& structlist);

Однако я бы изменил сигнатуру, чтобы вернуть вектор с входными значениями.Это облегчает понимание функции и позволяет рассуждать о:

std::vector<MyStruct2> enterFunction(int maxNumber) {
    std::vector<MyStruct2> inputs;
    // let's assume that >> is overloaded for MyStruct2
    while (inputs.size() < maxNumber) {
        MyStruct2 x;
        cin >> x;
        inputs.push_back( std::move(x) );
    }

    return inputs;
}

Обратите внимание, что при этом не будет копироваться вектор в качестве возвращаемого значения, поскольку в нем используется оптимизация именованного возвращаемого значения.

...