visualstudioでコンパイルできません

このQ&Aのポイント
  • visualstudioの2005から2013まで試しましたが、コンパイルできません。
  • 書籍付属のコンパイル済みのexeファイルは正常に動くので、何が間違っているのかわかりません。
  • エラーメッセージには、'System.Math.Ceiling(decimal)' と 'System.Math.Ceiling(double)' の呼び出しが不適切であると表示されています。
回答を見る
  • ベストアンサー

visualstudioでコンパイルできません

public SysInfoPanel() { Text = "System Information: Panel"; BackColor = SystemColors.Window; ForeColor = SystemColors.WindowText; AutoScroll = true; Graphics grfx = CreateGraphics(); SizeF sizef = grfx.MeasureString(" ", Font); cxCol = sizef.Width + SysInfoStrings.MaxLabelWidth(grfx, Font); cySpace = Font.Height; // Create a panel. Panel panel = new Panel(); panel.Parent = this; panel.Paint += new PaintEventHandler(PanelOnPaint); panel.Location = Point.Empty; panel.Size = new Size( (int) Math.Ceiling(cxCol + SysInfoStrings.MaxValueWidth(grfx, Font)), (int) Math.Ceiling(cySpace * SysInfoStrings.Count)); //←この部分がエラー grfx.Dispose(); } エラー 1 次のメソッドまたはプロパティ間で呼び出しが不適切です: 'System.Math.Ceiling(decimal)' と 'System.Math.Ceiling(double)' ↑こういうエラーが出てコンパイルできません。visualstudioの2005から2013まで試しましたがだめでした。 書籍付属のコンパイル済みのexeファイルは正常に動くので何が間違っているやら

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

  • ベストアンサー
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.4

ちなみに…… > doubleかdecimalかどっちかにする、 > オーバーロードという機能はそのどっちかを自動で推論してくれる機能?だと思ったのですが > 明示的にしないとだめなのですね。 オーバーロードは「多重定義」のことです。 コンパイラは引数に応じて、複数あるオーバーロードのうちのどれを使うかを判断しますが、 候補を1つに絞りきれないと今回のようなエラーになります。

その他の回答 (4)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.5

元問題は解決しているようですのでANo.2補足への回答です。 オーバーロードは、同名の関数から引数の型によりコンパイラが正しい関数を選択する機能です。 引数と完全に一致する型の関数がない場合は暗黙の型変換が行われますが、それによって選べる関数が複数になると、正しい関数を特定できないためコンパイラがエラーを出します。今回の質問の問題はこのケースです。 ポリモフィズムは実行時のオブジェクトの型によって実行する関数が変わる機能です。実行時のオブジェクトの型が特定できないということはないので実行時エラーはないですね。多重継承で実行できる関数が複数になる場合はコンパイルエラーでしょう。

tranceporter
質問者

お礼

オーバーロードとポリモーフィズムの違いがわかりました。 すっきりしました。またよろしくお願いします。

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.3

> cxColはfloat型 SysInfoStrings.MaxValueWidth(grfx,Font));もfloat型を返します。 > decimalでもdoubleでもないのにエラーが出なかったのはなぜでしょう 型変換には「明示的な型変換(キャスト)」と「暗黙の型変換」とがあります。 intの場合、暗黙の型変換でdoubleにもdecimalにも直せます。 ・int → double  int i = 10;  double d = i; //暗黙の型変換が可能なのでエラーにならない ・int → decimal  int i = 10;  decimal d = i; //暗黙の型変換が可能なのでエラーにならない 一方、floatは暗黙の型変換ではdoubleにしか直せません。 ・float → double  float f = 10f;  double d = f; //暗黙の型変換が可能なのでエラーにならない ・float → decimal  float f = 10f;  decimal d = f; //暗黙の型変換はできないのでエラーになる  d = (decimal)f; //キャストすれば変換可能 そのため、コンパイラは「どっちを呼べばいいの?」と迷う必要はなくなります。 (この場合はMath.Ceiling(double)が呼ばれます)

