2016-05-10 1 views
0

からCの16進数文字配列のサイズを見つける私はAT90マイクロコントローラで作業していますが、画面上に別のフォントを表示する作業をしています。私のフォント定義の一環として、私は16進数のchar配列を持っています。この質問の目的のために、私はchar配列を4文字しか表現しないようにしました。私はsizeof(font5x7)を実行する場合PROGMEM

const char font5x7[] PROGMEM = { 
    0x00, 0x00, 0x00, 0x00, 0x00, // SPACE 
    0x00, 0x00, 0x5F, 0x00, 0x00, // ! 
    0x00, 0x03, 0x00, 0x03, 0x00, // " 
    0x14, 0x3E, 0x14, 0x3E, 0x14 // # 
} 

は今、それは私が私の本当のfont5x7を実行したときしかし、20で正しい答えを与え、それが代わりに正しい数225475を返します。実際のものは次のとおりです。

const char font5x7[] PROGMEM = { 
    0x00, 0x00, 0x00, 0x00, 0x00, // SPACE 
    0x00, 0x00, 0x5F, 0x00, 0x00, // ! 
    0x00, 0x03, 0x00, 0x03, 0x00, // " 
    0x14, 0x3E, 0x14, 0x3E, 0x14, // # 
    0x24, 0x2A, 0x7F, 0x2A, 0x12, // $ 
    0x43, 0x33, 0x08, 0x66, 0x61, // % 
    0x36, 0x49, 0x55, 0x22, 0x50, // & 
    0x00, 0x05, 0x03, 0x00, 0x00, // ' 
    0x00, 0x1C, 0x22, 0x41, 0x00, // (
    0x00, 0x41, 0x22, 0x1C, 0x00, //) 
    0x14, 0x08, 0x3E, 0x08, 0x14, // * 
    0x08, 0x08, 0x3E, 0x08, 0x08, // + 
    0x00, 0x50, 0x30, 0x00, 0x00, // , 
    0x08, 0x08, 0x08, 0x08, 0x08, // - 
    0x00, 0x60, 0x60, 0x00, 0x00, // . 
    0x20, 0x10, 0x08, 0x04, 0x02, ///
    0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 
    0x00, 0x04, 0x02, 0x7F, 0x00, // 1 
    0x42, 0x61, 0x51, 0x49, 0x46, // 2 
    0x22, 0x41, 0x49, 0x49, 0x36, // 3 
    0x18, 0x14, 0x12, 0x7F, 0x10, // 4 
    0x27, 0x45, 0x45, 0x45, 0x39, // 5 
    0x3E, 0x49, 0x49, 0x49, 0x32, // 6 
    0x01, 0x01, 0x71, 0x09, 0x07, // 7 
    0x36, 0x49, 0x49, 0x49, 0x36, // 8 
    0x26, 0x49, 0x49, 0x49, 0x3E, // 9 
    0x00, 0x36, 0x36, 0x00, 0x00, // : 
    0x00, 0x56, 0x36, 0x00, 0x00, // ; 
    0x08, 0x14, 0x22, 0x41, 0x00, // < 
    0x14, 0x14, 0x14, 0x14, 0x14, // = 
    0x00, 0x41, 0x22, 0x14, 0x08, // > 
    0x02, 0x01, 0x51, 0x09, 0x06, // ? 
    0x3E, 0x41, 0x59, 0x55, 0x5E, // @ 
    0x7E, 0x09, 0x09, 0x09, 0x7E, // A 
    0x7F, 0x49, 0x49, 0x49, 0x36, // B 
    0x3E, 0x41, 0x41, 0x41, 0x22, // C 
    0x7F, 0x41, 0x41, 0x41, 0x3E, // D 
    0x7F, 0x49, 0x49, 0x49, 0x41, // E 
    0x7F, 0x09, 0x09, 0x09, 0x01, // F 
    0x3E, 0x41, 0x41, 0x49, 0x3A, // G 
    0x7F, 0x08, 0x08, 0x08, 0x7F, // H 
    0x00, 0x41, 0x7F, 0x41, 0x00, // I 
    0x30, 0x40, 0x40, 0x40, 0x3F, // J 
    0x7F, 0x08, 0x14, 0x22, 0x41, // K 
    0x7F, 0x40, 0x40, 0x40, 0x40, // L 
    0x7F, 0x02, 0x0C, 0x02, 0x7F, // M 
    0x7F, 0x02, 0x04, 0x08, 0x7F, // N 
    0x3E, 0x41, 0x41, 0x41, 0x3E, // O 
    0x7F, 0x09, 0x09, 0x09, 0x06, // P 
    0x1E, 0x21, 0x21, 0x21, 0x5E, // Q 
    0x7F, 0x09, 0x09, 0x09, 0x76, // R 
    0x26, 0x49, 0x49, 0x49, 0x32, // S 
    0x01, 0x01, 0x7F, 0x01, 0x01, // T 
    0x3F, 0x40, 0x40, 0x40, 0x3F, // U 
    0x1F, 0x20, 0x40, 0x20, 0x1F, // V 
    0x7F, 0x20, 0x10, 0x20, 0x7F, // W 
    0x41, 0x22, 0x1C, 0x22, 0x41, // X 
    0x07, 0x08, 0x70, 0x08, 0x07, // Y 
    0x61, 0x51, 0x49, 0x45, 0x43, // Z 
    0x00, 0x7F, 0x41, 0x00, 0x00, // [ 
    0x02, 0x04, 0x08, 0x10, 0x20, // slash 
    0x00, 0x00, 0x41, 0x7F, 0x00, // ] 
    0x04, 0x02, 0x01, 0x02, 0x04, //^
    0x40, 0x40, 0x40, 0x40, 0x40, // _ 
    0x00, 0x01, 0x02, 0x04, 0x00, // ` 
    0x20, 0x54, 0x54, 0x54, 0x78, // a 
    0x7F, 0x44, 0x44, 0x44, 0x38, // b 
    0x38, 0x44, 0x44, 0x44, 0x44, // c 
    0x38, 0x44, 0x44, 0x44, 0x7F, // d 
    0x38, 0x54, 0x54, 0x54, 0x18, // e 
    0x04, 0x04, 0x7E, 0x05, 0x05, // f 
    0x08, 0x54, 0x54, 0x54, 0x3C, // g 
    0x7F, 0x08, 0x04, 0x04, 0x78, // h 
    0x00, 0x44, 0x7D, 0x40, 0x00, // i 
    0x20, 0x40, 0x44, 0x3D, 0x00, // j 
    0x7F, 0x10, 0x28, 0x44, 0x00, // k 
    0x00, 0x41, 0x7F, 0x40, 0x00, // l 
    0x7C, 0x04, 0x78, 0x04, 0x78, // m 
    0x7C, 0x08, 0x04, 0x04, 0x78, // n 
    0x38, 0x44, 0x44, 0x44, 0x38, // o 
    0x7C, 0x14, 0x14, 0x14, 0x08, // p 
    0x08, 0x14, 0x14, 0x14, 0x7C, // q 
    0x00, 0x7C, 0x08, 0x04, 0x04, // r 
    0x48, 0x54, 0x54, 0x54, 0x20, // s 
    0x04, 0x04, 0x3F, 0x44, 0x44, // t 
    0x3C, 0x40, 0x40, 0x20, 0x7C, // u 
    0x1C, 0x20, 0x40, 0x20, 0x1C, // v 
    0x3C, 0x40, 0x30, 0x40, 0x3C, // w 
    0x44, 0x28, 0x10, 0x28, 0x44, // x 
    0x0C, 0x50, 0x50, 0x50, 0x3C, // y 
    0x44, 0x64, 0x54, 0x4C, 0x44, // z 
    0x00, 0x08, 0x36, 0x41, 0x41, // { 
    0x00, 0x00, 0x7F, 0x00, 0x00, // | 
    0x41, 0x41, 0x36, 0x08, 0x00, // } 
    0x02, 0x01, 0x02, 0x04, 0x02};// ~ 
