5

これはVisualStudio2010では機能しません、次のエラーが発生します

void main (void)
{
     unsigned char* test = "ATGST"; 

}

編集1:私の質問は、これが組み込みシステムでは機能するのに、PCでは機能しない理由です。

ここに画像の説明を入力してください

しかし、私がそれをに変更すると:

 char* test = "ATGST";  

できます。

私がCを使用して組み込みシステムのコードを作成する主なことは、Visual Studioを使用していくつかの機能をテストするため、マイクロコントローラーでリアルタイムにテストする必要がないことです。

マイクロコントローラーは最初のコードを受け入れるので、説明が必要です。

4

5 に答える 5

12

C ++タグの削除に準拠し、埋め込まれたタグを緩和するように編集されました。

char[]まず、目前の問題は、リテラルをに渡そうとしていることunsigned char*です。unsignedcharをまたはのいずれかと実際に同一視することはできませんsigned。その点で少し特別です。また、文字列リテラルには一意のストレージが与えられているため、変更しないでください。キャラクターを扱っている場合は、崩壊する可能性のある標準 char*を使用する必要があります。char[]力強くキャストすることもできますが、そんなことはお勧めしません。コメントの1つが指摘したように、安全に行うことができます。実際、それは実際には非常に簡単なことの1つです。

しかし、reinterpret_castingで十分な資格を提供するには、厳密な答えを出すにはスペースが少なすぎます。これは、基本的に、コンパイラーに、自分が何をしているのかを知っていると言っていることです。これは潜在的に非常に危険であり、目前の問題について確信がある場合にのみ実行する必要があります。charは通常、単なる一般的なものであり、符号付きまたは符号なしでさえありません。unsigned charはcharよりも範囲が広く、通常、charはsigned charの正のサブセットを使用して文字(または収まる他の種類のデータ)を記述します。データが拡張された正の範囲にない場合は、次のようになります。行ってよかった。ただし、環境に準拠し、安全にコーディングしてください。

エントリポイント関数について-適合編集

組み込みシステムで作業することが確立されているため、これは、プログラムが何も返す必要がない可能性が非常に高いことを意味し、そのままにしておくことができますvoid main()(特定の組み込みシステムで指定された非常に異なる戻り値が必要な場合もあります)。 、OPは、彼のシステムが課す要件について最もよく知っています)。多くの場合、あなたが空虚なままでいることができる理由は、なだめるための環境/ OSがなく、誰ともコミュニケーションをとることができないからです。しかし、組み込みシステムも非常に特殊化することができ、課せられた要件(ある場合)を満たすために、特定のプラットフォームを詳細に調査することによってアプローチするのが最善です。

于 2012-06-29T23:05:30.920 に答える
5

一つには、そこにが必要ですconst。そして第二に、char!= unsigned char、そしてまた(ユニークに)!= signed char

文字列リテラルはconst char[N]、適切なサイズの-型であるためN、にのみ変換できますconst char*。この言語には、暗黙的に削除できる特別なルールがありますがconst 、文字列リテラルを変更するのはUBであるため、これを行うのは非常に悪い考えです。

マイクロコントローラーのC実装は、この点で不適合です。const char*VSをハッキングして誤ったコードを受け入れようとするよりも、正しいように単純に使用する方がよいでしょう。

于 2012-06-29T23:00:30.670 に答える
3

これは、unsignedchar*に文字列を割り当てる場合だと思います。

文字列値を割り当てると、文字に関連付けられたASCII値が割り当てられるため、unsignedchar*の代わりにchar*を使用する必要があります。

文字列や文字以外の値を割り当てたい場合は、実装は正しいです。

それが役に立てば幸い。

于 2012-07-04T05:29:00.633 に答える
0

テキストに文字タイプを使用している場合は、修飾されていない文字を使用してください。

文字タイプを数字として使用している場合は、unsignedcharを使用してください。unsigned charは、少なくとも0から255の範囲を提供します。

詳細情報:unsigned charとは何ですか?

于 2012-06-29T22:55:12.143 に答える
0

私の質問は、これが組み込みシステムでは機能するのに、PCでは機能しない理由です。

おそらく、Cよりも厳密な型チェックを行うC ++でPCコードを誤ってコンパイルしているためです。Cでは、unsignedcharとplaincharのどちらを使用しても、コードは問題なくコンパイルされます。

ただし、他の回答で示唆されているように、修正する必要のあるコードの問題がいくつかあります。コードを組み込みとWindowsの両方で実行する必要がある場合は、次のように書き直す必要があります。

#ifdef _WIN32
int main (void)
#else
void main (void)
#endif
{
  const unsigned char* test = "ATGST"; 

}
于 2012-07-02T06:25:41.983 に答える