2017-06-08 72 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

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