2016-05-25 7 views
0

私は宿題に取り組んでいます。私のクラスのインストラクターは質問をすることができません。彼は私たち自身でそれをすべて理解しようとしますが、私はこれを今週働かせようとしています。同じエラーを投げているのです。私は理由もありません。私はいくつかのGoogle検索を実行し、同様のエラーを持っていて解決策を見つけることができなかった人のためにそれを閲覧しました。新しい配列の作成時にアクセス違反の書き込み場所

それはそれは新しい配列を作成し、ユーザーの入力は、新しい配列を充填開始するために入力され、それがスローされるまで正常に動作します:0x000B517Bで

初回例外を6b.exeに:0xc0000005で:アクセス 違反の書き込み場所は0x00008147です。 '[4112] 6b.exe'プログラムはコード0(0x0)で終了しました。

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

int* read_data(int& size){ 
    size++; 
    return &size; 
} 

void main(){ 
    int size = 0; // size is 0 to start 
    int max = 10; // set max to 10 to start 
    float user; //user imputed float number 

    cout << "Start entering your numbers.\n Be sure to hit RETURN between each one.\nWhen you are finished, hit 'Q'\n"; 

    float *a = new float [max]; //set first array that can be deleted and replaced 

    do { 
     //if the array is full, make a new one and replace. 
     if(size == max){ 
      max = max *2; //double max number 
      float *b = new float [max]; //create temporary array b 

      for (int i = 0; i < size; i++){ 
       b[i] = a[i]; //copy old array to temporary 
      } 
      delete[] a; //remove old a array. 
      float *a = new float [max]; //create new a array with the new max, same name for the loop. 

      //copy new a array to resume filling 
      for(int i = 0; i< size; i++){ 
       a[i] = b[i]; 
      } 

      delete[] b; //remove temporary array to free memory. 
     } 

     cin >> user; // user inputs the number 
     a[size] = user; //user input 
     read_data(size); //increase size by one. 
    }while (!cin.fail()); 

    size--; //remove one for the entering of Q otherwise it throws off the count. 

    if (cin.fail()){ 
     cout << "\n\nYou have finished inputting.\n You have imputed " << size << " numbers. \nThe inputed numbers are as follows:\n"; 
     for(int i=0; i < size; i++){ 
      cout << a[i]; 

      if (i == size -1){ 
       cout << "\n\n"; 
      } 
      else { 
       cout << ", "; 
      } 
     } 
     cout << "\n\n"; 
    } 
    system("pause"); 
} 

インストラクターが非常に多く存在している理由である基本的にすべての行のコメントを望んでいます。

誰もがこれで私を助けることができれば素晴らしいだろう。

+0

インデントに何か間違っています、 –

+0

Stackoverflowはあなたの宿題をデバッグする場所ではありませんが、あなたの質問を下落させる人は適切ではないので。最初に失敗したコード行を特定する必要があります(私はすでにそれを行いましたが、 "無料"バグ修正には役に立たないでしょう)、 'cerr <<"コードを実行してください。 'cer'が常に出力されるので(' cout'はプログラムがクラッシュしたときにメッセージを出力しないことがあるので)最後の正しいコードを見つけます( 'cout'の代わりに' cerr'を使います)。デバッガが良いでしょうが、ターミナルにいますか? – GameDeveloper

+0

SOを使用することは最後の手段でした。私はVisual Studio 2012を使用しています。次回はcerrを心に留めておきます。教えてくれてありがとう、教えてくれてありがとう。 – Comatose

答えて

2
delete[] a; //remove old a array. 

これは、トップアップあなたmain()機能の外側のスコープで宣言a配列を、削除します。

次の行:

float *a = new float [max]; 

これは、内側のスコープでaという名前の新しい変数を作成します。あなたが元のaに起こっていると思われることは、あなたのmain()の冒頭に宣言されていましたが、実際には他のaに行われています。元のaは "非表示"なので、このスコープが終了すると、割り当てた新しい配列がリークし、元のa配列が未割り当てメモリを指しています。

ヒラリティが続いています。

「配管をもっと太くするほど、「 ドレインを止めるのが簡単になります」 - Star Trek III、Scotty

新しいb配列を割り当てられ、それにaの内容をコピーし、あなたが本当に行うために必要なすべてをした後:

a=b; 

あなたは別のa配列を割り当てる必要はありませんし、 bからコピーしてからbを削除してください。それは絶対に何も成し遂げません。あなたは誤って間違ったミスをしてしまいました...

+0

新しいaは、ループの外側で作成された最初のaを置換することになっています。最初の配列がいっぱいになると、配列はtemp b配列にコピーされ、より大きな配列を作成して再充填することができます。これは、連続的に塗りつぶすことができる擬似無限配列を作るための割り当ての一部です。 – Comatose

+0

私は言ったように、これは時間の無駄です。同じ配列を2回コピーする必要があると感じたら、もう一度宣言しないでください。 'float * a = new float [max];の代わりに、' a = new float [max]; 'だけです。しかし、あなたはおそらくマークダウンされるでしょう、私はあなたが配列をただ一度割り当ててコピーすることが必要であることはかなり確信しています。 –

+0

ああ!申し訳ありませんが、あなたが編集する前に私は答えました。私たちが取り組んでいる本には、そのような奇妙なことがあり、それは入門的な粗いものであるため、インストラクターが期待しているものです。フロートを取り除く*は働いた。助けてくれてありがとうございました。講師は、ダイナミックアロケーションアレイの使用方法についてはあまり明確ではありませんでした。 – Comatose

関連する問題