VIDTAKER.COM

Q&A

ポインタC言語でのPascalコンパイラを構築すると問題


次のポインタをハロー宣言私がいたに面したいくつかの問題だみんな私がコンパイラ私字句解析の

char *words[29]={
     "program",
     "label",
     "integer",
     "word",
     "char",
     "byte",
     "shortint",
     "logint",
     "real",
     "single",
     "double",
     "string",
     "boolean",
     "var",
     "procedure",
     "function",
     "begin",
     "end",
     "if",
     "then",
     "else",
     "or",
     "and",
     "div",
     "not",
     "do",
     "while",
     "mod"
};
char message[30];

そして私は関数で、それを使用しようとした

   for(handle=0;(&words[handle] != NULL);handle++)
   {
    message = &words[handle];
    if(!strcmp(token,message))
     message='words';
   }

しかし、私は次のエラーを実行しようとして受け取っている:

メッセージについて(ライン=&言葉は[';):警告C4047:'=':'char型[30]'は異なりから間接のレベル]でハンドルはchar **'

メッセージについて(ライン=&言葉は[処理];):エラーC2106:'が=':左のオペランドが価値である必要がありますリットル

C2015について:エラー(行のメッセージを='単語';):文字の定数の多くも

値に関するリットル(行のメッセージを='単語';):エラーC2106:'='左:オペランドは必要が

方法が可能なポインタでは私は動作しますか?提案を行います任意の場合はありますか?



3 Replies

1)

3つ:

  1. アンパサンド( & )は、余分なています。型のwords[handle]char * 、その右がある場合は何が必要がある文字列を、すなわち。あなたは、のアドレスを取得する必要はありませんmessage

  2. あなたに直接割り当てることはできません=char *messageそれが配列として。 Cは非常に高級言語ではありません。のいずれかを変更することができますstrcpy(dst, src)strcpy(message, "words") 、それは配列ではなくポインタですので、またはを使用することができますfor関数はするので、のようにコピーするには: NULL

  3. あなたのwordsループが探しますのポインタ配列は、停止を知っているので、 - しかし、あなたが持っていない配列内の!を追加する必要があります最後に。しかない通常の文字列は、ループが探しているNULLポインタを見つけることのでであり、書面としてメモリの未知のゾーンにオフ充電行きます。

ホープことができます!


2)

あなたはそこでエラーの数を持って:

  • の代わりに&言葉[]を処理し、言葉を使うの[が]ハンドル
  • あなたのメッセージで行うとしている='単語'?少なくとも3エラーが現在のページ:文字列が二重引用符ではなく、単一引用符を使用、メッセージが一定である、あなたはそれを変更することはできません。文字列をコピーするには、strcpy()をだけでなく、=演算子を使用する必要があります
  • strcmp()を0を返し、文字列が等しい場合はtrue。あなたのロジックを逆にする必要があります
  • あなたは配列の末尾にNULLを含めるのを忘れて

3)

あなたのコードで数多くの問題がある。まず第一に、あなたは、キーワードの配列を宣言する必要がありますconst char *words[] 。それは悪い習慣の文字列定数を宣言することはとchar *なしconst 、それだけように許可されている既存のコードはまだコンパイルされます。

それが壊れているので、あなたは宣言の中で、29の配列のサイズを指定しないでください。あなただけの空の括弧を使用し、配列のサイズをコンパイラ図を聞かせて。あなたがすることによって配列のサイズを得ることができるsizeof(words)/sizeof(words[0]) 、これは正しい場合でも、または要素を削除から追加されるwords

次に、あなたのforいくつかの時点でが、それはなるほぼ確実にセグメンテーションフォルトループが終了する()行くことはありません。 NULLポインタをもたらすことはありませんので、値のアドレスの取得&words[handle] != NULL常にtrueになります。適切な方法は、ループを反復処理するだけのエントリの数をカウントすることです:

for(handle = 0; handle < sizeof(words)/sizeof(words[0]); handle++)

message文字の配列として宣言されます。配列は代入ではなく、彼らが左辺値されていませんつまり、。あなたは配列に代入する場合は、明示的にそれに何かのようなデータをコピーする必要がstrcpy() (選択の場合を除き、潜在的なバッファオーバーフローのために)、お勧めしませんstrncpy()memcpy() 、またはstrncpy_s() (Windowsのみで利用可能)。

この例では、しかし、あなたはすべての配列をしたくない - あなただけのポインタを割り当てる。宣言const char *としてconst char *message; ... message = words[handle]; if(!strcmp(token, message)) message = "words"; 代わりに。と'A'適切に宣言された、あなたはどうする:

message = "words";

最後の文があり、あなたの周りの二重引用符を使用してくださいそれは文字列定数がする。単一引用符は、単一の文字定数(例えばです )。彼らは技術的に1つ以上の文字を、結果の整数定数のエンディアン含めることができますが、実装で定義され、彼らはあなたがこの例では必要ではない。

私もかなり何あなたがやろうとしていることを確認ではない行。あなたはいくつかの巧妙なトリックを行うとしている場合変数は、今、それが仕事に行くではない停止します。 Cは反射の任意の並べ替えを持っていません。