私はいくつかの450要素の文字配列を持っています(lcd画面に表示するビットマップデータを格納しています)。私はそれらをヘッダファイルの下に置きたいと思いますが、#define
です。 Cでどうすればいいですか?Cで配列を定義する
#define numbers[450] {0, 1,etc...}
#define numbers {0, 1, etc...}
#define numbers[450]
は、うーん...あなたは確かに定義を使用する必要はありません...後で
、より多くの
私はいくつかの450要素の文字配列を持っています(lcd画面に表示するビットマップデータを格納しています)。私はそれらをヘッダファイルの下に置きたいと思いますが、#define
です。 Cでどうすればいいですか?Cで配列を定義する
#define numbers[450] {0, 1,etc...}
#define numbers {0, 1, etc...}
#define numbers[450]
は、うーん...あなたは確かに定義を使用する必要はありません...後で
、より多くの
を番号を設定します。ヘッダ、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
また、コンパイルエラーのヘルプが必要な場合は、コードを投稿する必要があります。
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'エラーを発生させます。プログラムがコンパイルとリンクに使用されていて、明らかに何も変更されていないため、これは非常に混乱する可能性があります。
概要
は、ヘッダファイルに定義を置くことによって変数のためのスペースを割り当てることはありません。ヘッダーファイルには変数宣言のみを入れます。
私は同様の問題がありました。私の場合は、他の静的配列のサイズとして使用するために、配列の配列が必要でした。私は
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
どうすればよいですか?あなたが今までに持っているコードと、どのようなコンパイラエラーが出ているのでしょうか? –
そのようなものは '#define'できません。それについて考える。あなたがそれを使うたびに新しい配列を宣言します。もちろん、それは複数の再定義につながるでしょう。マクロは単なるテキスト置換です。テキストを自分で置き換え、意味があるかどうか確認してください。 –