質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

811閲覧

C言語でエラーの意味が分かりません。

Akira_0809

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2022/09/19 02:39

編集2022/09/19 02:42

前提

C言語で寿司打を作っています。
エラーの意味がよくわかりません。
お願いします。

実現したいこと

エラーの解消

発生している問題・エラーメッセージ

natu_g21288.c:350:17: warning: passing argument 1 of ‘word’ from incompatible pointer type [-Wincompatible-pointer-types] 350 | word(word_kanji[100], word_romaji[100]); | ~~~~~~~~~~^~~~~ | | | char * natu_g21288.c:140:18: note: expected ‘char **’ but argument is of type ‘char *’ 140 | char *word(char *word_kanji[100], char *word_romaji[100]) | ~~~~~~^~~~~~~~~~~~~~~ natu_g21288.c:350:35: warning: passing argument 2 of ‘word’ from incompatible pointer type [-Wincompatible-pointer-types] 350 | word(word_kanji[100], word_romaji[100]); | ~~~~~~~~~~~^~~~~ | | | char * natu_g21288.c:140:41: note: expected ‘char **’ but argument is of type ‘char *’ 140 | char *word(char *word_kanji[100], char *word_romaji[100]) | ~~~~~~^~~~~~~~~~~~~~~~ akira0809@ubuntu:~/js1$

該当のソースコード

C

1int sushida() 2{ 3 int enter, index; 4 char *word_kanji[100], *word_romaji[100], *word_play[100]; 5 word(word_kanji[100], word_romaji[100]); 6 printf("問題数を選択してください\n"); 7 printf("10 20 30 40 50\n"); 8 scanf("%d", &enter); 9 printf("Enterを押すと始まります\n"); 10 getchar(); 11 getchar(); 12 for(int i = 3; i > 0 ; i--) 13 { 14 printf("%d\n", i); //カウント 15 sleep(1); 16 } 17 printf("START\n"); 18 printf("\n"); 19 for(int i = 0; i < enter; i++) 20 { 21 srand((unsigned int)time(NULL)); 22 index = rand() % 99 + 0; 23 printf("%s\n", word_kanji[0]); 24 printf("%s\n", word_romaji[0]); 25 //printf("%s\n", word_kanji[index]); 26 //printf("%s\n", word_romaji[index]); 27 //scanf("%s", &word_play[i]); 28 } 29 return 0; 30} 31 32char *word(char *word_kanji[100], char *word_romaji[100]) 33{ 34 word_kanji[0] = "漢字"; 35 word_romaji[0] = "kannzi"; 36 : 37 : 38 word_kanji[99] = "こんにちは"; 39 word_romaji[99] = "konnnitiha"; 40}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まず、「エラー/error」と「警告/warning」の違いはしっかり認識してください。
コンパイル時のエラーは、文法的に誤りで、それ以上プログラムの動作が不可能になるものです。
一方、警告は、Cの文法上間違いではないのでコンパイルをすることができるものです。ただし、意味上間違いである可能性が高いのでそれを知らせてくれたものです。
エラーのときはプログラムを実行することはできませんが、警告の場合はとりあえず実行することができます。但し、少なくない場合で警告は実際には(意味の上で)間違いで、プログラムは期待した動作をしないことになります。原則として、警告は出ないようにしなければいけません。何故その警告が出るのか、実際にどういう動作をするのかを完全に理解して、それこそが意図したプログラムの解である、ということを言い切れる場合以外は警告が出ないように(意味上の誤りを)修正する必要があります(決して、理解していないキャストで警告をとにかく消すような対応はしてはいけません)。

で、質問の警告の言葉の意味がわからないということはないかと思いますが、何故警告になるのかわからないというなら、C言語での配列についての理解が足りないということになるかと思います。
Cでは、宣言のときにこそ要素数を用いて
T array[N];
というように記述しますが、多くのシーンで要素数の情報は欠落します。そして、配列名arrayを単独で記述したときは配列全体ではなく、配列の先頭要素へのポインタを表し、[ ]で囲んだ添字を付けた場合は添字番目の要素一つを変数と表すことになります。
その知識をもってすれば、
word(word_kanji[100], word_romaji[100]);
は、
「word関数を、引数としてword_kanjiの101番目の要素とword_romajiの101番目の要素の値をもって呼び出す」
という意味になっていることがわかります。これは、多分やりたいことに合致していないと思います。

さらに言えば、関数の引数において配列形式が記述された場合、要素数は無視され(そもそも要素数が記述されなくても文法エラーではない)、配列の要素の型へのポインタとして解釈されることになっています。
つまり、word関数のシグニチャ
char *word(char *word_kanji[100], char *word_romaji[100])
を読み解くと、charの値を返す関数wordは、charへのポインタ型(つまりchar* *型)の仮引き数word_kanjiとword_romajiを持つ、ということを宣言していることがわかります。100という数字無視され、今回は使用していませんが、sizeof(word_kanji)の値を使ってなにかしようとしたりすると意図しない結果になってしまうかも知れません。

ついでに余計なことを言えば、srand関数の使い方は間違っているだろう(警告にもならないだろうけど、きっと期待した動作ではない)とか、word関数は返り値を持たないとこれはエラーになるんじゃないかとか。


さて。私が自分で書くなら、多分wordのような関数は設定しないかなぁ...(関数が間違いということではないけれど)

C

1struct Word{ 2 const char* kanji; 3 const char* romaji; 4}words[]={ 5 {"漢字", "kannzi"}, 6 // : 7 {"こんにちは", "konnnitiha"} 8}; 9const size_t size=sizeof(words)/sizeof(struct Word);

と初期化で書いてしまえば、変換テーブルの数の管理も兼ねられて追加/削除も容易になったりしそうで。
(もしかして構造体を知らなかったりするかな?)

投稿2022/09/19 05:14

thkana

総合スコア7667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akira_0809

2022/09/19 10:53

ありがとうございました。 構造体を知らなかったので勉強になりました。エラーとワーニングの違いや配列についての説明が分かりやすかったです。
guest

0

それらはエラーではなくワーニングです
ポインタの型が違う、とぼやいてらっしゃいます

投稿2022/09/19 02:48

y_waiwai

総合スコア87840

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akira_0809

2022/09/19 03:05

解消する必要はありますか。 また、実行するとSegmentation fault (コアダンプ)が発生します。
dodox86

2022/09/19 03:52

@質問者さん 適切なコードを書けば警告は自然と消えます。ポインターとポインター配列をちゃんと区別しましょう。
y_waiwai

2022/09/19 04:07

> word(word_kanji[100], word_romaji[100]); word_kanji、word_romajiの配列の100番目の要素を与えて呼び出してますが、これはあなたの意図しているコードなんでしょうか。 これはそもそもアクセス違反となります コアダンプするってのは当たり前の話です 小手先の修正でそのワーニングを出ないようにするのは簡単ですが、そもそものコードが間違っていますよ
Akira_0809

2022/09/19 10:54

ありがとうございました。 問題が無事解決しました。
guest

0

とりあえず

C

1char *word(char *word_kanji, char *word_romaji) 2{ 3 strcpy(word_kanji, "漢字"); 4

投稿2022/09/19 02:47

jmdajmw

総合スコア302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問