2011-10-29 111 views
0

,我貼在下面應該在遞歸工作(在sort()函數)的代碼甚至高達1KK倍。問題是:當Sort()函數進入循環編號43385時,控制檯停止工作併發出警告:「程序已停止工作」。這是內存問題嗎?如果是的話,代碼的壞處在哪裏?問候。C++ - 程序已停止工作

#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; 
} 
+1

它會崩潰在哪一行? – tenfour

+0

之前排序第(i + 1)實際上只是或之後之前,我不能籤) – jwitos

+1

一個幾句話:在別人繼續在第一個for循環是不需要的,循環繼續下一次迭代反正。 tmp0,tmp1不是有用的名稱。例如,更好的名稱可能是tmp0的索引,tmp1的值或類似的東西。用這些名字很難理解這些參數的含義。 –

回答

4

也許是因爲遞歸太深而導致調用堆棧溢出?

+0

你應該嘗試使用一個調試器(例如Linux下的'gdb')來了解正在發生的事情。它不 - 你會更好地與'G ++ -g -Wall',假設你有一個像編譯 –

0

計數器是int類型的,但它有很多在其總和值可以是在所有的比INT更大。也許嘗試int64?

+0

一個GCC我所做的,只是之前崩潰完全適合長整型,甚至unsigned long int類型如果需要的話,但還是計數器值編譯沒有工作。 – jwitos

0

你可以硬編碼一些測試情況下,如N = 20,=「XYZ ......」,B =「abc ...」中,並打印語句添加到您的排序功能來跟蹤是怎麼回事。另外,增加一些註釋以澄清不同循環的目的可能會有所幫助。

1

爲了增加iltal的評論,你可能想打印出的信息對字符串A,B:a.size(),則爲a.length(),a.capacity(),a.max_size()

1

我不確定這段代碼試圖做什麼。這是一個修訂版本,添加了一些打印語句以及一個隨機字符串生成器。

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