0

C の組み込みシステム用のコンパクトなデータ構造が必要です。ASCII コードを表すバイトを指定すると、関数はそのフォントの文字の 6 バイトのビットマップを返します。ROM にあるのは、0 ~ 9、'.'、':' などの一部の文字のビットマップのみです。

非効率的な解決策の 1 つは、文字ビットマップを格納する 2 番目の配列内のインデックスを指す最大の Ascii 値に等しい長さの配列を持つことです。たとえば、最初の配列には 1 バイトの要素が 128 あり、20 文字のビットマップが定義されている場合、2 番目の配列には 6 バイトの要素が 20 あります。最初の配列の要素値は 2 番目の配列のインデックスにマップされるため、ASCII 値が最初の配列の要素を選択し、その要素の値が 2 番目の配列のインデックス値として使用され、6 バイトのビットマップが取得されます。しかし、これは (最初の配列で) 約 100 バイトを無駄にします。

より良い方法はありますか?ありがとう

編集: @Brandon Yates の提案のように、switch ステートメントまたは同様のものを使用する必要があると考えています。

4

3 に答える 3

1

12 バイトの場合、文字(32 <= n < 128)nのグラフィカル ビットマップがある場合、ビットが 1 のビットマスクを格納できます。nビットマップをバイト配列にパックして保存します (要素間のパディングについて心配する必要がある場合があるため、構造体の使用には注意してください)。

コードは次のようになります。get_bitmapコードは素朴で遅いですが、コンパイルすると小さなものになります。

const unsigned char bitmap_available[12] = {0x1, 0x23, ...};
const unsigned char bitmaps[] = {
    0x0, 0xff, 0x0, 0xff, 0x0, 0xff,  // first character
    0x1, 0x1, 0x1, 0x1, 0x1, 0x1, // second character
    ...
};

/* Do we have bitmap data available for character c? */
int char_available(char c) {
    if (c < 32 || c > 127) return 0;
    c -= 32;
    return (bitmap_available[c >> 3] >> (c & 7)) & 1;
}

/* Returns pointer to bitmap for character c, or NULL if it's not present. */
const unsigned char *get_bitmap(char c) {
    int i, n = 0;
    if (!char_available(c)) return 0;
    for (i = 32; i < c; i++) {
        n += char_available(i);
    }
    return bitmaps + n * 6;
}

明らかに、どの文字が必要かはわかりませんし、ビットマップもありません。そのため、例として 2 つのデータ配列にランダム データを入れます。

于 2013-05-12T15:56:05.770 に答える
1

したがって、次のようなものは十分に効率的ではありません。

struct bitmap {
    char byte[6];
};

char charset[] = "0123456789+-*/;.";

/* initialize the glyphs in the same order as charset, use glyph[0] for unknown ascii */
const struct bitmap map[sizeof(charset)+1] = { 
    { }, /* unknown glyph */
    { }, /* glyph for 0 */
    { }, /* glyph for 1 */
    ...
    { }, /* glyph for + */
    { }, /* glyph for - */
    ...
    { }, /* glyph for . */
};

/* return the appropriate map */
static inline const struct bitmap const * get_bitmap(char ascii) {
      char *p = strchr(charset, ascii);
      if ( p ) {  return &map[(p - charset) + 1]; }
      return &map[0];
}
于 2013-05-12T15:25:12.113 に答える