ページ 11

extern宣言を使用したときの二次元配列

Posted: 2010年8月17日(火) 20:30
by テラ
はじめまして、テラといいます。早速ですが本題を。

ヘッダファイル内で extern int a[2][2]; と宣言したあとで、
ソースファイル内で a[2][2] = { {1,0},{0,1} }; のように初期値を入力したところ、
最初の { で「式が必要です」というエラーが出てしまいます。

自分としては、これを使用してマップ上で進行の可否のデータを一箇所のソースファイルにまとめたいと思っています。
そのため、上記のエラーが直ればマップ作成に移動できると思いますので、どなたかご教授願います・・・!

Re:extern宣言を使用したときの二次元配列

Posted: 2010年8月17日(火) 20:36
by シエル
配列の初期化は宣言時しか行えません。

ソースファイル内で代入する場合は、個別に代入して下さい。

Re:extern宣言を使用したときの二次元配列

Posted: 2010年8月17日(火) 23:29
by box
> ソースファイル内で a[2][2] = { {1,0},{0,1} }; のように初期値を入力したところ、

その行の前後何行かを含めて、実際に書いたソースコードを示してください。
画像

Re:extern宣言を使用したときの二次元配列

Posted: 2010年8月18日(水) 08:27
by テラ
>シエルさん
回答ありがとうございます。
マップ作成のソースの中で変数宣言してみます。

>BOXさん
以下がそのソースコードです。

#include "global.h"

void first_initialize(){
player.x = 320;
player.y = 160;
player.type = 0;
player.move = 0;
map_isMove[2][2] = {1,0},{0,1} };
}

global.h 内で map_isMove[2][2] が int型で extern宣言されています。
また、その上の構造体に関しては、同様に global.h 内で構造体を宣言しているヘッダファイルをインクルードしています。
画像

Re:extern宣言を使用したときの二次元配列

Posted: 2010年8月18日(水) 11:34
by へろりくしょん
[/url]が配列としての意味を持つのは宣言の時のみです。

式中に現れた場合は添え字演算子となりポインタ演算のシンタックスシュガーに過ぎません。

したがって、map_isMove[2][2] = {1,0},{0,1} }; というコードは

*(*(map_isMove+ 2) + 2) = {1,0},{0,1} }; というコードと全くの等価です。

*(*(map_isMove+ 2) + 2)の型は
>extern int a[2][2]; と宣言したあとで
ということですから、int 型です。 配列型ではありません。


map_isMove[0][0] = 1;
map_isMove[0][1] = 0;

という風に個別に初期化する必要があります。

もしくは
static const int Hoge[2][2] = {{1,0},{0,1}};
とでもしておいて、
memcpy() あたりで一括にコピーしてしまうかですね。

Re:extern宣言を使用したときの二次元配列

Posted: 2010年8月18日(水) 15:47
by テラ
>へろりさん
回答ありがとうございます。
extern宣言したあとでは、配列型にはならないということですね・・・。
もうちょっと工夫して、マップ作成しやすい方法を考えてみます。 画像