元のタイトルで説明したエラー メッセージは、実際のエラー メッセージと完全に同じではないことに注意してください。(私はこれを自由に変更しました。) 最後の "[21]" は非常に重要です。特に、「[]」記号は配列を表します。したがって、コンパイラは、文字の配列から単一の文字に変換しようとしていることを伝えています。配列は複数の文字を保持できるため、コンパイラがこれを行うことができないと不平を言う理由は明らかです。
その説明が邪魔にならないので、コードを修正する方法を見てみましょう。コードで問題を引き起こしている 3 つの行があります。
関数宣言:
void printText(char, char, int);
関数呼び出し:
printText("I hear and I forget.", "*", 15);
関数定義:
void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){
//...
}
これらは、独自の関数を作成するための 3 つの要素であり、すべて一致する必要があります。そうでない場合、コンパイラは文句を言います。それでは、これらの各部分を分析してみましょう。最初の宣言:
void printText(char, char, int);
ここでは、3 つの入力 (2 つの文字と 1 つの整数) を想定し、出力 ("void") を持たない "printText" という名前の関数を宣言します。
次に、関数定義を見てください。
void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){
//...
}
これは、3 つの入力と出力のない "printText" という名前の関数を定義します。ただし、よく見てください。この「printText」関数は、入力として文字配列、文字、および整数を必要とします。この入力のリストは宣言のリストとは異なるため、実際には宣言されたものとは完全に異なる関数です。
ここで、関数定義は関数が実際に何をするかを定義することにも言及したいと思います。これは「{」と「}」の間のコードです。一方、関数宣言は単に関数がどこかに存在することを示しますが、関数の内部で何が起こるかは示しません。コンパイラを満足させるには、両方が必要です。(技術的にはリンカーも関係しますが、その詳細は現在の質問にとって重要ではありません。)
もう 1 つ: あなたの関数は "=" でデフォルトの引数を提供します。これはあなたが意図したものではないと思います。あなたは始めたばかりなので、物事を複雑にするだけなので、これらを削除することを強くお勧めします. 関数に慣れてきたら、デフォルト引数について学ぶことができます。
最後に、関数呼び出しを見てみましょう。
printText("I hear and I forget.", "*", 15);
この行は main() 関数に表示されるため、printText() 関数にその処理を実行するよう指示します。この行は、printText() 関数への入力も提供します。ここで与えられた入力は、2 つの文字列 (または文字配列) と整数であることに注意してください。(二重引用符で囲まれたもの -- "" -- は文字列であり、文字配列と同等です。) これは関数宣言によって記述された入力のリストと一致しないため、コンパイラは変換を試みます。リストされたタイプへの入力。それができないので、コンパイラは不平を言います。
あなたは実際に 3 番目の引数を に変更したいと考えています'*'
。一重引用符に注意してください。これは、C++ (および他のほとんどのプログラミング言語) で単一の文字を示す方法です。
この説明が、コードで何が起こっているのかを理解するのに役立つことを願っています. C++ の学習を頑張ってください!