切り捨てリンクリストのサイズ '__int64'から 'size_t
-
13-12-2019 - |
質問
RADIX SORTのC ++コードを9バケット作成することで、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: '引数': '__int64'から 'size_t'
への切り捨て:警告C4309: '引数':定数値の切り捨て
私はインターネットでそれを検索しました、誰かが数字が大きすぎると言っています。これが、リンクされたリストにこのような大きな数を処理するのは初めてです。このコードを再度作業させるために何でも変更する必要がありますか?
ありがとうございます。私が感謝されるアイデアや助けを支援します!
解決
私はあなたのコードを少しサンプルプログラムに変えました:
#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バイト)。それは私にはvidiorごとに64KB以上のスタックスペースを使用しないであろう古いコンパイラを思い出させます(または関数は覚えられませんでした。それはターボパスカルまたはターボC ...)。
これはC ++以来、最初の場所では生のC配列を使用しないことをお勧めします。代わりに、上記のコードを次のように置き換えることができます。
#include <vector>
struct node {
int i;
};
int main()
{
std::vector<node> bucket( 100000 );
}
.
std::vector
オブジェクトは、C配列を使用するすべての場合で使用できます。
他のヒント
おそらく問題はループ状態にある:
for (int i=0; i<100000; ++i)
^^^^^^^^^
.
std::size_t i;
まで比較するためにunsigned long i;
または100000
を使用する必要があります。