文章が表示されません
文章が表示されません
#include "DxLib.h"
int function_status=0,black,White,count=0,flag=-1, y=300;
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;
}
return 0;
}
int Key[256],oldKey[256]={};
void char_disp(int y){
LoadGraphScreen(0,0,"haikei.jpg",FALSE);
LoadGraphScreen( 240 , y , "yazirusi.jpg" , TRUE );
LoadGraphScreen( 260, 300 , "newgame.jpg" , TRUE );
LoadGraphScreen( 260 , 320 , "continue.jpg" , TRUE );
LoadGraphScreen( 260 , 340 , "end.jpg" , TRUE );
}
void start(){
SetDrawBlendMode( DX_BLENDMODE_ALPHA , count ) ;
DrawString(200,340,"returnキーを押してください",White);
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
if(count>255 || count<0) flag*=-1; //count上昇モード下降モード分岐
if(flag==-1) count+=2; //インクリメント
if(flag== 1) count-=2; //デクリメント
if(Key[KEY_INPUT_RETURN]==1)
function_status=1;
}
void Menu(){
char_disp(y); // 文字を描画
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y+=20;
if(y==360) // y座標(選択が一番下なら)
y=300; // 選択座標を一番上に
}
if(Key[KEY_INPUT_RETURN]==1&&y==300)
function_status=2;
else if(Key[KEY_INPUT_RETURN]==1&&y==340)
function_status=5;
}
void opening(){
int f=0,flag2=0,j,ch_f=0,counter=0;
char disp[82]="",ch[4][82]={
"あああああああああああああああああああ",
"ああああああえええええええぇぇぇぇぇぇっぇ!?",
"うううううううううううううう",
"何が起こったかはよくわからないがとりあえず動いてみるか"
};
while(flag2=0){
for(j=0;j<256;j++){
if(oldKey[j]==0 && Key[j]==1)
Key[j]=2;
oldKey[j]=Key[j];
}
if(Key[KEY_INPUT_RETURN]==2){ // 前回押されてなくて、今回押されていたら
f=0; // iを初期値に戻し
ch_f++; // 表示する配列を1つずらす
if(ch_f==4)
flag2=1; // これ以上表示する配列がなくなったらbreak;
break;
}
if(f<=82-2 && ch[ch_f][f]!='\0' && counter%4==0){
f+=2; // 全角文字なので配列要素2つずつカウントアップ
strncpy(disp,ch[ch_f],f);// iバイトまでの配列要素をdisp配列にコピー
disp[f]='\0'; }
DrawFormatString(10,420,White,"%s",disp);
counter++;}
if(flag2==1)
function_status=3;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
black = GetColor( 0 , 0 , 0 ) ; //色の取得
White=GetColor(255,255,255);
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
// すべてのキーの状態を得る
switch(function_status){
case 0:
start();
break;
case 1:
Menu();
break;
case 2:
opening();
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}
if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了
ScreenFlip() ; // 裏画面データを表画面へ反映
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
このプログラムのopening関数の文章が表示されません
いろいろ試してみましたがだめでした
どうしてでしょうか?
ヒントだけでも教えてください
文章下手ですいません
int function_status=0,black,White,count=0,flag=-1, y=300;
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;
}
return 0;
}
int Key[256],oldKey[256]={};
void char_disp(int y){
LoadGraphScreen(0,0,"haikei.jpg",FALSE);
LoadGraphScreen( 240 , y , "yazirusi.jpg" , TRUE );
LoadGraphScreen( 260, 300 , "newgame.jpg" , TRUE );
LoadGraphScreen( 260 , 320 , "continue.jpg" , TRUE );
LoadGraphScreen( 260 , 340 , "end.jpg" , TRUE );
}
void start(){
SetDrawBlendMode( DX_BLENDMODE_ALPHA , count ) ;
DrawString(200,340,"returnキーを押してください",White);
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
if(count>255 || count<0) flag*=-1; //count上昇モード下降モード分岐
if(flag==-1) count+=2; //インクリメント
if(flag== 1) count-=2; //デクリメント
if(Key[KEY_INPUT_RETURN]==1)
function_status=1;
}
void Menu(){
char_disp(y); // 文字を描画
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y+=20;
if(y==360) // y座標(選択が一番下なら)
y=300; // 選択座標を一番上に
}
if(Key[KEY_INPUT_RETURN]==1&&y==300)
function_status=2;
else if(Key[KEY_INPUT_RETURN]==1&&y==340)
function_status=5;
}
void opening(){
int f=0,flag2=0,j,ch_f=0,counter=0;
char disp[82]="",ch[4][82]={
"あああああああああああああああああああ",
"ああああああえええええええぇぇぇぇぇぇっぇ!?",
"うううううううううううううう",
"何が起こったかはよくわからないがとりあえず動いてみるか"
};
while(flag2=0){
for(j=0;j<256;j++){
if(oldKey[j]==0 && Key[j]==1)
Key[j]=2;
oldKey[j]=Key[j];
}
if(Key[KEY_INPUT_RETURN]==2){ // 前回押されてなくて、今回押されていたら
f=0; // iを初期値に戻し
ch_f++; // 表示する配列を1つずらす
if(ch_f==4)
flag2=1; // これ以上表示する配列がなくなったらbreak;
break;
}
if(f<=82-2 && ch[ch_f][f]!='\0' && counter%4==0){
f+=2; // 全角文字なので配列要素2つずつカウントアップ
strncpy(disp,ch[ch_f],f);// iバイトまでの配列要素をdisp配列にコピー
disp[f]='\0'; }
DrawFormatString(10,420,White,"%s",disp);
counter++;}
if(flag2==1)
function_status=3;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
black = GetColor( 0 , 0 , 0 ) ; //色の取得
White=GetColor(255,255,255);
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
// すべてのキーの状態を得る
switch(function_status){
case 0:
start();
break;
case 1:
Menu();
break;
case 2:
opening();
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}
if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了
ScreenFlip() ; // 裏画面データを表画面へ反映
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
このプログラムのopening関数の文章が表示されません
いろいろ試してみましたがだめでした
どうしてでしょうか?
ヒントだけでも教えてください
文章下手ですいません
Re:文章が表示されません
while(flug2=0)を
while(flug2==0)に変えてみてください。
このままだとwhileの中には絶対入りません。
初心者がよくやるミスです。
while(flug2==0)に変えてみてください。
このままだとwhileの中には絶対入りません。
初心者がよくやるミスです。
Re:文章が表示されません
みけCATさん
static変数にしてwhileの条件式を書き直してビルドしてみたらopening関数の処理に差し掛かったところでフリーズしてしまいました(>_<)
ほかにおかしいところがあるのでしょうか?
static変数にしてwhileの条件式を書き直してビルドしてみたらopening関数の処理に差し掛かったところでフリーズしてしまいました(>_<)
ほかにおかしいところがあるのでしょうか?
Re:文章が表示されません
if(ch_f==4) flag2=1; // これ以上表示する配列がなくなったらbreak; break; } if(f<=82-2 && ch[ch_f][f]!='\0' && counter%4==0){ f+=2; // 全角文字なので配列要素2つずつカウントアップ strncpy(disp,ch[ch_f],f);// iバイトまでの配列要素をdisp配列にコピーコードを全部見たわけではないですが、
4という、配列の定義範囲外の値を持っている状態で
ch[ch_f][f]
や
ch[ch_f]
にアクセスするのは大いにまずいような気がしますね。
Re:文章が表示されません
みけcatさん boxさん
回答ありがとうございます
while文をなくすことはできたのですがboxさんの言っていることがいまいち理解できません
もう少しヒントをいただけないでしょうか?
お願いします(>_<)
回答ありがとうございます
while文をなくすことはできたのですがboxさんの言っていることがいまいち理解できません
もう少しヒントをいただけないでしょうか?
お願いします(>_<)
Re:文章が表示されません
if(ch_f==4)
を
if(ch_f>=4)
にしたほうが安全だと思います。
もっと言うなら
if(ch_f>=4 || ch_f<0)
でしょうか。
を
if(ch_f>=4)
にしたほうが安全だと思います。
もっと言うなら
if(ch_f>=4 || ch_f<0)
でしょうか。
Re:文章が表示されません
こんな感じでどうでしょうか。
>boxさんの言っていることがいまいち理解できません
boxさんには悪いですが、
>boxさんの言っていることがいまいち理解できません
boxさんには悪いですが、
if(ch_f>=4 || ch_f<0){function_status=3;return;}の時点でこの関数を抜けるので、関係ないのではないかと思います。
Re:文章が表示されません
もっと言うと、このままではもう一度function_status=2になって
opening()関数が呼び出されたときには文章が表示されないと思います。
というわけで改良してみました。
opening()関数が呼び出されたときには文章が表示されないと思います。
というわけで改良してみました。
Re:文章が表示されません
> の時点でこの関数を抜けるので、関係ないのではないかと思います。
それは、あなたが後から手を加えられた部分の話ですよね。
私がコメントした、質問者さんのオリジナルなコードには、その部分はなかったのですよ。
おわかりでしょうか?

それは、あなたが後から手を加えられた部分の話ですよね。
私がコメントした、質問者さんのオリジナルなコードには、その部分はなかったのですよ。
おわかりでしょうか?

Re:文章が表示されません
>私がコメントした、質問者さんのオリジナルなコードには、その部分はなかったのですよ。
と思いましたが、勘違いかもしれません。
すみませんでした。
if(ch_f==4) flag2=1; // これ以上表示する配列がなくなったらbreak; break;の部分がそれに相当するかと思います。
と思いましたが、勘違いかもしれません。
すみませんでした。
宣言に型が多すぎる
以下のようなコードを書いたのですが
-------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <windows.h>
struct student{
char name;
int desire1;
int desire2;
int desire3;
int class;
int rank;
int group;
} ;
int ReadData(struct student st[/url],int count){
FILE* fp;
int i;
fp = fopen( "test.csv", "r" );
if( fp == NULL )return FALSE;
for(i=0;i<count+1;i++){
//参照渡し
fscanf( fp, "%s,%d,%d,%d,%d,%d,%d", &st.name, &st.desire1,&st.desire2,&st.desire3,&st.class,&st.rank,&st.group);
printf( fp, "%s,%d,%d,%d,%d,%d,%d", &st.name, &st.desire1,&st.desire2,&st[i].desire3,&st[i].class,&st[i].rank,&st[i].group);
}
fclose(fp);
}
int main(void){
struct student st[100];
ReadData(st,24);
return 0;
}
-------------------------------------------------------------
以下のようなエラーが出てしまいました。
今後のこともあるので、構造体の形をかるわけにはいかないのですが、
どのように修正すればいいのでしょうか?
WinVista32Bit,Borland C++ Compilerで行ないました。
-------------------------------------------------------------
エラー E2176 class.cpp 10: 宣言に型が多すぎる
エラー E2275 class.cpp 10: { が必要
エラー E2321 class.cpp 10: 宣言でタグあるいは識別子が指定されていない
エラー E2280 class.cpp 41: メンバー識別子が必要(関数 ReadData(student *,int)
)
エラー E2280 class.cpp 42: メンバー識別子が必要(関数 ReadData(student *,int)
)
-------------------------------------------------------------
-------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <windows.h>
struct student{
char name;
int desire1;
int desire2;
int desire3;
int class;
int rank;
int group;
} ;
int ReadData(struct student st[/url],int count){
FILE* fp;
int i;
fp = fopen( "test.csv", "r" );
if( fp == NULL )return FALSE;
for(i=0;i<count+1;i++){
//参照渡し
fscanf( fp, "%s,%d,%d,%d,%d,%d,%d", &st.name, &st.desire1,&st.desire2,&st.desire3,&st.class,&st.rank,&st.group);
printf( fp, "%s,%d,%d,%d,%d,%d,%d", &st.name, &st.desire1,&st.desire2,&st[i].desire3,&st[i].class,&st[i].rank,&st[i].group);
}
fclose(fp);
}
int main(void){
struct student st[100];
ReadData(st,24);
return 0;
}
-------------------------------------------------------------
以下のようなエラーが出てしまいました。
今後のこともあるので、構造体の形をかるわけにはいかないのですが、
どのように修正すればいいのでしょうか?
WinVista32Bit,Borland C++ Compilerで行ないました。
-------------------------------------------------------------
エラー E2176 class.cpp 10: 宣言に型が多すぎる
エラー E2275 class.cpp 10: { が必要
エラー E2321 class.cpp 10: 宣言でタグあるいは識別子が指定されていない
エラー E2280 class.cpp 41: メンバー識別子が必要(関数 ReadData(student *,int)
)
エラー E2280 class.cpp 42: メンバー識別子が必要(関数 ReadData(student *,int)
)
-------------------------------------------------------------
