2017-03-16 58 views
-1

該程序將編譯,但不會運行。它運行每當我收到這樣的:這編譯,但它不運行。有任何想法嗎?

「在0x00D761EE在Assignment3.1.exe未處理的異常:0000005:訪問衝突讀取位置00000000」

我在做什麼錯?

#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

對於兩個,未能在調試器中單步查找問題並確定原因。地址0x00000000表示訪問一個nul指針。使用調試器可以幫助您識別哪些地方以及具體是哪些地方。如果您還沒有學會使用該調試器,現在是開始學習的最佳時機。 –

+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)。

其次,float *getValues(int *);意味着getValues返回指向float的指針(可能持有一個給定名稱的函數)。此功能沒有把它的地址參數,因爲它並沒有改變,所以float *getValues(int);看起來更好(這也是getMax功能的情況下)。

在C++中我們並沒有真正使用原始指針,我們有容器的stl,如std::vector,它可以很容易地替換float *數組。所以對於功能getValues最好的簽名會std::vector<float> getValues(int);或者,如果你想傳遞的具體信息爲什麼取值失敗,你可以有int getValues(int, std::vector<fload> &);

第三,寫作float values = *getValues(&num);沒有意義,我敢肯定compilator應該抱怨。可能是星號*到了這裏,因爲你不太明白float *getValues(int *);的含義。 *不屬於函數名稱,它是指定返回類型的一部分,因此在調用函數時不應使用它。

一兩件事:

float * ptData = new float[*ptr]; 

... 

delete[] ptData; 
ptData = 0; 

return ptData; 

它將從用戶銷燬所有你所獲取的數據,並getValues將返回空指針。 pData只有在您不再需要時才應該刪除,因此在您的情況下應該在撥打getMax之後刪除。

相關問題