Top > 疑問・質問 > 「移植性のないポインタ変換エラー」どうすればいいですか?

「移植性のないポインタ変換エラー」どうすればいいですか?


 

Aさんへ

開発ツールによりエラー表現は異なります。ちなみに、Visual Studioでは
「戻り値の型が関数型と一致していません」となります。

つまり、return(line);のlineは、charではありません。という事です。lineは、cher[](char *と等価)です。関数型(戻り値)は char ですが、return で cherのポインタを返そうとしてエラーになっています。

同様に、line2 = change(line);は、配列の line2 に char値の代入でエラーになっています。

それから、change関数の変換を行った後、何もしていません。

c = '_'; となっていますが、文字列に対しては何も変更していないため、文字列に対する変換処理は存在しないことになります。

関数にする前に

  1. まず、文字列変換が正しく行うコードを書く
  2. それから、関数化を考える。その際、受け渡しの型に注意する

これを意識して、もう一度考えてみて下さい。 


上の内容をメールしつつ、コードを考えてみました。以下、その結果です。

まず、複雑化した問題を整理するため、処理をmain関数内で行い確実に変換できていることを検証します。

問題なく変換ができることが確認できました。

次に、変換処理を関数化する場合を考えます。

変換処理のループを for文から while文に変えてみましたが、どちらでも結果は同じです。for文の方がスッキリしていますね。

C言語の場合、配列もポインタだと納得できるまでが大変かもしれません。

line2 = change(line); はline配列を渡しているのですが、&line[0]と等価です。

char *change(char line[])のchar line[]は、char *lineと等価です。そして、
関数内で記述する場合 *(line+1) と line[1]も等価です。配列の受け渡しはポインタで行っていることを忘れないようにしましょう。

どんな言語であっても、文字列は必須です。C言語の場合、文字列という型が存在せず、その代用として「文字の配列:終端がNULL(\0)」を「文字列」として扱うルールが定着しました(標準関数の文字列系がそうなっていたからですが)。

C言語の文字列は「文字の配列」

好き嫌いにかかわらず、ポインタ、配列、受け渡しの方法をしっかりと学習して、使いこなせるようにしましょう。このあたりは、補助教材のデバッガ編で実習すればより具体的に理解することができます。

IT@NET塾
丸山

▲ページトップに戻る