-3

以下は、クイックソート手法で考えられるコードです。それが正しいかどうかはわかりませんが、私の論理によれば、うまくいくはずです。ただし、このコードを DevC++ で実行しようとすると、クラッシュしてプログラムが終了するため、やりすぎたと思います。すべてのプログラムで発生するわけではないため、明らかにこのコードのみに問題があります。

#include<iostream.h>
#include<conio.h>

int quick(int, int);

int split(int beg, int end);

int a[7] = { 43, 6, 235, 76, 23, 65, 29 };

int main() {
    quick(0, 6);
    getch();
    return 1;
}

int quick(int beg, int end) {
    //trial for self coding

    int loc = split(beg, end);
    quick(beg, loc - 1);//first half
    quick(loc + 1, end);//second half

    //end of coding

    cout << "\nThe sorted array is :\t";
    for (int i = 0; i < 7; i++)
        cout << a[i] << "\t";
    return 0;
}

//SPLIT FUNC STARTS
int split(int beg, int end) {
    int temp, loc, left, right, count = 1;
    left = beg;
    right = end;
    loc = beg;
    while (left != right) {
        if ((count % 2) != 0) {
            while (a[loc] <= a[right]) {
                right--;
            }
            if (loc == right)
                return loc;
            if (a[loc] > a[right]) {
                temp = a[loc];
                a[loc] = a[right];
                a[right] = temp;
                loc = right;
                left++;
                count++;
                continue;
            }
        }// end of count%2 if
        else {
            while (a[left] <= a[loc])
                left++;
            if (loc == left)
                return loc;
            if (a[loc] < a[left]) {
                temp = a[loc];
                a[loc] = a[right];
                a[right] = temp;
                loc = left;
                right--;
                count++;
                continue;
            }
        }//end of else
    }// end of while
    return loc;
}
4

2 に答える 2

3

デバッグ フラグを指定してプログラムをコンパイルし、デバッガで実行します。ほとんどの IDE には「デバッグ」ボタンがあります。GCC では、-g オプションを使用してデバッグ フラグをコンパイルでき、gdb を使用できます。

この場合、後者を で行いましg++ -g quicksort.cpp && gdb a.outた。一度脇に置いて、私は使用しrunました。これにより、すぐに「メモリにアクセスできませんでした」というメッセージが表示されました。行番号でエラーが完了しました。 print <variable>変数を出力してquit終了します。

教育目的で実際のエラーの場所情報を具体的に示しているわけではありません。

于 2012-09-14T18:35:37.247 に答える
3

コンパイル エラー

これをファイルに入れてコンパイルしました:

g++ -g yourcode.cpp

最初の問題:

yourcode.cpp:1:21: fatal error: iostream.h: No such file or directory
compilation terminated.

に続く:

yourcode.cpp: In function ‘int quick(int, int)’:
yourcode.cpp:23:5: error: ‘cout’ was not declared in this scope
yourcode.cpp:23:5: note: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: note:   ‘std::cout’

の代わりに#include <iostream.h>、 が必要#include <iostream>です。またusing namespace std;、コンパイラが非常に古い可能性があります。ほとんどのコンパイラは無料なので、学習中にこのような間違いを犯さないものを入手することを強くお勧めします. 私はしばらく Windows を使用していませんが、おそらくEclipseはほぼ同じように動作し、Visual Studio Expressも無料です。Qt Creatorは Windows でも動くと思います。それらのいずれかを選択し、現在使用しているものを使用するのをやめてください

また、プログラムを一時停止するために呼び出している奇妙な DOS 入力関数も削除しました。std::cin入力が必要な場合に使用します。

セグメンテーション違反

これを実行すると、次のようになります。

Segmentation fault (core dumped)

それは楽しいですね、gdb は何と言っていますか?

Starting program: /home/brendan/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x00000000004008b7 in split (beg=0, end=6) at yourcode.cpp:55
55              while (a[left] <= a[loc])

これは、55行目のある時点で、a[left]またはa[loc]メモリ内の有効な場所ではないことを示しています。おそらく、配列の範囲内に収まるように、何らかのコードを追加する必要がありますleftloc

プログラムがクラッシュした原因を緊急に知る必要がある場合は、このプロセスを自分で実行する方が、他の人に実行を依頼するよりもはるかに高速です。このプロセスは簡単であり、その結果、喜んで実行してくれる人はほとんどいません。最初にプログラミングを始めたときは、それが明らかではないことに気付いたので、私は例としてのみ行いました。

注: コマンドライン プログラムを使用してこれを確認しましたが、これは高速であるためです。ただし、IDE でデバッガーを使用する方が快適な場合があります。Eclipse を実行している場合は、「デバッグ」ボタン (通常は緑色のバグ) をクリックするだけで、この正確な情報が表示されます。

于 2012-09-14T18:47:15.260 に答える