2016-12-22 16 views
0

structの行列を返す関数ポインタにtypedefを作成しようとしています。Cの構造体の行列を返す関数へのポインタ

typedef struct my_struct** (*func)(void) 
typedef struct my_struct[4][4] (*func)(void) 

をそれらのどれも働いていない:私が試した 。 構造体の私の行列は次のように初期化されます。

static struct my_struct matrix[4][4]; 

私のコードは、typedefでの2つのオプションでコンパイルされませんでした。 このtypedefはどのように作成する必要がありますか?おかげさまで

+3

コンパイルエラーは何ですか? –

+0

が期待されます)[(またはそのようなもの) –

+1

最初の 'typedef'には行列(別名2D配列)はなく、何も指すことのできないものはありません。ポインタは配列ではありません!また、配列を関数間でやりとりすることはできません。 – Olaf

答えて

1

配列を返すことはできません。ただし、配列へのポインタを返すことはできます。これは、関数から2次元配列を取り出す場合に返されるべきものです。

関数は4つの構造体の配列へのポインタを戻します:このタイプの

struct my_struct (*function(void))[4]; 

はtypedefは:

typedef struct my_struct (*type(void))[4]; 
type* p = function; 
+0

また、コピーセマンティクスが必要な場合は、配列を含む 'struct'を返すことができます。 –

+0

struct my_struct matrix [2] [4]の場合、struct my_struct(* type(void))[2]をtypedefに書く必要があります。構造体4の配列へのポインタを返しますか? –

+0

@Rotembenその場合、定義は変更されません。この関数が返すものは、4つの構造体の配列へのポインタです。 'struct my_struct matrix [2] [4] .'は、4つの構造体の2つの配列の配列を定義します。 – 2501

1

アレイが関数から返されることができません。

配列の最初の要素へのポインタを返すことができます。あなたの場合、配列の最初の要素はそれ自身配列(行列の行)です。配列へのポインタを返す関数へのポインタを宣言するために必要な構文は、あまりにも秘訣で直接使用することはできません。状況に対処する最もシンプルで使いやすい方法は、typedefを使用することです。

typedef struct my_struct row[4]; // a 4-element row in a matrix 
typedef row* (*func)(void);  // pointer-to-function returning pointer-to-row 

あなたは、サイズを省略することはできませんとはあなたがローカル配列にポインタを返すことはないことを知っている必要がありますすなわち、配列の代わりに

typedef struct my_struct row[]; 
typedef row* (*func)(void); // doesn't do what you want 

typedef struct my_struct *row; 
typedef row* (*func)(void); // doesn't do what you want 

をポインタを使用することはできませんCで許可されます。

row* myfunc(void) 
{ 
    struct my_struct my_matrix[4][4]; 
    return my_matrix; // will compile, but the behaviour is undefined 
        // a good compiler will warn you 
} 

この方法で静的オブジェクトまたは動的に割り当てられたオブジェクトに変換します。

ポインタではなくオブジェクトを返す場合は、ラッパー構造体を使用する必要があります。

typedef struct { struct my_struct elements[4][4]; } wrapper; 

wrapper (*foo)(void); //OK 
wrapper myfunc(void) 
{ 
    wrapper w; 
    return w; // OK 
} 
+0

私は理解していませんでした:typedef struct matrix row [4]; //行列の4要素行...あなたはtypedef struct my_struct matrix [2] [4] row [4]を意味しますか? –

+0

@Rotembenあなたの名前に一致するように識別子を変更しました。今はっきりしていることを願っています。 –

+0

ありがとうございますが、私は行列全体を返さなければなりません。私は行を指定することはできません.. –

関連する問題