2017-01-10 17 views
-1

私はこのプログラミング入門を得ました。次のシーケンスの1番目のメンバーを見つけるプログラムを作成する必要があります1、121、1213121、121312141213121 .. 。基本的に、最初のメンバーは1であり、次のメンバーは[前のメンバー] [前のメンバー]で構成されます。 N < 10.私はこの問題を理解していない、それをインターネットで検索しようとしたが、私を助けることができない何かを得なかった。ヒープ破損が検出されました:ノーマルブロック(#176)後

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int size(int n, int realsize); 
int main() 
{ 
    int n; 
    cin >> n; 
    if (n == 1) { 
     cout << "1"; 
     return 0; 
    } 
    int helper = 0; 
    char c = '2'; 
    char* look; 
    char* say; 
    say = new char[size(n, 1) + 1](); 
    look = new char[size(n - 1, 1) + 1](); 
    look[0] = '1'; 
    while (helper < n) { 
     for (int i = 0; i < size(helper + 1, 1); i++) { 
      say[i] = look[i]; 
     } 
     say[size(helper + 1, 1)] = c; 
     for (int i = size(helper + 1, 1) + 1; i < size(helper + 1, 1) * 2 + 1; i++) { 
      say[i] = look[i - (size(helper + 1, 1) + 1)]; 
     } 
     for (int i = 0; i < size(helper + 1, 1) * 2 + 1; i++) { 
      look[i] = say[i]; 
     } 
     helper += 1; 
    } 
    cout << say; 
    delete[] say; 
    delete[] look; 
    return 0; 
} 

int size(int n, int realsize) 
{ 
    if (n == 1) 
     return realsize; 
    else 
     return size(n - 1, realsize * 2 + 1); 
} 
+0

***ヒープの破損が検出されました:ノーマルブロック***の後、ダイナミックアレイの1つ以上の範囲外に出る可能性が最も高いです。 – drescherjm

+1

動的割り当ての代わりに 'std :: vector 'を使っていたなら、あなたは配列の境界から外れていることを示すために 'at()'を使うことができました。 [ここをクリック](http://ideone.com/1tVUXC)最後のループは物事がうまくいかないところです( 'look [i] = say [i];')。 Visual Studioを使用しているように見えるので、プログラムが終了したときに "ヒープの破損"エラーの代わりに、間違いをした直後にout_of_range例外をスローする必要があります。 – PaulMcKenzie

答えて

0

変数lookの容量を上書きしています。それはsayの全体の内容で書かれて終わるので、同じサイズを持つ必要があります。

私は以下のコードを良いコードとして許していませんが、自分の実装からの調整は少なく、作業結果に向けてより強固な基盤を提供する必要があります。私は数の最初のカップルでそれをテストしましたが、それが完璧であるという保証はありません。

#include <iostream> 

using namespace std; 

int size(int n, int realsize); 

int main() 
{ 
    int n; 
    cin >> n; 
    if (n == 1) 
    { 
     cout << "1"; 
     return 0; 
    } 
    int helper = 0; 
    char c = '2'; 
    char * look; 
    char * say; 
    say = new char[size(n, 1) + 1];  // Ditch the() call, which is confusing. 
    look = new char[size(n, 1) + 1]; // Make the same size as "say" 
    look[0] = '1'; 
    while (helper < n - 1) // You're overrunning this loop I think, so I did it to n - 1. 
    { 
     for (int i = 0; i < size(helper + 1, 1); i++) 
     { 
      say[i] = look[i]; 
     } 
     say[size(helper + 1, 1)] = c + helper; // You were adding '2' every time, so this will add 2, 3, 4, etc incrementally. 
     for (int i = size(helper + 1, 1) + 1; i < size(helper + 1, 1) * 2 + 1; i++) 
     { 
      say[i] = look[i - (size(helper + 1, 1) + 1)]; 
     } 
     for (int i = 0; i < size(helper + 1, 1) * 2 + 1; i++) 
     { 
      look[i] = say[i]; 
     } 
     helper += 1; 
    } 
    say[size(n, 1)] = '\0'; // Null-terminate "say" before printing it out. 
    cout << say; 
    delete[] say; 
    delete[] look; 
    return 0; 
} 

int size(int n, int realsize) 
{ 
    if (n == 1) 
     return realsize; 
    else 
     return size(n - 1, realsize * 2 + 1); 
} 
+0

ありがとう、たくさん!私はそれを修正し、私の教授からテストをパスします。 :) –

+0

それを答えとして選択しますか? :) – Mitch

+0

私はどうしたのか分かりませんが、私はそれをやったと思います:)。助けてくれてありがとう! –

関連する問題