2017-06-08 102 views
-4

你好,我如何在C++(98)上做到這一點。 它在視覺工作室或其他什麼地方工作良好,但在我想使用它的地方不起作用。解析數組C++

https://image.prntscr.com/image/loIxb-YRRiGh9XAFmZ_0dA.png

我試圖與其他值發送多個功能陣列,如:

Print(xx, parse_array()); // No elements in parsearray all will be 0 
Print(xx, parse_array(25)); // First element [0] will be 25, rest of them 0. 



int * parse_array(int val1 = 0, int val2 = 0, int val3 = 0, int val4 = 0) 
{ 
    int m_pDataArray[4] = { 
     val1, val2, val3, val4 
    }; 

    return m_pDataArray; 
} 

void Print(bool notImportant, int m_pDataArray[4]) 
{ 
    printf("m_pDataArray 0: %d", m_pDataArray[0]); 
    printf("m_pDataArray 1: %d", m_pDataArray[1]); 
    printf("m_pDataArray 2: %d", m_pDataArray[2]); 
    printf("m_pDataArray 3: %d", m_pDataArray[3]); 
} 

Print(true, parse_array(10, 20, 30); 
Print(true, parse_array(10); 
Print(true, parse_array()); 
+0

描述你的問題。不要只說「它不工作」 - 定義「* it *」。你想要它做什麼,它不?並且不要鏈接到外部圖像; *將問題*中的所有相關信息*作爲*文本*。 –

+0

對不起,我在幾秒前編輯了第一個鍋,並附上了一張照片。 https://image.prntscr.com/image/loIxb-YRRiGh9XAFmZ_0dA.png –

回答

-1

您在parse_array返回一個局部變量的地址。這是未定義的行爲,從函數返回後,對象int m_pDataArray[4]不再存在,則返回的指針立即失效。未定義的行爲可以做任何事情,包括有時在某臺計算機上工作,但不在其他計算機上工作,就像您所描述的那樣。

int []沒有價值語義,你不能輕易返回它。改爲使用std::array

#include <array> 

std::array<int, 4> parse_array(int val1 = 0, int val2 = 0, int val3 = 0, int val4 = 0) 
{ 
    std::array<int, 4> m_pDataArray = { 
     val1, val2, val3, val4 
    }; 

    return m_pDataArray; 
} 

否則,您將需要返回動態分配的緩衝區,然後記得刪除它們。最簡單的方法是使用std::unique_ptr,但那些不存在於C++ 98中。

編輯:似乎我忘了在C++ 11中添加了std::array。您可以改爲使用std::vector來獲得相同的結果。

#include <vector> 

std::vector<int> parse_array(int val1 = 0, int val2 = 0, int val3 = 0, int val4 = 0) 
{ 
    std::vector<int> m_pDataArray; 
    m_pDataArray.push_back(val1); 
    m_pDataArray.push_back(val2); 
    m_pDataArray.push_back(val3); 
    m_pDataArray.push_back(val4); 

    return m_pDataArray; 
} 
+0

感謝您的回答弗朗索瓦,但我在C++ 98 ...不存在真正的方法,我想要什麼..?或者可能像我可以做一個載體或我不知道.. std :: vector parse_array(int a = 0,int b = 0,int c = 0,int d = 0) { std: :vector m_vec_data; m_vec_data.push_back(a); m_vec_data.push_back(b); m_vec_data.push_back(c); m_vec_data.push_back(d); return m_vec_data; } 空隙打印(標準::矢量 m_vec_data) { \t對(INT I = 0; I

+0

@ Dr.Vendetta更新時間如果可以,請考慮升級編譯器。從C++ 98到C++ 11的改進確實是巨大的,做事方式完全改變。 –

+0

感謝兄弟,完美的作品,上帝保佑你! –