0

配列のバブルソートを実装するこのコードがあります。MS VS 2012 でコンパイルすると、ある程度までは機能します。

UPD:クラッシュが発生した正確な場所を追跡するために多くのチェックを追加しました。これは次のようなものです:配列の最初の 2 つの要素を交換し、それらの要素を交換して配列を出力し、「Checking 」と「ベクトル添字が範囲外」でクラッシュします

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;


int Check(vector<int> Array)
{
printf ("Checking: \n");
for (int i = 0; i < Array.size(); i++)
    if((int*) Array[i] == NULL)
    {
        cerr << "Array [" << i << "] is fubared";
        return -1;
    }
}

int PrintOut(vector<int> Array)
{
printf ("Your array appears to be as follows: \n");
for (int i = 0; i < Array.size(); i++)
    printf("%d  ", Array[i]);
return 0;
}

int bubble_sort()
{
int or_size = 2;
int i, j, size, temp;

printf("Specify array size\n");
scanf_s("%d", &size);
printf(" Now, input all elements of the array \n");

vector<int> Array(size, 0);
if (size > or_size)
    Array.resize(size);

for (i = 0; i < size; i++)
{
    printf("Array [%d] is now re-initialised as ", i);
    scanf_s("%d", &temp);
    printf("\n");
    Array[i] = temp;
}

Check(Array);

PrintOut(Array);

for (i = 1; i < size; i++)
    for (j = 0; j < size-i ; j--)
    {
        printf ("Attempting to swap Array[%d], which = %d, and Array [%d], which = %d \n",j, Array[j], j+1, Array[j+1]);
        if (Array[j] > Array[j+1])
        {
            Array[j]+=Array[j+1];
            Array[j+1] = Array[j] - Array[j+1];
            Array[j] = Array[j] - Array[j+1];
            printf("Swapped \n");
        }
        PrintOut(Array);
        Check(Array);
    }

printf ("\n Your Array has been bubble_sorted and should know look like this: \n");
for (i = 0; i < size; i++)
    printf("%d ", Array[i]);

Array.clear();

return 0;
}

int main()
{
    bubble_sort();
    return 0;
}

それは本当に単純なものに違いありませんが、私の手の届かないところにあります。

PS 恥ずかしくない _asm ;-)

4

1 に答える 1

2

あなたのコードは私には少し奇妙です。 and の代わりに and を使用する方が良いですが、それにcout加えcinprintfscanf次のようなものがあります。

for (j = 0; j < size-i ; j--) {...}

したがって、最初のアイテムjは0で、その後-1にデクリメントされ、それ以降はoperator[]符号なしのタイプであり、0xFFFFFFFFとして解釈されます。これは、ベクトルサイズよりもはるかに大きな値と大きなインデックスであるため、取得します「ベクトル添え字が範囲外です」vectorstd::size_t

于 2012-09-01T22:15:02.993 に答える