как определить и объявить, хотя это определено и объявлено? - PullRequest
0 голосов
/ 21 июня 2020

Я знаю, что вопрос выглядит запутанным, но, честно говоря, это не так, как кажется. Я создаю программу о дроне (извините, если это не имеет смысла). Вот из этого кода я получаю ошибку "(строка 116) идентификатор" camrecord "не определен" и "Ошибка компилятора C2065 '(строка 116) идентификатор': необъявленный идентификатор", хотя я их уже опознаю и декларирую? как это решить? спасибо

 #include<iostream>
    #include <fstream>
    #include <cstdlib>
    #include <iomanip>
    #include <string.h>
    
    using namespace std;
    
    void manualMode();
    void defaultMode();
    void Getdata(double & camrecord, double & Projectframerate);
    void calculate(double & camrecord, double & Projectframerate, double & actualframerate);
    
    
    
    int speed, timeTofly, operation;
    int angle = 90;
    
    int main() {
        int mode = 0, part = 3;
        double flyLevel;
        int obstacleSensor = 0, timer = 3, AccelerometerSensor = 0, tempSensor = 25;
        char startPause;
        cout << "Drone Flying Technology" << endl;
        do {
            cout << "Choose Mode: (1)Default, (2)Manual \n";
            cin >> mode;
            if (mode == 1)
                defaultMode();
            if (mode == 2)
                manualMode();
        } while (mode == 0);
    
        cout << "Choose how to fly: (1)Upper , (2)Lower , (3)Upper and Lower \n";
        cin >> part;
        switch (part) {
        case 1:
        case 2:
            flyLevel = 0.5;
            break;
        case 3:
            flyLevel = 1;
            break;
        }
        if (obstacleSensor == 0) {
            do {
                cout << "Press (S) to Start,and swing the propeller." << endl;
                cin >> startPause;
                cout << "LED is On\n";
                while (AccelerometerSensor != flyLevel) {
                    AccelerometerSensor++;
                }
                cout << "Flying session Started! Time Left:" << timeTofly << endl;
                cout << "Eagle eye Operation Started!\n";
                timeTofly = timeTofly / 2;
                cout << "Crusing mode initiate Time Left:" << timeTofly << endl;
                timeTofly = timeTofly / 2;
                cout << "Free fly commenced Time Left:" << timeTofly << endl;
                timeTofly = 0;
                startPause = 'P';
            } while ((startPause == 's') || (startPause == 'S'));
        }
        cout << "End!\nLED is Off";
        return 0;
    }
    
    
    void manualMode() {
        cout << "Enter drone speed (knot) \n";
        cin >> speed;
        cout << "Enter Time to fly: \n";
        cin >> timeTofly;
        cout << "Choose Operation: (1)Fully manual, (2)Normal Orientation, (3)Free orientation, (4)FPV racing, (5)All\n";
        cin >> operation;
    }
    void defaultMode() {
        int howtofly;
        cout << "how to fly: (1)Circle, (2)Altitude Hold, (3)Free orientation";
        cin >> howtofly;
        switch (howtofly) {
        case 1:
            speed = 30;
            timeTofly = 3;
            break;
        case 2:
            speed = 40;
            timeTofly = 3;
            break;
        case 3:
            speed = 60;
            timeTofly = 3;
            break;
        }
    
    
        char name[25];
        char id[5];
        float m1, m2, m3, m4, m5;
    
        ofstream outputFile("droneinfo.txt", ios::out);
    
        cout << "Please enter object you want to record,drone id imei number and your 5 preferred video fps:\n";
        cout << "\nPress <ctrl> + z to stop. \n";
    
        while (cin >> id >> name >> m1 >> m2 >> m3 >> m4 >> m5)
        {
            outputFile << id << " " << name << " " << m1 << " " << m2 << " " << m3 << " " << m4 << " " << m5 << endl;
        }
    
        double fps = 0.0;
        double Projectframerate = 0.0;
    
        double actualframerate, out = 0;
    
    
        Getdata(camrecord, Projectframerate);
        calculate(camrecord, Projectframerate, actualframerate);
        cout << "The actual frame rate is =" << actualframerate << " f/s\n";
    
    
    }
    void Getdata(double& camrecord, double& Projectframerate) {
        cin >> camrecord;
        cin >> Projectframerate;
        
        cout << "Please enter\n Recording frame rate =" << camrecord << "f/s ,\ndesired frame rate="
            << Projectframerate << "f/s\n";
    }
    
    //-------------------//
    void calculate(double& camrecord, double& Projectframerate, double& actualframerate) {
        actualframerate = camrecord / Projectframerate;
    }
    
    //-------------------//

1 Ответ

1 голос
/ 21 июня 2020

Таким образом, ссылка в качестве аргумента используется, когда вы хотите ввести переменную и изменить ее. Глядя на void Getdata(double& camrecord, double& Projectframerate), вы говорите, что Getdata принимает запись cam и частоту кадров проекта, считывает эти значения и изменяет их, так что вызывающий может использовать новые значения.

Глядя на код, он не похоже, что Getdata на самом деле считывает входные значения. Таким образом, существует несоответствие.

Чтобы соответствовать реализации метода, метод Getdata должен не принимать какие-либо аргументы, а только возвращать их. Теперь вы не можете вернуть два аргумента, но вы можете упаковать их в структуру и вернуть это:

struct Data
{
    double camrecord;
    double Projectframerate;
};

Data Getdata();

Определение Getdata может быть таким:

Data getData()
{
    Data data;
    cin >> data.camrecord;
    cin >> data.Projectframerate;
    
    cout << "Please enter\n Recording frame rate =" << data.camrecord << "f/s ,\ndesired frame rate="
        << data.Projectframerate << "f/s\n";

    return data;
}

Аналогично может выполняется для calculate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...