4

私はそのような文字列の配列を持っています

char *T[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};

ただし、このようにすると、各文字列はunsignedcharの配列になります。

unsigned char *T[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};

「'char[5]'型の式で'unsignedchar *'を初期化すると、ポインタ間で符号の異なる整数型に変換されます。」というエラーが発生します。使われている「0」と「1」の表現のいくつかが署名されていることを意味していると思いますが、なぜ/どのように対処するのかわかりません。文字列の配列が欲しいのですが、各文字列は符号付き文字ではなく符号なし文字の配列です。誰かがそれを手伝ってくれる?

注:これはHWの問題に対するものですが、実際の問題ではなく、考えられる多くの解決策の1つにおける小さなステップにすぎません。しかし、明確な答えを出さずに理解していただければ幸いです。ありがとう。

4

1 に答える 1

4

文字列を表すことができる多くの方法の1つであるC文字列は、値を持つchar末尾で終了する配列で構成されます。これは、コードに「0000」が含まれている場合にタイプごとに取得されるものです。charnull

必要なのは、「0000」を、ヌル値を持つunsigned char末尾で終了する配列に割り当てることです。unsigned char何から始めているかを考えると、キャストする必要があります。または、キャストを必要としない方法で初期データを表す必要があります。

unsigned char T[][] = { { 0x30, 0x30, 0x30, 0x30, 0x00 }, 
               { 0x30, 0x30, 0x30, 0x31, 0x00 }, 
               { 0x30, 0x30, 0x31, 0x30, 0x00 }, 
               { 0x30, 0x30, 0x31, 0x31, 0x00 }, 
               { 0x30, 0x31, 0x30, 0x30, 0x00 }, 
               { 0x30, 0x31, 0x30, 0x31, 0x00 }, 
               { 0x30, 0x31, 0x31, 0x30, 0x00 }, 
               { 0x30, 0x31, 0x31, 0x31, 0x00 }, 
               { 0x31, 0x30, 0x30, 0x30, 0x00 }, 
               { 0x31, 0x30, 0x30, 0x31, 0x00 }, 
               { 0x31, 0x30, 0x31, 0x30, 0x00 }, 
               { 0x31, 0x30, 0x31, 0x31, 0x00 }, 
               { 0x31, 0x31, 0x30, 0x30, 0x00 }, 
               { 0x31, 0x31, 0x30, 0x31, 0x00 }, 
               { 0x31, 0x31, 0x31, 0x30, 0x00 }, 
               { 0x31, 0x31, 0x31, 0x31, 0x00 }
              };

このアプローチで私が目にする主な問題は、そもそもCスタイルの文字列を持つことの利点のほとんどが失われることです。printfunsigned char "string"を使用すると、使用できる標準の文字列ライブラリがないため、、またはその他の文字列指向の関数を使用する場合は、signedchar文字列タイプにキャストバックする必要があります。

実際には、可能な文字位置「0」と「1」ごとに2つの値のみを使用しています。文字列でそれを行うやむを得ない理由がない限り、ブール値の配列を検討して、「0hello」のような文字列がコードに組み込まれる可能性を減らします。ビットフィールドを紹介されいる場合は、次を使用します。 unsigned char内のビットをビットフィールドとして(文字列を扱っている概念を破棄します)。

最後の手法の利点には、使用するメモリが少なく、値を0または1以外にすることができないことが含まれます。ただし、パックされたビットを人間が読める形式に変換するには、ルーチンの小さなコレクションを作成する必要があります。

unsigned char[] = { 0x00, 0x01, 0x02, 0x03, 0x04,
                    0x05, 0x06, 0x07, 0x08, 0x09,
                    0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
                    0x0F };

void displayChar(unsigned char value) {
  switch (value) {
    case 0x00: printf("0000"); break;
    case 0x01: printf("0001"); break;
    case 0x02: printf("0010"); break;
    case 0x03: printf("0011"); break;
... and so on ...
于 2012-09-15T12:33:48.710 に答える