• 締切済み

C++ 現在書いているプログラムが動きません

VC++ 2010にてプログラムを書きこんでおり、ビルドするとエラー。 おそらく私の無知によるものだとは思うのですが原因が分かりません。 <main.cpp> #include "DxLib.h" #include "ScreenPanel.h" int MapDate[BACKPANEL_XNUM][BACKPANEL_YNUM]; int WeedNum(ScreenPanel* scr_p); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { if( ChangeWindowMode(TRUE) != 0 )return 0; if( DxLib_Init() != 0 )return 0; if( SetDrawScreen( DX_SCREEN_BACK ) != 0 ){ DxLib_End(); return 0; } ScreenPanel* scr_p; int weednum; for (int i = 0; i < WeedNum(scr_p);i++) { weednum++; } WaitKey() ; DxLib_End() ; return 0 ; } //サブルーチン int WeedNum(ScreenPanel* _scp) { int weednum = _scp -> WeedCounter(); return weednum; } <ScreenPanel.h> #ifndef __SCREENPANEL_H #define __SCREENPANELH const int BACKPANEL_XNUM = 3; const int BACKPANEL_YNUM = 3; const int MapDate[BACKPANEL_XNUM][BACKPANEL_YNUM] { { 1,2,3 }, { 4,5,6 }, { 7,8,9 } }; class ScreenPanel { public: ScreenPanel() {} int WeedCounter() { int result_num = 0; for (int i = 0;i < BACKPANEL_XNUM;i++ ) { for (int j = 0;j < BACKPANEL_YNUM;i++ ) { if (MapDate[i][j] == 1) result_num++; } } return result_num; } }; #endif ご指摘等、あればお願い致します。

みんなの回答

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

まずは、そのエラーメッセージを読むことです。 間違いの場所とその内容は、大体そこに書いてあります。 エラー番号やメッセージで検索すれば、解説が見つかります。 > ScreenPanel* scr_p; 以降、scr_pに何も代入されていません。 ポインタを宣言しただけなので、不正なアドレスを指してる可能性が高いです。 エラーにはなりません。設定しだいでは警告は出ます。 > #ifndef __SCREENPANEL_H > #define __SCREENPANELH これはわざとですか? 今のところはエラーになりませんが、将来エラーの原因になりうるものです。 > const int MapDate[BACKPANEL_XNUM][BACKPANEL_YNUM] { 写し間違いですか? 実際にこうなってますか? 意図したものですか? > int MapDate[BACKPANEL_XNUM][BACKPANEL_YNUM]; 二重宣言になっています。 > #define __SCREENPANELH > int WeedNum(ScreenPanel* _scp) { アンダースコアの扱いには注意が必要です。 http://msdn.microsoft.com/ja-jp/library/cc440188%28v=vs.71%29.aspx の「予約名の形式」を参照のこと

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.2

>VC++ 2010にてプログラムを書きこんでおり、ビルドするとエラー。 エラーが起きるのならエラーメッセージが出力されてるはずですから、それもそのまま書きましょう(これはプログラミング関係で質問する上での基本です)。 とりあえず思い当たるのはMapDataがmain.cppとScreenPanel.hの両方で定義されてますし、型も異なってます。 またグローバル変数の定義をヘッダファイルで行うのは、そのヘッダファイルをインクルードしているソースファイルそれぞれで定義することになるのでお勧めしません。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

