NullPointerExeptionを解決するための方法

このQ&Aのポイント
  • RPGを作成中に発生するNullPointerExeptionエラーに対処する方法を解説します。
  • MainPanel()メソッド内の問題点として、mainpanel変数の警告やinsets.leftの値の取得方法が挙げられます。
  • drawMapメソッド内の問題点として、マップの描画に関する処理の誤りがあります。
回答を見る
  • ベストアンサー

NullPointerExeption

 RPGを作成しているのですが、 Exception in thread "main" java.lang.NullPointerException というエラーメッセージが表示されてしまいます。 public static void main(String[] args) { MainPanel mainpanel = new MainPanel(); ←問題点その一 } /* 主となるメソッド */ public MainPanel(){ //スーパークラスのコンストラクタ(ウインドウ作成などの初期設定を行う) super(); //中略 //Mapクラスのインスタンス(何もしない) m = new Map(); //マップ描画 m.drowMap(Map.HotelRoom); ←問題点その二 //以下略 } これらの問題点はコンソールに表示されるだけですが、別にeclipse側で、 MainPanel mainpanel = new MainPanel(); のmainpanelに黄色い下線が表示され、「ローカル変数mainpanelは読み取られません」という警告が出されます。 又、以下はmap.Mapクラス(インポート済み)にあるdrawMapメソッドです。 public void drowMap(int mapName){ chooseMap(mapName); mapchip = ImageIO.read(getClass().getResource("/Resource/mapchip/" + mapImage));//try~catchは略 for(int i=0; i < tate; i++){  //マップのX座標を初期化  map_x = insets.left; ←問題点三  //マップのY座標=フレームの上枠+行数×チップサイズ  map_y = insets.top + i * MAPCHIP_SIZE;   /** 以下はあまり関係ないと思うけど、念のため・・・ **/  for(int j = 0; j < yoko; j++){   //マップのX座標=回数(0回目を最初とする)×マップチップの大きさ+フレームの左枠   map_x = j * MAPCHIP_SIZE +insets.left;   int chipnumber = map[i][j];   //横のマスの数   int chip_kazu_yoko = map[0].length;   //そのマップチップは何行目にあるか   int gyou = (int)chipnumber/chip_kazu_yoko;   source_y = gyou * MAPCHIP_SIZE;   source_x =chipnumber%chip_kazu_yoko;  } //マップの描画 g.drawImage(mapchip,map_x,map_y,MAPCHIP_SIZE,MAPCHIP_SIZE, source_x,source_y,source_x+MAPCHIP_SIZE/2,source_y+MAPCHIP_SIZE/2,frame); } } 問題点三にあるinsets.leftは、Mapクラスのスーパークラスで public Insets insets; と定義され、MainPanelで実行される、super()の中で、 insets = frame.getInsets(); のように値を取得しています。 環境はJDK&JRE 6 Update1、eclipse3.1.1です。 長い上にわかりにくくて非常に恐縮なのですが、よろしくお願いします。

noname#82539
noname#82539
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.2

>insets = frame.getInsets(); >のように値を取得しています。 insetsは、frameが画面上に実際に描画されるまでnullです。 全体の構造が完全にはつかめませんが、frameが描画される前に drowMap(int mapName)メソッドが呼び出されているためだと思われます。 対処法としては、frameコンポーネント内のpaint(Graphics g)を オーバーライドしたメソッドで、getInsets()を実行することです。 このpaint(...)メソッドは、実際に描画するときにしか呼び出されませんので、 ここでsuper.paint(g)の後でgetInsets()を行えば、Insetsオブジェクトが nullである問題は避けられることになります。 >これらの問題点はコンソールに表示されるだけですが、別にeclipse側で、 >MainPanel mainpanel = new MainPanel(); >のmainpanelに黄色い下線が表示され、「ローカル変数mainpanelは >読み取られません」という警告が出されます。 これは、mainpanelオブジェクト変数は定義されているだけで、 使用されていないと言う意味です。 今のままならば、  MainPanel mainpanel = new MainPanel(); は、  new MainPanel(); と書けば、十分だということです。 あと、2点アドバイスさせて頂きます。 1点目は、 >m.drowMap(Map.HotelRoom); 現行は、HotelRoom等のアイテムをint型のシリアル定数で識別して 描画するようにされていられますが、このアイテムこそオブジェクト化される べきであると思われます。 --- MapItem.java --- interface MapItem {  Image getImage();  Point2D getLocation();  void setLocation( Point2D location );  Dimension2D getSize();  void setZoom( Dimension2D size );  void draw( Graphics g ); } --- AbstractMapItem.java --- public abstract class AbstractMapItem implements MapItem {  Point2D location = new Point2D();  Dimension2D size = new Dimension2D();  public void draw( Graphics g ) {   Insets insets = g.getInsents();   g.drawImage( getImage(), insets,left+location.x ... );  }  public Point2D getLocation() {   return location;  }  public void setLocation( Point2D location ) {   this.location = location;  }  public Dimension2D getSize() {   return size;  }  public void setZoom( Dimension2D size ) {   this.size = size;  } } --- HotelRoom.java --- public class HotelRoom extends AbstractMapItem {  public Image getImage() {   Image image = ImageIO.read(getClass().getResource("/Resource/mapchip/HotelRoom.jpg"));   return image;  } } そして、単純にはこれをFrame内で  List<MapItem> mapItens;    addMapItem( MapItem mapItem ) {   mapItems.add( mapItem );  }  removeMapItem( MapItem mapItem ) {   mapItems.remove( mapItem );  }  paint( Graphics g ) {   for( MapItem mi : mapItems ) {    mi.draw( g );   }  } この様に、描画プロセスを変更されることをお勧めします。 2点目は、 現在、Frameに直接グラフィックスを描画されておられるようですが、frameにJPanelを 追加して、その上にpaintComponent(Graphics g)で描画するように変更したほうが より汎用性が増すと思われます。 質問の本質に関係のない部分の方が断然長くなってしまった感がありますが、 描画プロセス全体をリファクタリングされることをお勧めします。 ホテルは、現実世界で物体ですので、プログラミング上でオブジェクトとして 定義することが非常に自然です。 ホテルの色を変更したりするようなメソッドを持たせたりという様に別の処理を 追加していった場合に、現行のままだと組み合わせ爆発を起こすことにもなります。

noname#82539
質問者

お礼

 ご回答ありがとうございます。ウィンドウフレームの描画前にgetInsets()が行われていたからだったのですね!  解説書にpaint()メソッドについての解説がなかったので、その辺りはずっとほっぽらかしにしていたのですが、知識が曖昧なままでやっていると、お先真っ暗かもしれないですね・・・。とりあえず、このバグを改修するためにも、もう一冊本を買うなり、解説サイトを読むなどして、知識の増強を図ってきます。

その他の回答 (1)

  • hofchan
  • ベストアンサー率62% (17/27)
回答No.1

まず、あなたのコードは読んでいないですが NullPointerException が投げられると言うことは null であってはおかしい場所が null なのです 怪しいオブジェクトを調べれば直ります

noname#82539
質問者

お礼

 ご回答ありがとうございます。  やっぱりどこかがNullの入らない場所がNullってことですよね・・・。もう少し探してみることにします。

関連するQ&A

  • 配列

     Java初心者です。  RPGを作っているのですが、JPanelを継承したクラスのpaintComponentメソッドで、Stageをインスタンス化すると、 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException というエラーメッセージが表示されてしまいます。  エラーが発生している行は、Stage.javaで、mass_x[0]に値を代入しているところです。DrowMapクラスを継承しているので、その辺でミスをしているのだと思いますが・・・。 ------------Stage.java public class Stage extends DrowMap{  //コンストラクタ  public Stage(){   super();   //////////変数に値を代入(一部略)   //マップに使用する画像   mapImage = "/material/mapchip/s10.png";   //マップの作成   map_arrangement = new int[][]{            {1,1,1,1},            {1,0,0,0},            {1,0,0,0},            {1,1,1,1} };   mass_x[0] = 1;//ここでNullPointerExceptionが発生   mass_y[0] = 1;      mass_x[1] = 1;   mass_y[1] = 16;  } } ----------DrowMap.java abstract public class DrowMap{  //////////変数宣言(一部略)    //読み込んだマップチップから切り取って表示するマス  public int[] mass_x;  public int[] mass_y;  //表示されるマップの配列  public int[][] map_arrangement;    //使用するマップ画像  public String mapImage;    //使用するマップ画像の縦横のサイズ(単位:ピクセル)  public int mapImageSize_yoko;  public int mapImageSize_tate;  /**マップを描画*/  public void drowMap(Graphics g){   mapchip = ImageIO.read(getClass().getResource(mapImage));//try~catchは略   for(int i=0; i < tate; i++){    //マップのX座標を初期化    map_x = 0;    //マップのY座標=フレームの上枠+行数×チップサイズ    map_y = frame_top_border + i * MAPCHIP_SIZE;      for(int j = 0; j < yoko; j++){     //マップのX座標=(回数-1)×マップチップの大きさ+フレームの左枠     map_x = j * MAPCHIP_SIZE + frame_border;       //次に表示するマスの、チップの番号=map_arrangement[i][j]の値     int chipnumber = map_arrangement[i][j];        //画像ファイルから切り取る部分の左上のx座標     source_x = (mass_x[chipnumber] - 1) * MAPCHIP_SOURCE_SIZE;         //画像ファイルから切り取る部分のy座標     source_y = mass_y[chipnumber] * MAPCHIP_SOURCE_SIZE;    }      //マップの描画    g.drawImage(mapchip,    map_x,map_y,    MAPCHIP_SIZE,MAPCHIP_SIZE,    source_x,source_y,    source_x+MAPCHIP_SOURCE_SIZE,    source_y+MAPCHIP_SOURCE_SIZE,    frame);   }  } }  色々と試してみたのですが、解決しません。お分かりになる方いらっしゃいましたら、教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • 敵との当たり判定

    現在VisualC++2008でゲームを製作してるんですが 自分と敵との当たり判定がわかりません。 どのようにすればいいか教えてもらえないでしょうかm(_ _)m #define SCREEN_WIDTH (640) // 画面の横幅 #define SCREEN_HEIGHT (480) // 画面の縦幅 #define CHIP_SIZE (32) // 一つのチップのサイズ #define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅 #define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅 #define CHAR_SIZE (30) // プレイヤーのサイズ float PlX, PlY ; // プレイヤーの座標(中心座標) int ActMain( void ) { // プレイヤーの座標を初期化 PlX = 100.0F ; PlY = 1.0F ; // マップ { int i, j ; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { // 1のところだけ描画 if( MapData[i][j] == 1 ) { DrawBox( j * CHIP_SIZE, i * CHIP_SIZE, j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE, GetColor( 0, 0, 0 ), TRUE ) ; } } } } //プレイヤーの描写 DrawBox( ( int )( PlX - CHAR_SIZE * 0.5F ), ( int )( PlY - CHAR_SIZE * 0.5F ), ( int )( PlX + CHAR_SIZE * 0.5F ) + 1, ( int )( PlY + CHAR_SIZE * 0.5F ) + 1, GetColor( 255, 0, 0 ), TRUE ) ; Cr = GetColor( 255 , 255, 255 ) ; //敵の描写 DrawGraph(teki[0].x,teki[0].y,teki[0].img,TRUE); //初期化 void SYOKIKA(void){ teki[0].x=500; teki[0].y=200; teki[0].img=LoadGraph("red_player.bmp"); //当たり判定をつくったつもりですが反応せず・・・。一応あたったらPlXを0に移動させようとしています。 if(PlX==teki[0].x) PlX=0; if(PlX==teki[0].y) PlX=0; if(PlY==teki[0].x) PlX=0; if(PlY==teki[0].y) PlX=0; がソースです(文字数が足りないのであたり判定に関係ありそうな(敵と自分の座標関連)ところだけ抜きました)今のところ敵、自分、マップ表示や自分の移動などはできているのですが、敵に触れても反応せず、ときおり敵のいないまったく関係のない場所でPlXが0に移動したりしてしまいます ソースみづらくて申し訳ありません。

  • RPGゲームの簡単なプログラムを打ってみたんですがうまく表示されません

    RPGゲームの簡単な初歩的なサンプルプログラムを自分で打ってみたんですが、思った通りに表示されません。 以下のソースのどこかおかしいとこありますでしょうか。 #include<stdio.h> #include<windows.h> #define MAP_SIZE_Y 10 #define MAP_SIZE_X 10 int x = 4,y = 5; int j,i; int map[100][100] = { {1,1,1,1,1,1,1}, {1,0,0,3,0,0,1}, {1,0,0,0,0,0,1}, {1,0,2,0,2,0,1}, {1,0,0,0,0,0,1}, {1,1,1,1,1,1,1}, }; void DrawMap(){ for(j = 0; i < MAP_SIZE_Y; j++){ for(i = 0; i < MAP_SIZE_X; i++){ if(j == y && i == x){ printf("勇"); }else{ switch ( map[j][i]){ case 1: printf("■"); break; case 2: printf("兵"); break; case 3: printf("王"); break; default:printf(" "); break; } } } printf("\n"); } } void main(){ while(1) { system("cls"); DrawMap(); } }

  • 画像読み込み

    現在Microsoft Visual C++ 2008 Express Editionをつかってゲームを製作していてhttp://homepage2.nifty.com/natupaji/DxLib/dxprogram.htmlを参考に勉強しているのですがここの  30.アクションゲームにおけるマップとの当たり判定基本におけるプログラムでの // マップの描画 { int i, j ; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { // 1は当たり判定チップを表しているので1のところだけ描画 if( MapData[i][j] == 1 ) { DrawBox( j * CHIP_SIZE, i * CHIP_SIZE, j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE, GetColor( 255, 255, 255 ), TRUE ) ; } } } } // キャラクタの描画 DrawBox( ( int )( PlX - CHAR_SIZE * 0.5F ), ( int )( PlY - CHAR_SIZE * 0.5F ), ( int )( PlX + CHAR_SIZE * 0.5F ) + 1, ( int )( PlY + CHAR_SIZE * 0.5F ) + 1, GetColor( 255, 0, 0 ), TRUE ) ; のところのキャラクターとマップの画像を自分の書いた画像にするのはどうすればいいのでしょうか? 一応上のプログラムと同じサイズの画像を書き、load graphなどでためしているのですが成功しません・・・。 分かる方いらっしゃいましたら教えてもらえないでしょうか(m;_ _)m

  • javaの配列でエラーが出ます。

    javaの配列でエラーが出ます。 先ほどもjavaの配列で質問させていただいたんですが、 また同じようなところでエラーが出ました。。。 マインスイーパーを作ろうとしているんですが、 周りにある爆弾の数を数えるところでエラーが出ます。 たびたび頼ってばかりで申し訳ありません。 一応自分なりに考えたのを以下に。。 爆弾があるというのはmine[][]==10であらわしています。 //フィールド int[][] mine=new int[9][9]; Random rnd=new Random(); //スレッド public void run(){ //爆弾生成 int yoko,tate; for(int i=0;i<=9;i++){ yoko=(rnd.nextInt()>>>1)%9; tate=(rnd.nextInt()>>>1)%9; if(mine[yoko][tate]!=10)mine[yoko][tate]=10; else i-- } kazugime(); }//本当はこの後に描画のループが続きます。 //数を代入するメソッド public void kazugime(){ int kazu=0; for(int i=0;i<=8;i++){ for(int j=0;j<=8;j++){ kazu=0; if(mine[i][j]!=10){ //上の段 if(i>=1&&j>=1){if(mine[i-1][j-1]==10)kazu++;} if(i>=1){if(mine[i-1][j]==10)kazu++;} if(i>=1&&j<=7){if(mine[i-1][j+1]==10)kazu++;} //真ん中の段 if(j>=1){if(mine[i][j-1]==10)kazu++;} if(j<=7){if(mine[i][j+1]==10)kazu++;} //下の段 if(i<=7&&j>=1){if(mine[i+1][j+1]==10)kazu++;} if(i<=7){if(mine[i+1][j]==10)kazu++;} if(i<=7&&j<=7){if(mine[i+1][j+1]==10)kazu++;} mine[i][j]=kazu; } } } エラーは Uncaught exception java/lang/ArrayIndexOutOfBoundsException です。 足らない部分があればご指摘お願いします。 どうかよろしくお願いします。

    • ベストアンサー
    • Java
  • ラベルをピクチャボックスの上に表示させたい

    PictureBox[,] map = new PictureBox[27, 27]; private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko);//用意する map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; this.Controls.Add(map[i, j]);//設置 bom_map[i, j] = 0; } } } ピクチャボックスの場合↑のように記述すると25×25のマップができあがりました。 それぞれのピクチャボックスの上に数字を表示させたいのですがうまくできません ちなみに、この様にソースを書いてみました private System.Windows.Forms.Label[,] label; private void Form1_Load(object sender, EventArgs e) { this.label = new System.Windows.Forms.Label[27, 27]; for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { this.label[i, j] = new System.Windows.Forms.Label(); this.label[i, j].Size = new Size(tate, yoko); this.label[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5); this.label[i, j].Text = Convert.ToString(i * j); this.label[i, j].BackColor = Color.BlanchedAlmond; this.Controls.Add(this.label[i, j]); } } } ピクチャボックスと同じようにかぶせるのかな?と思い書いてみたんですが 何も表示されなくて困っています。 C#初心者なのでよろしくおねがいします。 }

  • ピクチャボックスをクリックしたら・・・という動作

    C#です ピクチャボックスをクリックしたら・・・という動作ができません・・・ 宣言等はこのようにしました for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko); map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; map[i, j].Click += new EventHandler(map_click);//マップをクリックした } } map_clickというメソッドにはどのようにかけばいいのでしょうか? そのピクチャボックスをクリックしたらそのピクチャボックスの背景色を緑色に変える という風に書きたいのですが・・・・

  • DXライブラリでマップが作れません・・・。

    今DXライブラリとVisualC++2008を使ってゲーム(アクション)を作っているのですがマップが作れません・・・、構造体?をつかってマップの描写は成功したのですが、0のところに判定を持たせることができません・・・。どのようにすればいいのでしょうか?色々試してみてもできず困っています。 ソースの一部 #include"DxLib.h" #define MAP_SIZE 64 // マップチップ一つのドットサイズ #define MAP_WIDTH 10 // マップの幅 #define MAP_HEIGHT 8 // マップの縦長さ int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , } ; void HYOUZI(void); void SYOKIKA(void); struct dousa{ int power; int flag; }; struct dousa jump; struct zahyou { int x,y; int img; int flag; int muki_y; int muki_x; int x1; int x2; int x3; int x4; int y1; int y2; int y3; int y4; }; struct zahyou haikei; struct charcter { int x,y; int img; int flag; }; struct charcter ziki; struct map; //初期化 void SYOKIKA(void){ jump.flag=0; ziki.x=100; ziki.y=100; ziki.img=LoadGraph("red_player.bmp"); } //背景 void HYOUZI(void){ int i,j; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { if( MapData[ i ][ j ] == 0 ) { DrawBox( j * MAP_SIZE , i * MAP_SIZE , j * MAP_SIZE + MAP_SIZE , i * MAP_SIZE + MAP_SIZE , GetColor( 255 , 0 , 0 ) , TRUE ) ; } } } DrawGraph(ziki.x,ziki.y,ziki.img,TRUE); ScreenFlip(); } //動き void ugoki(void){ int OldX , OldY ; OldX = ziki.x ; OldY = ziki.y ; if (CheckHitKey(KEY_INPUT_RIGHT) == 1){ ziki.x=ziki.x+4; } if (CheckHitKey(KEY_INPUT_RIGHT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x+8; } if (CheckHitKey(KEY_INPUT_LEFT) == 1){ ziki.x=ziki.x-4; } if (CheckHitKey(KEY_INPUT_LEFT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x-8; } if(ziki.x>640){ ziki.x=-10; } if(ziki.x<-10){ ziki.x=640; } //ジャンプ jump.power-=1; ziki.y -=jump.power; if(ziki.y>400){ jump.power=0; ziki.y=400; jump.flag=0; } if (CheckHitKey(KEY_INPUT_DOWN) == 1 && jump.flag == 0){ jump.power=30; jump.flag=1; } if (CheckHitKey(KEY_INPUT_UP) == 1 && jump.flag == 0){ jump.power=20; jump.flag=1; } if( MapData[ ziki.x ][ ziki.y ] == 0 ) { ziki.x = OldX ; ziki.y = OldY ; } } int WINAPI WinMain ( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1) { return -1; } SYOKIKA(); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0){ HYOUZI(); ugoki(); ClearDrawScreen(); } DxLib_End(); return(0); } 分かる人がいたらぜひ教えてください(o_ _)o

  • 数字をピクチャボックスの上に表示させたい

    質問の内容を書いてくださいPictureBox[,] map = new PictureBox[27, 27]; private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko);//用意する map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; this.Controls.Add(map[i, j]);//設置 bom_map[i, j] = 0; } } } ピクチャボックスの場合↑のように記述すると25×25のマップができあがりました。 それぞれのピクチャボックスの上に数字を表示させたいのですがうまくできません ちなみに、この様にソースを書いてみました private System.Windows.Forms.Label[,] label; private void Form1_Load(object sender, EventArgs e) { this.label = new System.Windows.Forms.Label[27, 27]; for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { this.label[i, j] = new System.Windows.Forms.Label(); this.label[i, j].Size = new Size(tate, yoko); this.label[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5); this.label[i, j].Text = Convert.ToString(i * j); this.label[i, j].BackColor = Color.BlanchedAlmond; this.Controls.Add(this.label[i, j]); } } } ピクチャボックスと同じようにかぶせるのかな?と思い書いてみたんですが 何も表示されなくて困っています。 C#初心者なのでよろしくおねがいします。

  • このプログラムの問題点を教えてください。

    //数独 #include <iostream.h> const int num_Max = 100; //一辺のマス最高値 void input_data( int a, int [num_Max][num_Max] ); //入力関数 void yoko_data( int a, const int [100][100], int & ); //判定 void tate_data( int a, const int [100][100], int & ); void block_data( int a, int b, const int [100][100], int & ); main() { int num; //一辺のマスの数 int m; //一ブロックの一辺にあるマスの数 int okey; //numが正常か判別 int dx, dy, dz; int masu[num_Max][num_Max]; //全部のマス cout << "\n埋められた数独が正しいかどうか判断するプログラムです。\n"; while(1){ cout << "横何マスありますか? (4-100)>>" ; cin >> num ; if( num > num_Max || num < 4){ cout <<"範囲外です。再入力して下さい。" ; }else{ m = sqrt( num ); okey = num - m * m; if(okey != 0) cout << "その数字は数独として成り立ちません。再入力して下さい。"; } } //マスの入力 input_data( num, masu ); //横判定 yoko_data( num, masu, dx ); if(dx = 0){ //縦判定 tate_data( num, masu, dy ); if(dy = 0){ //マス判定 block_data( num, m, masu, dz ); } } if(dx == dy == dz == 0) cout <<"\n大正解♪ おめでっとー。\n"; return 0; } //入力 void input_data( int kazu, const int matrix[num_Max][num_Max]) { cout <<"\nマスの数字の入力を左上から順に、右へと行って下さい。"; for(int i = 0; i < kazu; i++){ for(int j = 0; j < kazu; j++){ cout << i+1 << "行目の" << j+1 << "列目 >>"; cin >> matrix[i][j] ; } } } //横列(行)を順に判定 void yoko_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vx = 0; //かぶっていたと判定されたかどうかを見る用 for(int i = 0; i < kazu; i++){ //横一列取り出しました。 for(int j = 0; j < kazu; j++){ for( int k = 1; j+k < kazu; k++){ kaburi = matrix[i][j] - matrix[i][j+k]; if(kaburi == 0){ //かぶってたらループから抜け出す vx++; break; } } } } if(vx > 0) cout << "\n横列(行)検索時に不適切な部分を発見しました。\n"; return vx; } //縦列(列)を順に判定 void tate_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vy = 0; //かぶっていたと判定されたかどうかを見る用 for(int j = 0; j < kazu; j++){ //縦一列取り出しました。 for(int i = 0; i < kazu; i++){ for( int k = 1; k < kazu-1; k++){ kaburi = matrix[i][j] - matrix[i+k][j]; if(kaburi == 0){ //かぶってたらループから抜け出す vy++; break; } } } } if(vy > 0) cout << "\n縦列(列)検索時に不適切な部分を発見しました。\n"; return vy; } //1ブロックごとに判定 void block_data( int kazu, int ruto, int matrix[num_Max][num_Max]) { int hantei[num_Max][num_Max] ; //判定する部分を切り出す用 int kaburi; int vz; //まずブロックごとに切り出してみる for(int i = 0; i < ruto-1; i++){ for(int j = 0; j < ruto-1; j++){ int h = 0; //何ブロック目か int g = 0; //そのブロックの何個目か (h-1)++; for(int l = 0; l < ruto-1; l++){ for(int k = 0; k < ruto-1; k++){ hantei[h][g++] = matrix[i * m + k][j * m + l]; } } } } //かぶっているか判定する for(int x = 0; x < kazu; x++){ for(int y = 0; y < kazu; y++){ for( int z = 1; z < kazu-1; z++){ kaburi = hantei[x][y] - matrix[x+z][y]; if(kaburi == 0){ //かぶってたらループから抜け出す vz++; break; } } } } return vz; } C++で作成したものです。 コンパイルエラーが出てしまうのですが、原因を教えていただけませんか?