2017-06-08 16 views
-4

こんにちは、私はこれをC++(98)で行うことができます。 これはビジュアルスタジオなどではうまくいきますが、使用したい場所では機能しません。配列の解析C++

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

ように私は、アレイ内の他の値との複数の機能を送信しようとしている:あなたはparse_array内のローカル変数のアドレスを返している

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

。これは未定義の動作で、関数から返された後にオブジェクト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には存在しません。

編集:std::arrayがC++ 11で追加されたことを忘れたようです。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

Francoisにお返事ありがとうございます。でも、私はC++ 98上にいます...私が望むものの本当の方法は存在しません。私はベクトルでそれを行うことができますか、私は知らない.. std :: vector parse_array(int a = 0、int b = 0、int c = 0、int d = 0) { std: :ベクトル 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)(I = 0をint型、iが(m_vec_data.sizeを<); iが++)のため { \t \t \tのprintf( "m_pDataArray I:%d個の\ n"、 m_vec_data [i]); } –

+0

@ Dr.Vendetta更新しました。可能であれば、コンパイラーをアップグレードしてください。 C++ 98からC++ 11への改善は本当に莫大で、やり方は完全に変わっています。 –

+0

おかげで、完璧に動作し、神はあなたを祝福! –