どういうエラーなのか。くらいは掲示できませんかね? パッとみた感じでは… >ScreenPanel* scr_p; ScreenPanelクラスへのポインタ変数を用意していますが指している先は不定。 で、 >for (int i = 0; i < WeedNum(scr_p);i++) { どっか判らないアドレスを引数に渡して、アクセス保護違反を誘発させようとしています。 ある意味、RPGの勇者の所行ですな。 勝手に見ず知らずの他人の家に入ってタンスの中のアイテムをゲットしてみたり、王宮の宝物庫に入ってレアアイテムを強奪したり。 WeedNum()のプロトタイプで引数の型がScreenPanel*なので、ScreenPanel*な変数を用意したんですよね? が、引数の型がポインタだからと、どこも指していないポインタを渡すのは間違っています。 ScreenPanel scr; for (int i = 0; i < WeedNum(&scr);i++) { ではありませんか? さらに… >int weednum; こちらも値が不定です。 # ビルド時に警告出ていたかと思いますが…。

関連するQ&A

  • c言語 プログラム ピラミッド

    プログラミングについて教えてください プログラムは ピラミッドの図形をユーザーが指定した数字で正三角形の ピラミッドの段数を指定できるプログラムです 例えば「5」と打てば ********* ■ ********■■■ ******■■■■■ ****■■■■■■■ **■■■■■■■■■ このような感じに表示されます *の部分は空白です #include<stdio.h> int main (void) { int num,i,j,h; printf("ピラミッドの高さを入力してください : "); scanf("%d" ,&num); for(i=1; i<=num; i++){ for(j=num; j>=i+1; j--){ printf(" ",j); } for(h=1; h<=j; h++){ printf("■"); } printf("\n"); } return 0; } ここまで出来ています、詰まっているのでご教授ください よろしくお願いします

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

    //数独 #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++で作成したものです。 コンパイルエラーが出てしまうのですが、原因を教えていただけませんか?

  • c++について

    入力した値が123または456で一致したら一致と表示したいのですがどうfor文を回すか分かりません。 ご助力願います_(._.)_ class N { bool hit(const char* a[],const char* b) {   for(int i=0;i<*a[i];i++) if(*a[i]!=b[i]) { return false; } return true ; } public: N() { const char* a[ ]={ "123","456"}; char b[4]; int num; cin>>num; sprintf_s(b, 4, "%03d", num); if(hit(a,b)) cout<<"一致"; else cout<<"不一致"; } };

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • 小さい順に並べ替えるプログラム

    コンピュータに10個のてきとうな数字を入力させ それを、小さい順に並べ替えるプログラムです。 以下のようにしたのですが、エラー0 警告0 なのに動きません。 どこが違うのでしょうか? #include<iostream> #include<cstdlib> #include<ctime> using namespace std; const int NUM_ELEMENTS=10; void sort(int*); void generation(int*); void exchange(int&,int&); void sort(int* a){ int min, locate, i, j; for(i=0; i<NUM_ELEMENTS-1; i++){ min = a[i]; locate = i; for(j=i; j<NUM_ELEMENTS; j++){ if(min > a[j]){ min = a[j]; locate = j; } } exchange(a[i],a[locate]); } } void generation(int* a){ int i; srand(time(NULL)); for(i=0; i<NUM_ELEMENTS; i++){ a[i] = rand(); } } void exchange(int& a,int& b){ int t; t=a; a=b; b=t; } int main(){ int data[NUM_ELEMENTS]; generation(data); sort(data); return 0; }

  • DXライブラリの透過処理について

    #include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { ChangeWindowMode(TRUE); SetDrawScreen(DX_SCREEN_BACK); if(DxLib_Init()==1) { return -1; } char key[256]; // int haikei; int mapchip[2][152]; int i,j; //int x = 0, y = 0; //haikei = LoadGraph("haikei/草原.jpg"); LoadDivGraph("03.png",5,1,5,32,32,mapchip[0]); LoadDivGraph("mura.png",1,1,1,32,32,mapchip[1]); while(ScreenFlip()==0 && ProcessMessage() == 0 && GetHitKeyStateAll(key)==0) { // ClearDrawScreen(); // DrawGraph(x,y,haikei,FALSE); for(i = 0; i<15;i++) { for(j=0;j<20;j++) { DrawGraph(j*32,i*32,mapchip[0][4],FALSE); } } DrawGraph(32,32,mapchip[1][0],TRUE); /* if(CheckHitKey(KEY_INPUT_RIGHT) == 1) x+=10; if(CheckHitKey(KEY_INPUT_LEFT) == 1) x-=10; if(CheckHitKey(KEY_INPUT_UP) == 1) y-=10; if(CheckHitKey(KEY_INPUT_DOWN) == 1) y+=10; */ if(key[KEY_INPUT_ESCAPE] == 1) { DxLib_End(); return 0; } } } 「DrawGraph(32,32,mapchip[1][0],TRUE);」という処理でmura.pngの左上のカラーキーで透過するはずですがしません。 Win10のペイントで作ったpngファイル形式に対応してないかと思うのですが、よくわかりまえん。 なぜ?

  • 最頻度のプログラム

    以下のような最頻度のプログラムを作成しました.最頻度が1つしか存在しないような場合はうまく動くと思います.しかし最頻度の数字が2つ以上存在すると,一番はじめに書い最頻度の数字しか表示しないと思います.どう改良すれば,すべての最頻度の数字を拾ってくれますかね. /*最頻値を求めるプログラム*/ #include<stdio.h> int main(void) { int i,j; int count=0,COUNT=0; double num[20]; double max; printf("最頻値を求めます.数字を20個入力してください.\n"); for(i=0;i<20;i++) { printf("%d\t",i+1); scanf("%lf",&num[i]); } for(i=0;i<20;i++) { count=0; for(j=i+1;j<20;j++) { if(num[i]==num[j]) { count++; } if(COUNT<count-1) { COUNT=count; max=num[i]; } } } printf("%lfが最頻値です.\n",max); return 0; }

  • c言語勉強中でおかしなところがありまして私では解決できませんでした><

    このブログラムを実行したのですが 実行するとウィンドウが出てくるのはいいのですが 右上に120×120ピクセルの水色っぽい正方形が 映ってくれません キーを押したり ウィンドウ内をクリックすると 一瞬表示されるのですが ちゃんと表示されるには どうしたらいいのでしょうか?? どこかにミスがあるのであれば 指摘をお願いします 下記にあるのが そのプログラムです #include "DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) { ChangeWindowMode(true); if(DxLib_Init() == -1) return(-1); DrawBox(0, 0, 120, 120, 65535, true); WaitKey(); DxLib_End(); return(0); }

  • C言語  プログラムのチェックと質問

    プログラミング初心者です プログラミングの練習のためにプログラムを組みました ですがあまり綺麗なプログラムにならなかったのでもっとこうしたらいい というところがあれば教えていただけないでしょうか また組んでいて改善したいところがあったのですが 自分ではどうしたらいいかわからなかったので教えていただけませんか プログラムの説明 1から43の数字からランダムに6つ選び小さい順に並べる それを5回繰り返すプログラム つまりロト6のクイックピックのようなことをするプログラムです 改善したい点 異なる行で2つ以上同じ数がないようにしたい 以下ソースコード #include<stdio.h> #include<stdlib.h> #include<time.h> int main(){ int sai[10][10],i1,i2,i3,j1,j2,j3,num[50],temp; srand((unsigned)time(NULL)); for(i1=0; i1 < 6; i1++){ for(i2= 1; i2 < 44; i2++){ num[i2] = i2; } for(i3 = 0; i3 < 6 ; i3++){ sai[i3][i1] = rand() % 43 + 1; while( num[sai[i3][i1]] == 0){ sai[i3][i1] = rand() % 43 + 1; } num[sai[i3][i1]] = 0; } } for(j1 = 0; j1 < 6 ; j1++){ for(j2 = 0; j2 < 10 ; j2++){ for(j3 = 0; j3 < 5 ; j3++){ if(sai[j3][j1] > sai[j3 + 1][j1]){ temp = sai[j3][j1]; sai[j3][j1] = sai[j3 + 1][j1]; sai[j3 + 1][j1] = temp; } } } } for(j1 = 0; j1 < 5 ; j1++){ for(j2 = 0; j2 < 6 ; j2++){ printf("%d ",sai[j2][j1]); } printf("\n"); } return 0; } 以上

  • C++で分からないプログラムがあるんですが

    #include <iostream> #include <cmath> using namespace std; int main() { static const int N = 2; double va[N]={3,-4}; double vb[N]={4,3}; double a,b; double p; for (int i = 0; i < N; ++i) { for (int i = 0; i < N; ++i) { } } cout << "va + vb = (" ; for (int i = 0; i < N; ++i) { cout << va[i] + vb[i]; if (i < N - 1) { cout << ", "; } } cout << ")" << '\n'; cout << "va - vb = (" ; for (int i = 0; i < N; ++i) { cout << va[i] - vb[i]; if (i < N - 1) { cout << ", "; } } cout << ")" << '\n'; p = 0; for (int i = 0; i < N; ++i) { p += va[i] * vb[i]; } cout << "va・vb = " << p << '\n'; a = 0; for (int i = 0; i < N; ++i) { a += va[i] * va[i]; } a = sqrt(a); b = 0; for (int i = 0; i < N; ++i) { b += vb[i] * vb[i]; } b = sqrt(b); if (a * b != 0) { cout << "cosθ = " << p / (a * b) << '\n'; } return 0; } これで、ベクトルの加減とベクトルの内積とcosθが出るんですが、2つのベクトルを適当に初期化しないといけないんですが、初期化ってこれで初期化ってできてますか?