C ++ - программа перестала работать - PullRequest
0 голосов
/ 29 октября 2011

Код, который я разместил ниже, должен работать в рекурсии (функция Sort ()) даже до 1кк раз.Проблема заключается в следующем: когда функция Sort () попадает в цикл с номером 43385, консоль перестает работать и выдает предупреждение: «Программа перестала работать».Это проблема с памятью?Если да, то где плохая часть кода?Привет.

#include <iostream>
#include <string>

using namespace std;  
string a, b;  
int n=0,i=0,counter=0;

int Sort(int i)  
{  
    int x=0,y=0,tmp0=0;  
    char tmp1;  

    for(x=i;x<n;x++) {
        if(a[x]==b[i]){
            tmp0=x;
            tmp1=a[x];
            break;
        }
        else
            continue;
    }
    for(y=tmp0;y>=i;y--)
        y==i ? a[i]=tmp1 : a[y]=a[y-1];

    counter+=tmp0-i;
    if(i==n-1)
        return counter;
    else
        Sort(i+1);  
}  
int main()  
{  
    cin >> n >> a >> b;  
    Sort(0);  
    return 0;  
}

Ответы [ 5 ]

4 голосов
/ 29 октября 2011

Возможно, переполнение стека вызовов из-за слишком глубокой рекурсии?

1 голос
/ 30 октября 2011

Я не уверен, что этот код пытается сделать.Вот ревизия, с некоторыми добавленными операторами печати и генератором случайных строк.

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;  
string a, b;  
int n=0,i=0,counter=0;

int Sort(int i)  
{  
int x=0,y=0,tmp0=0;  
char tmp1;  

for(x=i;x<n;x++) {
    if(a[x]==b[i]){
        tmp0=x;
        tmp1=a[x];
    cout << "x = " << x << " set tmp0 to " << tmp0 << " and tmp1 to " << tmp1 << endl;
        break;
    }
    else
        continue;
}
for(y=tmp0;y>=i;y--)
    y==i ? a[i]=tmp1 : a[y]=a[y-1];

counter+=tmp0-i;
cout << "  endof sort: a is " << a << endl;
cout << "              b is " << b << endl;
if(i==n-1) {
    cout << "Returning counter " << counter << endl;
    return counter;
} else {
    cout << "Running sort(" << i << " + 1)" << endl;
    Sort(i+1); 
}
}  
string randomStrGen(int length) {
static string charset =       "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
string result;
result.resize(length);

for (int i = 0; i < length; i++)
    result[i] = charset[rand() % charset.length()];

return result;
}
int main()  
{  
n = 50;
srand(time(NULL));
string a0, b0;
a0 = randomStrGen(n);
a = a0;
b0 = randomStrGen(n);
b = b0;
// cin >> n >> a >> b;  
cout << "Max string size is " << a.max_size() << endl;
cout << "Calling sort" << endl
     << " n is " << n << endl
 << " a is " << a << endl
 << " b is " << b << endl;
Sort(0);  
cout << "  endof program: a inital: " << a0 << endl;
cout << "                 a final:  " << a << endl;
cout << "                 b inital: " << b0 << endl;
cout << "                 b final:  " << b << endl;
return 0;  
}
1 голос
/ 29 октября 2011

Чтобы добавить в комментарий iltal, вы можете распечатать информацию о строках a, b: a.size (), a.length (), a.capacity (), a.max_size ()

0 голосов
/ 29 октября 2011

Вы можете жестко кодировать некоторые тестовые примеры, например, n = 20, a = "xyz ...", b = "abc ...", и добавлять операторы print в функцию сортировки, чтобы отслеживать происходящее.Кроме того, может быть полезно добавить несколько комментариев, чтобы уточнить, какова цель различных циклов.

0 голосов
/ 29 октября 2011
Счетчик

имеет тип int, но в нем много суммированных значений, которые могут быть больше, чем int. может попробовать int64?

...