+1

'sizeof(font5x7)'が動作するはずです。 –

+2

'sizeof(font5x7)'によって返されるものは? –

+2

「PROGMEN」とは何ですか? Suspectは 'sizeof()'を台無しにしているコンパイラ固有のキーワードです。あなたがそれを落とすなら、あなたは20を得ますか? – chux

答えて

1

このコードは、私のシステムに "Array len:20"という文字列を表示します。

#include <stdio.h> 

#define PROGMEM 

const char font5x7[] PROGMEM = { 
    0x00, 0x00, 0x00, 0x00, 0x00, // SPACE 
    0x00, 0x00, 0x5F, 0x00, 0x00, // ! 
    0x00, 0x03, 0x00, 0x03, 0x00, // " 
    0x14, 0x3E, 0x14, 0x3E, 0x14 // # 
}; 

#define ARRAY_LEN(a) (sizeof(a)/sizeof((a)[0])) 

const font5x7_len = ARRAY_LEN(font5x7); 
int main(void) { 
    printf("Array len: %d\n", font5x7_len); 
} 
+0

これはコメントです(詳しくは述べていますが)。その質問に答えることは役に立ちません。 –

+0

質問は* "どのようにしてこのアレイに表現された16進数を数えて20に等しいかを数えることができますか?"これはその質問に対するかなり良い答えのようです。 –

+0

@AustinHastingsあなたは絶対に正しいと思っていました。自分のAVRで自分のプリント機能を実装することができましたが、出力20を確認できます。実際のファイルで作業しているとき、私は上に私の質問を更新しました – Ivan

-1

プログラミングでは、配列はポインターにすぎません。配列を宣言したスコープ内にいる間は、sizeof(font5x7)/ sizeof(char)を使用して配列の長さを判断できます。

しかし、配列が関数に渡されると、それはポインタに崩壊します。ポインタには関連する長さがないので、配列の長さを表す別の変数を保持する必要があります。

つまり、何らかのセンチネル値がなければ、望む機能は不可能です。たとえば、フォント配列に0xffが含まれないことが保証できる場合は、すべての配列を0xffで終了できます。関数はその値を見つけて長さを返すまで配列を検索します。

関連する問題