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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
テラ

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

#1

投稿記事 by テラ » 15年前

はじめまして、テラといいます。早速ですが本題を。

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

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

シエル

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

#2

投稿記事 by シエル » 15年前

配列の初期化は宣言時しか行えません。

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

box

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

#3

投稿記事 by box » 15年前

> ソースファイル内で a[2][2] = { {1,0},{0,1} }; のように初期値を入力したところ、

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

テラ

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

#4

投稿記事 by テラ » 15年前

>シエルさん
回答ありがとうございます。
マップ作成のソースの中で変数宣言してみます。

>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宣言を使用したときの二次元配列

#5

投稿記事 by へろりくしょん » 15年前

[/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宣言を使用したときの二次元配列

#6

投稿記事 by テラ » 15年前

>へろりさん
回答ありがとうございます。
extern宣言したあとでは、配列型にはならないということですね・・・。
もうちょっと工夫して、マップ作成しやすい方法を考えてみます。 画像

閉鎖

“C言語何でも質問掲示板” へ戻る