【解決方法】実行時チェック失敗の解決方法#2 – 変数「 」周辺のスタックが壊れていた

プログラミングQA


ユーザーがデフォルトモードまたは手動モードのいずれかに入ることができるドローンに関するプログラムを構築したい..デフォルトモードでは、オブジェクト、imei、およびビデオフレームレート(fstreamメソッド)と実際のフレームレートを入力するようにユーザーにさらに要求するプログラムが必要です(パス参照).ビルドすると、「Warning C6001 Using uninitialized memory ‘flyLevel’ line 54」という警告のみが表示され、それでも成功し、デバッグすると突然それらのエラーが表示された「check failure#2-Stack around variable 「オブジェクト」が破損している」および「チェック失敗#2-変数「id」の周りのスタックが破損している」.Googleで検索しましたが、なぜこれが起こるのかわかりません。 どうもありがとうございます

C++
#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」を別の文字列に変更しようとしましたが、うまくいきません

解決策 2

引用:

ビルドすると、「警告 C6001 Using uninitialized memory ‘flyLevel’ line 54」という警告のみが表示されました

これは、part が 1、2、または 3 でない場合、flylevel が初期化されないことを意味します。

C++
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
}

引用:

エラーが表示されました「チェック失敗#2-変数 ‘オブジェクト’の周りのスタックが壊れています」および「チェック失敗#2-変数 ‘id’の周りのスタックが壊れています」。

char 配列へのキーボード入力は、char 配列がゼロで終了する文字列として使用されることを意味します。これは、5 文字の入力の場合、サイズ 6 の char 配列が必要であることを意味します。

解決策 1

アプリが何をするように設計されているか、どのように使用するか、エラーを発生させるために入力に関して何をしたかはわかりません。

だから、それはあなた次第になるでしょう。
幸いなことに、何が起こっているのかを調べるのに役立つツール、デバッガーを利用できます。 使用方法はコンパイラ システムによって異なりますが、IDE と「デバッガ」の名前を Google で検索すると、必要な情報が得られます。

関数の最初の行にブレークポイントを置き、デバッガーでコードを実行します。 次に、コードとデータを見て、何が起こるべきかを手動で解決します。 次に、各行を 1 ステップ実行して、予想どおりの動作を確認します。 そうでない場合は、問題が発生したときであり、後戻りして (またはもう一度実行して詳しく調べて) 原因を突き止めることができます。
スタックを見て、変数の周りのデータに何が起こっているかを確認してください。 どこかで間違ったポインターを渡しているか、ぶら下がっている参照を使用している可能性がありますが、コードの実行中に何が起こっているかを正確に調べることによってのみ、それを見つけることができます。つまり、デバッガーです。

申し訳ありませんが、私たちはあなたにそれを行うことはできません – 新しい (そして非常に便利な) スキルを学ぶ時が来ました: デバッグ!

コメント

タイトルとURLをコピーしました