Member 14869317 Ответов: 2

Как решить ошибку проверки времени выполнения#2-стек вокруг переменной '' был поврежден


I want to build a programme about drone which user can enter either default mode or manual mode .. and in default mode i want the programme to further asking user to input Object,imei,and video frame rates ( fstream method ) and actual frame rate (by pass reference) .When I build it it only stated warning which is "Warning C6001 Using uninitialized memory 'flyLevel' line 54" and still succeed and then I debug it and suddenly those error appeared "check failure#2-Stack around variable 'object ' was corrupted"and"check failure#2-Stack around variable 'id' was corrupted".I have google it and i dont understand why this happens.Can anyone explain to why this happens and how to solve this? thank you so much

#include<iostream>
#include <fstream>
#include <cstdlib>
#include <iomanip>
#include <string.h>

using namespace std;

void manualMode();
void defaultMode();
void Getdata(double& camrecord, double& projectfps);
void calculate(double& camrecord, double& projectfps, double& actual);
void Displayactualframerate(double& out);



int speed, timeTofly, operation;
int angle = 90;
double camrecord ;
double projectfps ;
double actual, out ;

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 (flyLevel != AccelerometerSensor) {
                
                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\n";
    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 object[5];
    char id[5];
    float m1, m2, m3, m4, m5;

    ofstream outputFile("droneinfo.txt", ios::out);

    cout << "Please enter object you want to record,set your drone id number (5 number) and your 5 preferred video fps:\n";
    

    cin >> id >> object >> m1 >> m2 >> m3 >> m4 >> m5;
    
     outputFile << id << " " << object << " " << m1 << " " << m2 << " " << m3 << " " << m4 << " " << m5<<endl;
    



    Getdata(camrecord, projectfps);
    calculate(camrecord, projectfps, actual);
    Displayactualframerate(actual);



}
void Getdata(double& camrecord, double& projectfps) {

    

    cout << "Please enter cam recording =" << camrecord << "f/s ,\nDesired footage frame rate="
        << projectfps<<"f/s\n";
    cin >> camrecord;
    cin >> projectfps;
}


//-------------------//
void calculate(double& camrecord, double& projectfps, double& actual) {
    actual = (camrecord / projectfps);
}


//-------------------//
void Displayactualframerate(double& out) {

    cout << "\nThe actualframerate is =" << out << " f/s\n";

   
}


Что я уже пробовал:

Я пытаюсь изменить все "flyLevel" на другую строку, и это не работает

KarstenK

попробуйте double flyLevel = 0;

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
Когда я его построил, он только указал предупреждение, которое является "предупреждение C6001 с использованием неинициализированной памяти 'flyLevel' строка 54"

Это означает, что если часть не является 1, 2 или 3, flylevel не будет инициализирован.
switch (part) {
case 1:
case 2:
    flyLevel = 0.5;
    break;
case 3:
    flyLevel = 1;
    break;
default:
    // if code goes here, it is a problem, add a check
}

Цитата:
появилась ошибка "check failure#2-Stack around variable 'object' was corrupted"и"check failure#2-Stack around variable 'id' was corrupted".

Ввод с клавиатуры в массив символов означает, что массив символов используется в качестве строки с нулевым завершением, это означает, что для ввода 5 символов вам нужен массив символов размером 6.


CPallini

5.

Patrice T

Спасибо

Рейтинг:
1

OriginalGriff

Мы не можем сказать - мы понятия не имеем, для чего предназначено ваше приложение, как вы его используете или что вы сделали с точки зрения входных данных, чтобы получить ошибку.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.
Посмотрите на стек, посмотрите, что происходит с данными вокруг вашей переменной. Скорее всего, вы где - то передаете плохой указатель или используете висячую ссылку - но вы заметите это, только очень внимательно посмотрев на то, что именно происходит во время выполнения вашего кода, а это означает отладчик.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!