参考URL:
http://msdn.microsoft.com/ja-jp/library/y5b434w4%28v=vs.90%29.aspx
tranceporter
質問者

お礼

ありがとうございます すっきり納得しました。 decimalというのが初耳でした。もっと勉強いたします。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

#1の通りなら、整数*整数は整数なので、Ceiling 自体不要なわけで。 元のサンプルは cySpace か SysInfoStrings.Count が、double型等になっていませんか?

tranceporter
質問者

補足

はい 両方int型です。 どうもそれがいけないみたいでdouble型にキャストしたらコンパイルできました。 オーバーロードというのは引数に応じて処理を推論してくれる機能ですよね? 多態性ポリモーフィズムと勘違いしてますか?

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

エラーの内容がよく分からない時は、エラーメッセージでGoogle検索等してみましょう。 (まぁこのエラーメッセージじゃ何のことかわかりにくいですよね……) まず、Math.Ceilingメソッドですが、MSDNを見ると、  Math.Ceiling(decimal)  Math.Ceiling(double) の2つのオーバーロードがあることが分かります。 http://msdn.microsoft.com/ja-jp/library/system.math.ceiling%28v=vs.110%29.aspx cySpaceの型に関する記載がありませんが、int型の変数ですか? cySpaceがint型とすると、  cySpace * SysInfoStrings.Count の計算結果はint型になります。 しかし、int型の引数が使えるMath.Ceilingメソッドのオーバーロードはありません。 (int型の値にMath.Ceilingを使う意味はないので当然ですが) なので、decimalかdoubleにキャストする必要があるわけですが、 int型はキャスト演算子なしでdecimalにもdoubleにも変換することができます。 そのため、コンパイラからすると、  「Math.Ceiling(decimal)とMath.Ceiling(double)のどっちを呼べばいいの?」 ということになります。 ということで、  Math.Ceiling((decimal)cySpace * SysInfoStrings.Count) または、  Math.Ceiling((double)cySpace * SysInfoStrings.Count) と書いて、どっちのMath.Ceilingを呼ぶかを指示してあげてください。

tranceporter
質問者

補足

ありがとうございます。キャストをしたらできました Math.Ceiling()を使わないでコンパイルしてもできました。 intなのでMaty.Ceiling()を使う必要がない、doubleかdecimalかどっちかにする、 オーバーロードという機能はそのどっちかを自動で推論してくれる機能?だと思ったのですが 明示的にしないとだめなのですね。 一つちょっとした疑問が残るのですが、エラーとなっていた行の一つ上、 (int)Math.Ceiling(cxCol + SysInfoStrings.MaxValueWidth(grfx,Font)); の部分なのですが、cxColはfloat型 SysInfoStrings.MaxValueWidth(grfx,Font));もfloat型を返します。 decimalでもdoubleでもないのにエラーが出なかったのはなぜでしょう

