Предложение для chkstk.asm stackoverflow исключение в C++ с Visual Studio

Я работаю с реализацией сортировки слиянием. Я пробую C++ Visual Studio 2010 (msvc). Но когда я взял массив 300 000 целых чисел для синхронизации, это показывает необработанное stackoverflow исключение и берет меня в файл только для чтения, названный "chkstk.asm". Я уменьшил размер до 200 000, и он работал. Снова тот же код работал с редактором C-free 4 (mingw 2.95) без любой проблемы, в то время как размер был 400000. У Вас есть какое-либо предложение для получения кода, работающего в Visual Studio?

Может быть рекурсия в сортировке с объединением, вызывает проблему.

11
задан Gulshan 7 March 2018 в 05:36
поделиться

3 ответа

Проблема решена. Спасибо Котти за предоставленный код. У меня возникла проблема при сравнении с этим кодом. Проблема заключалась не в слишком большой рекурсии. На самом деле я работал с обычным массивом C ++, который хранился в стеке. Таким образом, проблема исчерпала пространство стека. Я просто изменил его на динамически выделяемый массив с операторами new / delete, и он сработал.

13
ответ дан 3 December 2019 в 04:12
поделиться

Я не совсем уверен, но это может быть конкретной проблемой вашей реализации сортировки слиянием (которая вызывает переполнение стека). Есть много хороших реализаций (используйте google), следующая работает на VS2008 с размером массива = 2000000.

(Вы можете попробовать это в VS2010)

#include <cstdlib>
#include <memory.h>

// Mix two sorted tables in one and split the result into these two tables.
void Mix(int* tab1, int *tab2, int count1, int count2)
{
   int i,i1,i2;
   i = i1 = i2 = 0;
   int * temp = (int *)malloc(sizeof(int)*(count1+count2));

   while((i1<count1) && (i2<count2))
   {
      while((i1<count1) && (*(tab1+i1)<=*(tab2+i2)))
      {
         *(temp+i++) = *(tab1+i1);
         i1++;
      }
      if (i1<count1)
      {
         while((i2<count2) && (*(tab2+i2)<=*(tab1+i1)))
         {
            *(temp+i++) = *(tab2+i2);
            i2++;
         }
      }
   }

   memcpy(temp+i,tab1+i1,(count1-i1)*sizeof(int));
   memcpy(tab1,temp,count1*sizeof(int));

   memcpy(temp+i,tab2+i2,(count2-i2)*sizeof(int));
   memcpy(tab2,temp+count1,count2*sizeof(int));
   free(temp);
}

void MergeSort(int *tab,int count) {
   if (count == 1) return;

   MergeSort(tab, count/2);
   MergeSort(tab + count/2, (count + 1) /2);
   Mix(tab, tab + count / 2, count / 2, (count + 1) / 2);
}

void main() {
   const size_t size = 2000000;
   int* array = (int*)malloc(sizeof(int) * size);
   for (int i = 0; i < size; ++i) {
      array[i] = rand() % 5000;
   }

   MergeSort(array, size);
}
6
ответ дан 3 December 2019 в 04:12
поделиться

Я предполагаю, что у вас так много рекурсии, что вы re просто не хватает места в стеке. Вы можете увеличить размер стека с помощью параметра командной строки / F компоновщика . Но если вы продолжаете достигать пределов размера стека, вы, вероятно, захотите реорганизовать рекурсию из своего алгоритма.

6
ответ дан 3 December 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: