2017-06-05 9 views
1

私が達成しようとしているのは、関数から2次元配列へのポインタをmain()でアクセスできるように戻すことです。私は、std::vectorのようなあなたのためにそれを行ういくつかのC + +ライブラリがあることを知っているが、私はちょうど通常のポインタと配列に固執するように私は組み込みボード(STM32)で作業しているので、動的メモリ割り当てを避けようとしています。 (も私も、なぜ私はポインタ/配列で動作するように強制していますですKEIL uVisionでstd::arrayを使用することはできません何らかの理由で)また関数から2D配列へのポインタを返す - C++

、私はローカル配列int arr[2][2]へのポインタを返すことは定義されていることを理解します私はtest_arrayを作成し、それをクラスの中で宣言し、それを関数(グローバル変数として動作する)で定義するので、関数が返った後はもはや有効ではないので、関数内の良い考えはありません問題ではない。皆さんはどう思いますか?しかし、このようにそれを行うとエラーに"スカラー初期化子で過剰の要素"

#include <iostream> 
#include "file.hpp" 

int main() { 

    myClass class_object; 

    class_object.value = class_object.foo(); 


} 

//file.hpp 

#include <stdio.h> 

class myClass{ 

    int array[2][2]; 
    int (*foo())[2]; 
    int (*value)[2]; 

    int test_array[2][2]; //declaring here! 

}; 

//file.cpp 

#include "file.hpp" 

int (*myClass::foo())[2]{ 

    test_array[2][2]={ {10,20}, {30, 40} }; //defining here - ERROR!! 

    int arr[2][2]= { 
     {1, 10}, 
     {20, 30} 
    }; 


return arr; 


} 
+2

'int(* myClass :: foo())[2] {'これは私がまだ追いついていない関数宣言のいくつかの新しい方法ですか?うんざりのように見える!また、あなたがしていないことを知っていたと言っている地元はまだ戻っています。最後に、エラーの発生場所を教えてください。 – John3136

+3

なぜ人々はC配列に執着しているのですか? : –

+2

@Baum無能な教授たちが教えているので、これらは重要です_産業はこれらの人々を取り除くだけで、配列の名前ではありません。配列を割り当てることはできません。 'std :: array 、2>'を使った場合は、問題が少なくなるかもしれません。 –

答えて

0

あなたは本当にC-Arrayで作業したい場合は、typedefを使用しを与えますを通常のの構文にする:

class myClass{ 
    public: 
    using array2 = int[2][2]; 

    myClass() { 
     test_array[0][0] = 0; 
     test_array[0][1] = 1; 
     test_array[1][0] = 2; 
     test_array[1][1] = 3; 
    } 

    const array2& getArray() const { return test_array; } 
    array2& getArray() { return test_array; } 

private: 
    array2 test_array; 
}; 
+0

これはちょっと混乱しているようです。私はクラス内の配列を初期化したくないのですが、内部にある数学関数を実装しているので関数内にあります。 – Doej

+0

@Doejこれは厳しい制約のある埋め込みプラットフォームであれば、なぜ動的メモリを完全に削除しないのでしょうか?おそらくすべての可能な結果のためにグローバルメモリを予約していないのですか?(あなたが**知っているとしましょう**アプリケーションは2x2のint配列を最大100個生成するので、コンパイル時には1600バイトのメモリをコンパイル時に固定しますC配列へのポインタと同じように実用的ではないものを返すのではなく、計算の対象となる関数のターゲットポインタを与えます(通常は素早く通常のint型に崩壊し、配列型として開始する利点を失います)。 – Ped7g

1

当面の問題:

test_array[2][2]={ {10,20}, {30, 40} }; //defining here - ERROR!! 

が定義されていません。 test_arrayは、myClassに定義されています。これは、test_arrayの単一の要素、特に存在しない[2][2]に割り当てようとしています。コンパイラが特に怒っているのは境界外アクセスではありませんが、={ {10,20}, {30, 40} };は配列を1つの配列要素に入れようとしています。コンパイラは1つの数値を期待しているので、4つの数値は間違いなく超過しています。

残念ながら、私はあなたがしたいことをする良い方法を知らない。イニシャライザリストを使用して配列を初期化することはできますが、初期化リストから割り当てることはできません。あなたはあなたのために働くことがあり、コンストラクタで初期化し、test_arrayで何をすべきかに応じて、だから、

class myClass{ 
public: 

    myClass(); 
    void foo(); 

    int test_array[2][2]; //declaring here! 
}; 

// you can do this: 
myClass::myClass(): test_array{ {10,20}, {30, 40} } 
{ 

} 

void myClass::foo() 
{ 
    // but you can't do this: 
    test_array = { {10,20}, {30, 40} }; 
} 

。あなたはfooを呼び出すたびに、アレイをリセットする必要がある場合は、おそらく自動変数は、部屋and gain access to std::array, give this a try.ノートでゾウを消すために、より良いフィットあなたのための

void myClass::foo() 
{ 
    int temp_array[2][2] = { {10,20}, {30, 40} }; 

    // use temp_array 

    // maybe copy temp_array to test_array with good ol' memcpy here if you 
    // need to carry the state for some reason. 
} 

です:私はこれをやったことがありません。それは私が知っているすべてのために完全な悲惨な災害になる可能性がありますので、塩の粒でそれを取る。

関連する問題