2

10 個のバケットを作成して、基数ソート用の C++ コードを作成することに成功しました。10 個のバケットについては、次の方法で作成しました。

struct node{
    struct node* next;
    long value;
};

struct node*bucket[10];

for (int i=0; i<10; ++i) {  
    bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
}

そしてそれは完璧に行われます。

しかし、今度はバケットの量を 100000 に増やす必要があります。これらのバケットのサイズを次のように変更しようとしました。

struct node*bucket[100000];

for (int i=0; i<100000; ++i) {  
    bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
}

しかし、今回はそれらのバケットを作成することさえできないと思います。コードに Visual Studio を使用していますが、これは C++ です。コンパイラから次の警告が表示されました。

: 警告 C4305: 'argument': '__int64' から 'size_t' への切り捨て

: 警告 C4309: '引数': 定数値の切り捨て

インターネットで調べたところ、数が多すぎると誰かが言っていました。リンクされたリストでこれほど多くの数を処理するのは初めてです。このコードを再び機能させるには、何か変更する必要がありますか?

ありがとうございました。アイデアや助けをいただければ幸いです。

4

2 に答える 2

4

私はあなたのコードを小さなサンプルプログラムに変えました:

#include <stdlib.h>

struct node {
    int i;
};

int main()
{
    struct node*bucket[100000];

    for (int i=0; i<100000; ++i) { 
        bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
    }
}

これは、VisualStudio2010で適切にコンパイルされます。

私の頭に浮かぶのは、100000個のポインターの配列(おそらくそれぞれ4バイト)を割り当てているということです。これは、変数ごとに64kBを超えるスタックスペースを使用できない古いコンパイラーを思い出させます(または関数?覚えていません。TurboPascalまたはTurbo C ...でした)。

これはC++なので、そもそも生のC配列を使用しないことをお勧めします。代わりに、上記のコードを次のように置き換えることができます。

#include <vector>

struct node {
    int i;
};

int main()
{
    std::vector<node> bucket( 100000 );
}

このstd::vectorオブジェクトは、C配列を使用するすべての場合に使用できます。

于 2012-03-13T07:32:32.387 に答える
0

おそらく問題はループ状態にあります:

for (int i=0; i<100000; ++i)
              ^^^^^^^^^

std::size_t i;まで持っているかunsigned long i;、比較する必要があります100000

于 2012-03-13T07:26:17.223 に答える