2017-12-11 26 views
-5

gcc-89の最初のコード行で「読み込み時に開始文字が計算できません」というエラーが表示されます。 99年にそれは大丈夫だった。 以下の2行の違いは何ですか?文字列から文字配列を特殊な16進数値で初期化する方法

const unsigned char BYTES[] = {0x02, "FFFEU", 0x0C, "FFFFFFFF"}; 
const unsigned char BYTES[] = {0x02, 0x46, 0x46, 0x46, 0x45, 0x55, 0x0C, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46}; 

2行目は問題なく動作しますが、ASCIIテーブルのすべての文字を検索するには複雑すぎます。

+0

これらの初期化は、とにかく等価ではありません。 –

+0

'const unsigned char BYTES [] =" \ 002FFFEU \ 014FFFFFFFF ";'を使用してください。違いはなく、どちらも間違っています。 –

+1

具体的には、 '' FFFEU''は 'char'ではなく、' char'へのポインタです –

答えて

1

は一般的に言えば、一定の文字の配列を初期化する2つの方法がある:(1)初期化文字の初期化子リストここ

const char bytes1[] = { 'A', 65, 0x41, 0101, 0 }; // results in a zero terminated string "AAAA" 

値と、各値は異なるコード表現における単一文字の値であります。

(2)必要に応じて括弧で囲むことができ、文字列リテラル

const char bytes2[] = "AAAA"; 
const char bytes3[] = { "AAAA" }; 

で初期化するそれらの二つは、同じゼロで終わる文字列の両方の結果同等です。ただし、{ "AAAA" }の構文が有効であっても、コンマやその他の値を組み合わせても有効であるとは限りません。

質問には2番目のトピックがあります。文字シーケンス/文字列リテラル内の16進値。以上から分かるように、'A'

は、次のように( bytes1を覚えている)、これは見ることができる単一の文字値を利用し...アスキーの小数点 65として表現することができ、65は10進数、8進数、16進数、提示することができます。

文字列リテラルへの直接翻訳に問題があります
const char bytes7[] = { '\x41', 'A', '\101', 'A', 0 }; 

// The following is INVALID 
const char bytes8[] = "\x41A\101A"; 

文字列リテラルと同じように書くには、直接的には不可能である"\x41A"で、番目の理由e Aは、16進数の後に続く別の文字ではなく、16進シーケンスの一部と見なされます。結果の値は文字型の範囲外です。これは、文字列リテラルの連結によって解決することができます。"\x41" "A" - 間に空白以外の文字を入れずに、2つのリテラルだけが隣り合っています。

// The following is VALID 
const char bytes9[] = "\x41" "A\101A"; 

だから、同じ原理が、あなたの場合にも適用することができます:進シーケンスで

// VALID 
const unsigned char BYTES[] = { "\x02" "FFFEU\x0C" "FFFFFFFF" }; 

大手0が本当に必要と括弧もオプションである、上記の言ったようにではありません。

+0

ありがとうございましたこの1.私の問題を解決しました2.大きな説明でした – Stefatronik

0

ケース1:ここ

const unsigned char BYTES[] = {0x02, "FFFEU", 0x0C, "FFFFFFFF"}; 

バイトを使用すると、文字のないを保存することができ、すなわち、(int型が許可されている)が、あなたはstringsを保存することができますどのようにconst char arrayではありません(「FFFEU」<は - 二重引用符を参照してください)へこれは、それが0xFFFEUまたは'FFFEU'

const unsigned char BYTES[] = {0x02, 0xFFFEU, 0x0C, 0xFFFFFFFF}; 

が、Agなどの変更する必要がありますあなたはこのようなbig data(0xFFFEU)1 byte memoryに格納することはできません。コンパイラはerrorを与えないかもしれませんが、それ以外のバイトはoverwriteとなるので、期待通りの結果は得られません。

+0

私の目的は、 "FFFEU" - > 0x46、0x46、0x46、0x45、0x55のアスキーコードを文字列として保存することではありませんが(末尾に\ 0は必要ありません)、コマンド全体をテキストとして書くことはできません特殊文字0x02または0x0cのため – Stefatronik

関連する問題