2017-03-16 21 views
-1

このプログラムはコンパイルされますが、実行されません。実行するたびに、私はこれを受け取ります:これはコンパイルされますが、実行されません。何か案は?

"Assignment3.1.exeの0x00D761EEで処理されない例外:0xC0000005:アクセス違反の読み取り場所0x00000000。"

私は間違っていますか?

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <cmath> 
using namespace std; 

//Function Prototype 
void getSize(int *); 
float *getValues(int *); 
float getMax(const float *, const int *); 


int main() 
{ 
    float * ptData = nullptr; 
    int * ptr = nullptr; 
    int num; 
    getSize(&num); 
    float values = *getValues(&num); 
    float max = getMax(ptData, &num); 

    return 0; 
} 

//******************************************************************************************************* 
void getSize(int * ptr) 
{ 
    cout << "Please enter a size to the array: "; 
    cin >> *ptr; 
    while (*ptr <= 1) 
    { 
     cout << "!!!Error: an array's size cannot be less than or equal to 1!\n"; 
     cout << "Please enter a size to the array: "; 
     cin >> *ptr; 
    } 
} 

//******************************************************************************************************* 

float * getValues(int * ptr) 
{ 
    float * ptData = new float[*ptr]; 

    cout << "Please enter all values of the array: \n"; 
    for (int count = 0; count < *ptr; count++) 
    { 
     cout << "Value " << (count + 1) << ": "; 
     cin >> ptData[count]; 
    } 

    delete[] ptData; 
    ptData = 0; 

    return ptData; 
} 

//******************************************************************************************************* 

float getMax(const float * ptData, const int * ptr) 
{ 
    float highest; 
    highest = *ptData; 
    for (int count = 1; count < *ptr; count++) 
    { 
     if (ptData[count] > highest) 
      highest = ptData[count]; 
    } 

    return highest; 
} 
+4

*私は間違っていますか?* - ポインタの代わりに 'std :: vector'を使うことを拒否しました。 – PaulMcKenzie

+4

2つ目は、デバッガで問題を突き止めて原因を突き止めることができませんでした。 0x00000000のアドレスは、ヌルポインタにアクセスすることを意味します。デバッガを使用すると、具体的にどこに何があったのかを特定するのに役立ちます。そのデバッガを使用することを習得していない場合は、今すぐ学習を開始するのに最適な時間です。 –

+4

* Assignment3 * - これが本当にC++コースのためにあなたに与えられた割り当てであれば、これから遠ざかります。誰もこの方法でC++プログラムを書く人はいません。 – PaulMcKenzie

答えて

-1

アクセス違反とは、あなたのものではないメモリ上の書き込みを意味します。そのため、コードをデバッグして、そのコードがどこで発生しているのかを確認する必要があります。 コードを編集したところ、完全に機能しました。

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <cmath> 
using namespace std; 

//Function Prototype 
void getSize(int *); 
float *getValues(int *); 
float getMax(const float *, const int *); 


int main() 
{ 
    /* float * ptData = nullptr;*/ 
    int * ptr = nullptr; 
    int num; 
    getSize(&num); 
    float *values = getValues(&num); 
    float max = getMax(values, &num); 


    cout << max << endl; 
    return 0; 
} 

//******************************************************************************************************* 
void getSize(int * ptr) 
{ 
    cout << "Please enter a size to the array: "; 
    cin >> *ptr; 
    while (*ptr <= 1) 
    { 
     cout << "!!!Error: an array's size cannot be less than or equal to 1!\n"; 
     cout << "Please enter a size to the array: "; 
     cin >> *ptr; 
    } 
} 

//******************************************************************************************************* 

float * getValues(int * ptr) 
{ 
    float * ptData = new float[*ptr]; 

    cout << "Please enter all values of the array: \n"; 
    for (int count = 0; count < *ptr; count++) 
    { 
     cout << "Value " << (count + 1) << ": "; 
     cin >> ptData[count]; 
    } 

/* delete[] ptData; 
    ptData = 0;*/ 

    return ptData; 
} 

//******************************************************************************************************* 

float getMax(const float * ptData, const int * ptr) 
{ 
    float highest = ptData[0]; 
    for (int count = 0; count < *ptr; count++) 
    { 
     if (ptData[count] > highest) 
      highest = ptData[count]; 
    } 

    return highest; 
} 

しかし、私はあなたがポインタを使用せずにこのコードをより良い方法で書くことができると言います。

+0

SOはOP用のコードを書き換えるためのものではなく、何が問題なのかを説明し、解決方法を示唆し、全体的な解決策を提示しません。 – zoska

1

いくつかの誤解があなたのコードにあります。

まず、あなたがC++でそれを変更するアドレスで値を渡す必要はありません、あなたは参照することにより、それを渡すことができますので、void getSize(int &);void getSize(int *);を変更すると良いでしょう(あなたがリファレンスを知らないなら、C++に関するいくつかの基本的なガイドを見てください)。

さらに、voidを返す関数を持たせるのは、実際にはintという値を与えても意味がありません。 int getSize()に書き直すか、エラーコード(int getSize(int &);)や機能が成功したかのような意味のある情報を渡します(例:bool getSize(int &);は成功するとtrueを返します)。

第2に、float *getValues(int *);は、getValuesがfloatへのポインタを返すことを意味します(関数の名前が指定されていると配列を保持する可能性があります)。この関数はアドレスで引数を取る必要はありません。変更しないので、float *getValues(int);が良く見えます(これはgetMax関数の場合も同じです)。

C++ではrawポインタを実際に使用していません。std::vectorのようなコンテナがあり、float *の配列を簡単に置き換えることができます。したがって、関数getValuesの最高の署名はstd::vector<float> getValues(int);になります。または、値の取得に失敗した特定の情報を渡す場合は、int getValues(int, std::vector<fload> &);を使用できます。

第3に、書き込みfloat values = *getValues(&num);は意味をなさない、私はかなりコンパイラがそれについて文句を言うべきだと確信しています。おそらく、float *getValues(int *);の意味を理解していないので、アスタリスク*が表示されている可能性があります。 *は関数名には属していません。戻り値の型を指定する部分なので、関数呼び出し時には使用しないでください。

もう一つ:

float * ptData = new float[*ptr]; 

... 

delete[] ptData; 
ptData = 0; 

return ptData; 

それはあなたがユーザーから取得してきたとgetValuesはNULLポインタを返します。すべてのデータを破壊します。 pDataは、不要になった場合にのみ削除する必要があります。その場合は、getMaxを呼び出した後である必要があります。

関連する問題