アクセス違反

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
紫電
記事: 14
登録日時: 13年前

アクセス違反

#1

投稿記事 by 紫電 » 13年前

C言語のソースから全角空白を見つけ、半角にかえるというものを作ろうと思ったんですが、なぜかアクセス違反が出てしまいました。

コード:



#include <DxLib.h>
#include<windows.h>
#include <stdio.h>
#include <string.h>
#define WD 400

char *mituke;
char *test;

char Key[256];
int R = GetColor( 255, 0, 0 ); //赤
int W = GetColor( 255, 255, 255 );// 白
int B = GetColor( 0, 0, 255 );// 青
int y =0;

int kazu =0;
 

 
int hp=200 , hp_max=200;
int ey =20;
char filename[100];



char *text;




/* 置換する。 buf の中の mae を ato にする。成功=1 失敗=0 */
int strrep(char *buf, char *mae, char *ato)
{
char *mituke;
size_t maelen, atolen;
    
maelen = strlen(mae);
atolen = strlen(ato);
if (maelen == 0 || (mituke = strstr(buf, mae)) == NULL) return 0;
memmove(mituke + atolen, mituke + maelen, strlen(buf) - (mituke + maelen - buf ) + 1);
memcpy(mituke, ato, atolen);
return 1;
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) 
return -1; //初期化処理
SetMainWindowText("C支援ツール");
   int White = GetColor(255,255,255);
 while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
 
             
				 DrawFormatString( 0, 0, R, "<C言語のソースの全角空欄を半角にするおw>"); 
 DrawFormatString( 0, 50, R, "3病後に自動スタート☆"); 
                ScreenFlip() ;
				WaitTimer(3000);
				break;

				
 
        }
while(1)

 
{
	  


	

 

FILE *fil;

char *buf;
buf = test;
char *as = text;
fil = fopen("C:/test.txt","r");
fscanf(fil,"%d",&text);//正常終了時の書き込み内容
while(strrep(buf," "," ")); 
fil = fopen("C:/test.txt","w");

fprintf(fil,"%d",as);//正常終了時の書き込み内容

fclose(fil);

LoadGraphScreen(0,ey,"C:/test.txt",TRUE); 
int R = GetColor( 255, 0, 0 ); //赤
int W = GetColor( 255, 255, 255 );// 白
int B = GetColor( 0, 0, 255 );// 青

DrawFormatString( 240, y, R, "内容:%s", text);
WaitTimer(2000);
DrawString( 0 , y , filename , GetColor(0,255,0) );
if(kazu >= 10)
{
goto aa;
}
y = y +20;
ey = ey +20;
kazu ++;

WaitTimer(2000);
}




WaitKey();
aa:
sai:

 DxLib_End();// DXライブラリ使用の終了処理
     

return 0;
}


if (maelen == 0 || (mituke = strstr(buf, mae)) == NULL) return 0;の所です。

へにっくす

Re: アクセス違反

#2

投稿記事 by へにっくす » 13年前

えー
コードを載せるときは、せめてインデントをそろえてください。

Visual Studio を使用しているなら
コードを全部選択して編集メニュー→詳細→選択範囲のフォーマットでインデントをそろえてくれます。

さて質問ですが
なぜかアクセス違反が出てしまいました
と言いますが、なぜかじゃなくて当然ですね。

WinMainの中で
初期化もしていないグローバル変数char *testのポインタをbufに入れて、
それを引数にstrrep関数を呼んでいる。
strrep関数の中で、
bufを初めて参照する箇所が、貴方の掲示した箇所ですね。

そもそもファイルの内容を読んで、その内容の置換をしたいのでしょうが掲示したソースからは、全然関係ない変数bufを渡しています。ちゃんとC言語、理解してますか?
文字列として読み込むなら以下のような感じになるはずですが

コード:

char buf[256+1] = {0};
FILE *fil = NULL;
fil = fopen("c:\\test.txt", "r");
fgets(buf, 256, fp); // 一行読込(一行が256バイトを超えてたら256バイトまで)
strrep(buf, " ", " ");
fclose(fil); // 読込終わったら必ずfcloseを呼ぶ!!

他に突っ込みどころ。
  • パスに / を使ってますが、Windows系のOSで指定できましたっけ…
  • fopenの"r"で開いたまま同じパスで"w"で開いてますけど、fcloseしていないのでエラーになるんでは?
  • ファイルアクセスだけなら、DxLib使う必要ないのでは?
  • fscanfの使い方も間違っとる。%d の型は整数型です。

へにっくす

Re: アクセス違反

#3

投稿記事 by へにっくす » 13年前

へにっくす さんが書きました:そもそもファイルの内容を読んで、その内容の置換をしたいのでしょうが掲示したソースからは、全然関係ない変数bufを渡しています。ちゃんとC言語、理解してますか?
文字列として読み込むなら以下のような感じになるはずですが

コード:

char buf[256+1] = {0};
FILE *fil = NULL;
fil = fopen("c:\\test.txt", "r");
fgets(buf, 256, fp); // 一行読込(一行が256バイトを超えてたら256バイトまで)
strrep(buf, " ", " ");
fclose(fil); // 読込終わったら必ずfcloseを呼ぶ!!
すみません
fgetsの部分がおかしかったので修正 (^^;

コード:

char buf[256+1] = {0};
FILE *fil = NULL;
fil = fopen("c:\\test.txt", "r");
fgets(buf, 256, fil); // 一行読込(一行が256バイトを超えてたら256バイトまで)
strrep(buf, " ", " ");
fclose(fil); // 読込終わったら必ずfcloseを呼ぶ!!

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: アクセス違反

#4

投稿記事 by h2so5 » 13年前

へにっくす さんが書きました:
  • パスに / を使ってますが、Windows系のOSで指定できましたっけ…
Windowsでは / も \ も使えます。

box
記事: 2002
登録日時: 14年前

Re: アクセス違反

#5

投稿記事 by box » 13年前

まあ、よけいなお世話かもしれませんが…。

1)WindowsアプリやDxLibといった、「テキストファイルの全角空白を半角空白に変換する」という
   当初の目的とは無関係な要素を取り除く。
2)各変数の意味合い・使い道を書き出してみる。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

紫電
記事: 14
登録日時: 13年前

Re: アクセス違反

#6

投稿記事 by 紫電 » 13年前

strrep関数は僕が作ったものではなく、サイトを見てコピペしてきたものです。
その後は、自分で考えました。

あと、Dlibを使う理由はここでは必要ないと思われますが、これを前提にゲームを作っていきたいんです。
空白の
変換とかじゃなく、strrep関数での文字列の変換など。



あと、上のソースでビルドしたところ別のところでアクセス違反がでました。できれば描いたソース全部をのせていただけないでしょうか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: アクセス違反

#7

投稿記事 by softya(ソフト屋) » 13年前

そのエラーの出たコードをインデントを正しくした上で貼り付けてもらえますか?
みなさんのアドバイスがどのぐらい理解できているかもみてみたいので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

紫電
記事: 14
登録日時: 13年前

Re: アクセス違反

#8

投稿記事 by 紫電 » 13年前

ソースを改変したらちゃんと動作しました。
ありがとうございましたw

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: アクセス違反

#9

投稿記事 by softya(ソフト屋) » 13年前

紫電 さんが書きました:ソースを改変したらちゃんと動作しました。
ありがとうございましたw
改変したソースを貼ってくださいね(インデントも修正したほしいですね)。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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