• ベストアンサー

C++

今、下のようなプログラムを作っています #include <iostream> #include <iostream> using namespace std; int i=0, c=0, n; char str[10]; class X16karax10{ //16進から10進ヘ public: void keisan(); }; void X16karax10::keisan(void){ cout<<"16進を入力して下さい"<<endl; cout<<"英数字は大文字で入力してください(F→○ f→×)" <<endl; scanf("%s",str); while(str[i] != '\0'){ n = n * 0x10; c = str[i++]; if((c >= '0') && (c <= '9')){ n += c - '0'; } else if((c >= 'A') && (c <= 'F')){ n += c - 'A' + 10; } } cout<<("%d\n",n)<<"です\n"<<endl; } int main(){ for(i=0; ; i++){ X16karax10 p; p.keisan(); } } 16進を十進に変えるものなのですがreturn 0を使うと「X16karax10::keisan()' は値を返せない」と、でてしまうのですがどうしたらよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>X16karax10::keisan()' は値を返せない voidで宣言しているからです。 16進数で数値を入力させるには、 cin >> hex >> n; で入力できます。 10進で出力するのは、 cout << n << endl; でいいです。 他の人も指摘されてるように、scanfを混用するのはよくないです。 クラスを使ってる(のに外部変数に平気でアクセスしてるし初期化してないし)のもよくわかりません for(i=0; ; i++){ ループの終了条件がありませんが?

その他の回答 (3)

回答No.3

直すとしたら、void keisan(); の部分もですね。 void 型は、「何も返さない」ことを明示するため型で、何かを返してはいけません。 それ以前に、この関数で、return 0; をする必要がありますか? それ以外に、 ・cout (stream 系)と、scanf (stdio 系)の併用は、良くないことが起こることがあります。 ・class の使い方が全く不適切です。 ・n が初期化もされておらず、しかもグローバル変数なので、一見意味不明の挙動を示すことでしょう。 という、こういうことのほうが気にかかったりしますが。

shao24
質問者

お礼

まだ始めたばかりの初心者だったのでないといけないものだと思ってました^^; 回答ありがとうございました

  • TT414
  • ベストアンサー率18% (72/384)
回答No.2

>void X16karax10::keisan(void){ を int X16karax10::keisan(void){ に変えてください。

shao24
質問者

お礼

回答ありがとうございました

  • 12m24
  • ベストアンサー率23% (193/817)
回答No.1

 関数の定義(関数の一行目)で、返り値の型を「void」にしているからです。  voidは「型なし」なので、返り値の型が規定されないことになります。現実にはこれを計算に利用している式があると、型が指定されていないため、どのような解釈もできてしまいます(文字型でもいいし、浮動小数点数型でもよい)。なので、「void」型の関数に返り値は返してはいけないことになっています。  最近プログラムをやっていないので忘れていますが、C++では、これが使用としてはっきり決められていたと思います。  もし返り値がほしいときは、返り値の型にvoid以外の所定の型を指定してください。

shao24
質問者

お礼

そうだったのですか ありがとうございます

関連するQ&A