関連するQ&A

  • コンパイルできません

    2から150の中から数字を30個取得する。というのを2回繰り返します。そして、その2回とも両方に現れた数字だけを表示させたいのですが、自分が作成したプログラムではうまくコンパイルできませんでした。シンボルを解釈処理できません。互換性のない型。というエラーが出てしまいます。ここが間違っているなどアドバイス等お願いしますm(_ _)m import java.util.*; public class RandomTest { public static void main(String[] args) { Random generator = new Random(); //2から150の中から値が30個表示される for(int i=0; i<30; i++){ int ran = (int)(Math.random() * 148)+2; } for(int j=0; j<30; j++){ int ran2 = (int)(Math.random() * 148)+2; } int ran3 = ran && ran2; System.out.println(ran3); } }

    • ベストアンサー
    • Java
  • コンパイルできません。

    コマンドプロンプト上で、乱数をいくつか取得するというプログラムを作成したいのですが、コンパイル出来なくて困っています。発生させる乱数を0~900までの数字の中から0~9個のうちのいずれかの個数だけ取得するようにしたいです。j< の所に変数を記述するのはダメなのでしょうか?わかる方いましたらお願いします。 import java.util.*; public class RandomTest{ int rand; public static void main(String[] args){    Random generator = new Random();    for(int i=0; i<1; i++){     int rand = (int)(Math.random() * 10);    }    for(int j=0; j<rand; j++){     int ran = (int)(Math.random() * 1000);       System.out.println(ran);    } } }

    • ベストアンサー
    • Java
  • コンパイルエラー

    以下のようなソースファイルをコンパイルしたらコンパイルに失敗してしまいました。エラーは『Cls1はabstractで宣言する必要があります。show(int)をCls1で定義しません』と出ます。これはどういうことでしょうか。 interface Int1 { int x=100; void Show(int y); } class Cls1 implements Int1 { public void show(int x) { System.out.println(x); } } class Test12 { public static void main(String args[]) { Cls1 c; c = new Cls1(); c.show(200); } }

    • ベストアンサー
    • Java
  • コンパイルはできるのに・・・・

    import java.io.*; public class ex32 { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int x = (new Integer(in.readLine())).intValue(); int y = (new Integer(in.readLine())).intValue(); while(x != y) { System.out.print("int x> "); System.out.print("int y> "); if(x > y) { x = x - y; } else{ y = y - x; } } System.out.println("GCM = " + x); } } このソースで、コンパイルとdouble x >の出力まではできるのですが、 そこで数字を入力してエンターを押すと、そこから進みません。 どう直したらいいでしょうか。

    • ベストアンサー
    • Java
  • コンパイル後のエラー。

    こんにちは、質問があります。 下のプログラムを組みました。 コンパイルには成功しましたが、実行することができません。 import java.io.*; public class Gyouretu { public static void main(String[] args) { BufferedReader reader = new BufferedReader( new InputStreamReader(System.in), 1); try{ System.out.println("行列数を入力"); String line = reader.readLine(); int n = Integer.parseInt(line); int a[][] = new int[n][n]; int b[][] = new int[n][n]; int c[][] = new int[n][n]; int i,j,k; for ( i = 0; i < n; i++){ for ( j = 0; j < n; j++){ c[i][j]=0; for ( k = 0; k < n; k++){ c[i][j] += a[i][k] * b[k][j]; System.out.print(c); System.out.print(i); System.out.print(j); } } } }catch (IOException e){ System.out.println("end"); } } } 行列の計算をするプログラムなのですが、コンパイル後に行列数(何行何列か?)を入力するとこんなエラーが出ます。 「'2' は、内部コマンドまたは外部コマンド、  操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 なぜなのか、どうしてもわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • なぜコンパイルエラーにならない?

    flag: for ( int i= 0 ; i<5 ; i++){ for(int j=0 ; j<3 ; j++){ label:  if(i<j){ i++; continue label; } System.out.println("あ"); } } ある問題集の問題なのですが、ラベルをfor かwhile 以外につけているのでコンパイルエラーになるという問題でした。 納得。 確かに、打ち込んでみると、コンパイルエラーになります。 しかし、continue を break に変更すると、コンパイルエラーにはならないのです。 なぜでしょうか。 テキストでは、break であれ continueであれ、for や while 以外につけるとコンパイルエラーになると書かれています。 どなたか、教えていただけますか?

    • ベストアンサー
    • Java
  • arraycopy コンパイルエラー

    javaの勉強をしているのですが arraycopy()を使ったプログラムでエラーが出てしまいます。 class Ex97{ public static void main(String args[]){ int []a = new int[10]; int []b = new int[5]; for(int i=0; i<10; i++){ a[i] = (int)(Math.random()*10); } System.arraycopy(a, 2, b, 0, 5); for(int i=0; 0<a.length-1; i++){ System.out.println(a[i]); } System.out.println(""); for(int i=0; 0<b.length; i++){ System.out.println(b[i]); } } } /*メッセージ Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at Ex32.main(Ex32.java:13) */ このプログラムはaの3番目の要素から5つ分の内容をbへコピーする というものです。 ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • コンパイルエラーについて。

    今晩は。現在javaについて勉強しているのですが、 コンパイルエラーを解決することが出来ません。 プログラムの内容は好きな文字列を入力し、空白文字を取り除き出力するといったものです。 空白はindexOf()メソッドを使って探し出す。 空白削除はdeleteCharAt()メソッドを使って行う。 というのが条件です。 どなたかご回答おまちしております。 class bf2{ public static void main(String args[])throws IOException{ String t = "end"; String str = ""; int l; int i; int xx=0; String kuhaku = " "; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(!str.equals(t)){ System.out.print(">"); str = br.readLine(); if(str.equals(t)) break; l = str.length(); i=0; StringBuffer str2 = new StringBuffer(str); while(i<l){ xx = str2.indexOf(kuhaku); str2.deleteCharAt(xx); //こちらがコンパイルエラー会場です。 i++; System.out.println(str2); } } } } Exception in thread "main" java.lang.StringIndexOutOfBoundsException at java.lang.StringBuffer.deleteCharAt(Unknown Source)

    • ベストアンサー
    • Java
  • C# この文法でコンパイルが通らないのは何故?

    下記のような2つのプログラムがあり、一方はコンパイルが通らず、もう一方はコンパイルが通ります。 文法上の違いはさほどないと思うのですが、何故このような結果になるのでしょうか? /////////////////////////コンパイルNG///////////////////////// using System; class Class1{ public static void Main(){ Class2 x; //違い! Class2 xをここで定義 try{x = new Class2(100);} catch{} Console.WriteLine(x.z); } } class Class2{ public int z; public Class2(int x){ z=x; } } /////////////////////////////////////////////////////////// /////////////////////////コンパイルOK///////////////////////// using System; class Class1{ static Class2 x; //違い! Class2 xをここで定義 public static void Main(){ try{x = new Class2(100);} catch{} Console.WriteLine(x.z); } } class Class2{ public int z; public Class2(int x){ z=x; } } ///////////////////////////////////////////////////////////

  • コンパイルできません

    imgにオリジナルの画像データを格納して、それを配列pixelsに格納した後、またpixelsをimg2等に格納してimg2を画面上に表示する。というものを作りたいのですが、コンパイルできなくて困っています。次はプログラムの一部です。pixelsに格納するところでエラーが出てしまいます。エラー内容は シンボルを解釈処理できません。 シンボル: クラス PixelGrabber 位置 : na3 の クラス PixelGrabber pg = new PixelGrabber(img,0,0,w,h,pixels,0,scan) と表示されます。 わかるかたいましたらお願いします。 img = Toolkit.getDefaultToolkit().createImage(imagedata); int w,h; w = (int)getSize().width; h = (int)getSize().height; buffer = this.createImage(w,h); bufferGraphics = buffer.getGraphics(); } public void paint(Graphics g){ int w,h; w = (int)getSize().width; h = (int)getSize().height; int[] pixels = new int[w * h]; int scan = w; int offset = 0; PixelGrabber pg = new PixelGrabber(img,0,0,w,h,pixels,0,scan); try{ pg.grabPixels(); } catch(InterruptedException e){ ; } bufferGraphics.drawImage(img,0,0,this); bufferGraphics.setColor(Color.black); //処理を10回繰り返す for(int j=0; j<10; j++){ //2から1002の中で乱数を1つranに取得 int ran = (int)(Math.random() * 1000)+2; for(int i=0;i<h;i+=ran){ //ranの値にしたがって画面上にラインを表示 bufferGraphics.drawLine(0,i,w,i); } g.drawImage(buffer,0,0,null); } }

    • ベストアンサー
    • Java

専門家に質問してみよう