2012-03-13 2 views
2

10個のバケットを作成して基数ソート用のC++コードを作成しました。 10個のバケットについては、このように作成しました。リンクリストのサイズを '__int64'から 'size_t'に切り捨て

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警告: '引数': 'size_tの' から '__int64' から切り捨て

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

私はそれをインターネットで検索しましたが、誰かが数字が大きすぎると言います。リンクされたリストでこのような大きな数を処理するのは初めてです。このコードを再び動作させるために何かを修正する必要はありますか?

ありがとうございます。すべてのアイデアと私が感謝されるのを助ける!

+0

VS2010でこれらの警告のいずれも再生できません。私はx86とx64の両方を試しました。 – Mysticial

+0

私はそれをデバッグしようとしました。そして、 "list.exeの0x00301e77で未処理の例外が発生しました:0xC00000FD:スタックオーバーフロー" –

+0

これは、 'struct node * bucket [100000];'が大きすぎてスタックに収まらないために予想されます。しかし警告は困惑している。 – Mysticial

答えて

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)); 
    } 
} 

これが私の心に来る何のVisual Studio 2010

とうまくコンパイルあなたは100000のポインタの配列を(配分しているということですおそらくそれぞれ4バイト)。これは、変数ごとに64kB以上のスタックスペースを使用できない古いコンパイラを思い出させます(または、機能は?私は覚えていません.Turbo PascalまたはTurbo Cで...)。

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

#include <vector> 

struct node { 
    int i; 
}; 

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

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

+1

'std :: vector'の+1 –

+0

std :: vectorの場合、このサイズのベクトルを複数定義すると(6のように)、オーバーフローも存在しますか? –

+0

@ LearnMore:いいえ。各ベクトルは、スタック上の数バイト(あなたにとっては16バイト、データへのポインタは8バイト、サイズカウンタは8バイト)しか占有しません。 100000の構造体は異なるメモリ領域に割り当てられます。 –

0

はおそらく問題がループ状態にある:

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

あなたが100000まで比較するstd::size_t i;またはunsigned long i;を持っている必要があります。

+0

ok私はすぐにそれを試してみます –

+0

これはほとんど起こりそうにないと思います。これは、intが16ビット幅であることを意味する。それは*少なくとも* 16ビットである必要があることは事実ですが、実際には64ビットマシンを除いて(それはまだ32ビットです)、すべて "ネイティブ"サイズです。 –