新・明解c言語の演習問題での疑問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SZK

新・明解c言語の演習問題での疑問です

#1

投稿記事 by SZK » 6年前

新・明解c言語演習11-6
「文字列sの中に、文字cが含まれていれば、その文字へのポインタを返し、含まれていなければ空ポインタを返す関数を作成せよ。添字演算子を用いずに実現すること」
 char *str_chr(const char *s, int c) { /* ... */ }

この課題を解いている最中です。課題の答えも知りたいのですが、それ以前に納得できないエラーが出たので質問します。プログラムとエラーは以下の通りです。

書いた関数
char *str_chr(const char *s, int c)
{
int *t = s;
return t;
}

エラー
warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
   char *t = s ;
       ^

どうもconstの影響で関数内のポインタに値を代入できないようなのですがポインタの内部をいじっているわけでは無く、なぜエラーとなるのか理解できません。
また、課題にはconstを用いることが指定されているので、このエラーが出る限り、この課題の答えも分かりません。
分かる方、お返事待っております。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 新・明解c言語の演習問題での疑問です

#2

投稿記事 by みけCAT » 6年前

SZK さんが書きました:それ以前に納得できないエラーが出たので質問します。
warningと書いてありますが、本当にエラーが出たのですか?
SZK さんが書きました: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
   char *t = s ;
       ^
メッセージの通り、constがついているポインタをconstがついていないポインタに代入しているので、
(constがついていないポインタを経由してconstがついているポインタが指している値を書き換えられてしまうかもしれないので)よくないと言っています。
tの型はconstがついていないだけでなく、(const )char型へのポインタを代入するのにint型へのポインタであるのもよくないですね。

…待てよ、コードはint *t = s;なのに、メッセージはchar *t = s ;なのはおかしいですね。
あなたが見ているコードとコンパイラが見ているコードが同じになるように注意してください。
・エディタでソースコードを保存した後にコンパイルしてください。
・ソースコードは正しい位置に保存してください。 (別のディレクトリの同名ファイルをコンパイルしていませんか?)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

SZK

Re: 新・明解c言語の演習問題での疑問です

#3

投稿記事 by SZK » 6年前

申し訳ありません。tはintではなくcharで定義しました。質問する際に打ち間違えたようです。
エラーではなく注意文ですね。無理やり実行することもできるのですが、何が問題なのか知りたくて質問したしました。
回答ありがとうございます。ポインタを経由して書き換えられることがある、という点は知りませんでしたし、考え付きませんでした。

box
記事: 2002
登録日時: 13年前

Re: 新・明解c言語の演習問題での疑問です

#4

投稿記事 by box » 6年前

SZK さんが書きました:質問する際に打ち間違えたようです。
わざわざ手打ちするよりもコピペする方が正確で楽だと思いませんか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る