文章が表示されません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
超初心者

文章が表示されません

#1

投稿記事 by 超初心者 » 15年前

#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関数の文章が表示されません
いろいろ試してみましたがだめでした

どうしてでしょうか?
ヒントだけでも教えてください

文章下手ですいません

みけCAT

Re:文章が表示されません

#2

投稿記事 by みけCAT » 15年前

opening関数の最初の変数宣言で、
intの前にstaticを付けたらどうなりますか?

みけCAT

Re:文章が表示されません

#3

投稿記事 by みけCAT » 15年前

while(flug2=0)を
while(flug2==0)に変えてみてください。
このままだとwhileの中には絶対入りません。
初心者がよくやるミスです。

超初心者

Re:文章が表示されません

#4

投稿記事 by 超初心者 » 15年前

みけCATさん

static変数にしてwhileの条件式を書き直してビルドしてみたらopening関数の処理に差し掛かったところでフリーズしてしまいました(>_<)

ほかにおかしいところがあるのでしょうか?

box

Re:文章が表示されません

#5

投稿記事 by box » 15年前

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]
にアクセスするのは大いにまずいような気がしますね。

みけCAT

Re:文章が表示されません

#6

投稿記事 by みけCAT » 15年前

試していないのででたらめを言っていたらすいません。
そもそもwhile文は要らないのではないでしょうか?

みけCAT

Re:文章が表示されません

#7

投稿記事 by みけCAT » 15年前

break;のところを
{function_status=3;
return;}
にします。
whileブロックの下のコードはいりません。

超初心者

Re:文章が表示されません

#8

投稿記事 by 超初心者 » 15年前

みけcatさん boxさん
回答ありがとうございます
while文をなくすことはできたのですがboxさんの言っていることがいまいち理解できません
もう少しヒントをいただけないでしょうか?
お願いします(>_<)

みけCAT

Re:文章が表示されません

#9

投稿記事 by みけCAT » 15年前

if(ch_f==4)

if(ch_f>=4)
にしたほうが安全だと思います。
もっと言うなら
if(ch_f>=4 || ch_f<0)
でしょうか。

みけCAT

Re:文章が表示されません

#10

投稿記事 by みけCAT » 15年前

こんな感じでどうでしょうか。

>boxさんの言っていることがいまいち理解できません
boxさんには悪いですが、
if(ch_f>=4 || ch_f<0){function_status=3;return;}
の時点でこの関数を抜けるので、関係ないのではないかと思います。

みけCAT

Re:文章が表示されません

#11

投稿記事 by みけCAT » 15年前

もっと言うと、このままではもう一度function_status=2になって
opening()関数が呼び出されたときには文章が表示されないと思います。
というわけで改良してみました。

box

Re:文章が表示されません

#12

投稿記事 by box » 15年前

> の時点でこの関数を抜けるので、関係ないのではないかと思います。

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

画像

みけCAT

Re:文章が表示されません

#13

投稿記事 by みけCAT » 15年前

>私がコメントした、質問者さんのオリジナルなコードには、その部分はなかったのですよ。
if(ch_f==4)  
                         flag2=1;    // これ以上表示する配列がなくなったらbreak; 
                             break;
の部分がそれに相当するかと思います。

と思いましたが、勘違いかもしれません。
すみませんでした。

一般的な名前

Re:文章が表示されません

#14

投稿記事 by 一般的な名前 » 15年前

三毛猫さん
いつもお暇そうですね
ありがたや

超初心者

Re:文章が表示されません

#15

投稿記事 by 超初心者 » 15年前

解決しました\(^o^)/
boxさんとみけcatさんどちらともありがとうございましたm(_ _)m

超初心者

Re:文章が表示されません

#16

投稿記事 by 超初心者 » 15年前

解決にチェック入れるの忘れてました

shiro4ao

宣言に型が多すぎる

#17

投稿記事 by shiro4ao » 14年前

以下のようなコードを書いたのですが

-------------------------------------------------------------
#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)
)
------------------------------------------------------------- 画像

たかぎ

Re:宣言に型が多すぎる

#18

投稿記事 by たかぎ » 14年前

C++なら、classという名前は予約語です。

shiro4ao

Re:宣言に型が多すぎる

#19

投稿記事 by shiro4ao » 14年前

ありがとうございます!
いろいろ調べてわからなかったのですが、
意外なところでした…

なんとか、頑張ってみます。

閉鎖

“C言語何でも質問掲示板” へ戻る