2012-03-23 10 views
6

私はいくつかの450要素の文字配列を持っています(lcd画面に表示するビットマップデータを格納しています)。私はそれらをヘッダファイルの下に置きたいと思いますが、#defineです。 Cでどうすればいいですか?Cで配列を定義する

#define numbers[450] {0, 1,etc...}

#define numbers {0, 1, etc...}

#define numbers[450]は、うーん...あなたは確かに定義を使用する必要はありません...後で

、より多くの

+6

どうすればよいですか?あなたが今までに持っているコードと、どのようなコンパイラエラーが出ているのでしょうか? –

+1

そのようなものは '#define'できません。それについて考える。あなたがそれを使うたびに新しい配列を宣言します。もちろん、それは複数の再定義につながるでしょう。マクロは単なるテキスト置換です。テキストを自分で置き換え、意味があるかどうか確認してください。 –

答えて

9

を番号を設定します。ヘッダ、const、静的配列として追加してください。

/* prevents multiple, redundant includes */ 
/* make sure to use a symbol that is fairly sure to be unique */ 
#ifndef TEST_H 
#define TEST_H 

/* your image data */ 
const char image[] = { 1, 2, 3, 4, ... }; 

#endif 

また、コンパイルエラーのヘルプが必要な場合は、コードを投稿する必要があります。

+0

はい、ヘッダーが複数回呼び出された場合(プログラムの複数の部分で必要です)、エラーが発生します。 – Reid

+2

次に、[インクルードガード](http://en.wikipedia.org/wiki/Include_guard)を使用して、例を示します。私はそれが "ヘッダーを呼ぶ"ことが何を意味するのか分かりませんが、あなたがインクルードを意味すると思います。だから、私が言ったように...例。私たちは知っているわけではありません。 :) –

+0

ありがとうございます。私はそれについて考えなかった '#ifndef'を試してみます。 – Reid

6

LCDに表示されるようになりました。私はこれが組み込みシステムであると想定しています。

データをヘッダーに入れないでください。

通常のCまたはC++ファイルにデータを入れます。これをコンパイルしてください。それにはデータが含まれていてもかまいません。大丈夫です。更新が簡単です。

次に、ヘッダーファイルを使用してデータにアクセスします。例えば

は、images.cファイルに:

#include "images.h" 
const byte numbers1[MAX_NUMBERS1] = { ... }; 
byte numbers2[MAX_NUMBERS2];  // will be initialsied to 0 

images.hは次のとおりです。

#ifndef _IMAGES_H_ 
#define _IMAGES_H_ 

typedef unsigned char byte; 
#define MAX_NUMBERS1 (450) 
     // different constants in case you change something   
#define MAX_NUMBERS2 (450)  
     // even better if you can do const static int MAX_NUMBERS1=450; 
     // but depends on the compiler 
extern const byte numbers1[MAX_NUMBERS1] = { ... }; 
extern byte numbers2[MAX_NUMBERS2];  // will be initialised to 0 

#endif 

次に、プログラム内の他のすべての.cファイルがそれらにアクセスすることができます。

これは、ヘッダファイルに変数定義を入れて(ほぼ)常に悪い考えです。変数の例えばの宣言

の宣言。 extern byte numbers2[MAX_NUMBERS2]; は、最後にリンクされたプログラムにnumbers2という配列変数があり、それ以外にはという配列変数があることをCコンパイラに伝えています。リンカーが(他の場所から)その定義を取得しないと、変数に割り当てられるスペースがないため、エラーが発生します。

変数の定義(externはありません)。 byte numbers2[MAX_NUMBERS2]; は、numbers2という配列変数が存在することをCコンパイラに効果的に伝えており、このソースファイルの結果のオブジェクトコードにスペースを割り当てる必要があります。これは、最終的な変数の値を保持するために使用されますリンクされたプログラム。 numbers2ため

空間は、それが実際の定義(NO extern)を見ると、それが割り当てられ、それが(externが先行する)の宣言を見てCコンパイラによって割り当てられないあります。

したがって、変数の実際の定義をヘッダーファイルに入れて、複数のソースコードファイル(.c)にインクルードすると、Cコンパイラは変数のスペースを複数回割り当てます。リンカーはエラーを返します(通常は同じ名前の複数定義)。

さらに微妙な問題があります。最初にプログラムを開発するときに、ヘッダーファイルが1つのソースファイルのみに含まれる場合、プログラムは正しくコンパイルされ、リンクされます。後で、2番目のソースファイルにヘッダーが含まれている場合(元のソースコードファイルを2つのファイルに分割した人がいるかもしれません)、リンカーは 'multiple definitions'エラーを発生させます。プログラムがコンパイルとリンクに使用されていて、明らかに何も変更されていないため、これは非常に混乱する可能性があります。

概要
は、ヘッダファイルに定義を置くことによって変数のためのスペースを割り当てることはありません。ヘッダーファイルには変数宣言のみを入れます。

+0

はヘッダーファイルにインクルードしない理由です。なぜなら、組み込みシステムであるため、より多くのディスクスペースが必要になるからです。 – Abdul

+0

@Abdul - 私はそれがより明確であることを望む。組み込みシステムの場合は、ディスクがない可能性があります。 – gbulmer

+0

ディスクを持たない組み込みシステムに格納されている実行可能バイナリはどこですか? – Abdul

1

私は同様の問題がありました。私の場合は、他の静的配列のサイズとして使用するために、配列の配列が必要でした。私は

const int my_const_array[size] = {1, 2, 3, ... }; 

を使用して、宣言しようとしたとき:

int my_static_array[my_const_array[0]]; 

私は、コンパイラからエラーを取得する:

array bound is not an integer constant 

だから、最終的に私は(以下でしたたぶんありますより洗練された方法):

#define element(n,d) ==(n) ? d : 
#define my_const_array(i) (i) element(0,1) (i) element(1,2) (i) element(2,5) 0 
関連する問題