Усечение размера связанного списка с __int64 до size_t - PullRequest
2 голосов
/ 13 марта 2012

Я успешно написал C ++-код для радикальной сортировки, создав 10 блоков.Для 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: «аргумент»: усечение константызначение

Я искал его в интернете, кто-то говорит, что число слишком велико.Это первый раз, когда я обрабатываю такое большое число в связанном списке.Нужно ли что-то изменить, чтобы этот код снова заработал?

Спасибо.Любые идеи и помощь, я буду признателен!

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Я превратил ваш код в небольшой пример программы:

#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 байта каждый). Это напоминает мне старые компиляторы, которые не позволяли вам использовать более 64 КБ стекового пространства на переменную (или функцию? Я не помню. Это было с Turbo Pascal или Turbo C ...).

Поскольку это C ++, я предлагаю просто не использовать необработанный массив C в первую очередь. Вместо этого вы можете заменить приведенный выше код на:

#include <vector>

struct node {
    int i;
};

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

Объект std::vector можно использовать во всех случаях, когда вы используете массив C.

0 голосов
/ 13 марта 2012

Возможно проблема в условии цикла:

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

Вам необходимо иметь std::size_t i; или unsigned long i; для сравнения до 100000.

...