恐らくfscanf_s()で何らかの不具合が生じた

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

恐らくfscanf_s()で何らかの不具合が生じた

#1

投稿記事 by 残念 » 4年前

こんばんは、残念と申します。
以下のようなコードを実行させたところ(本題に不要な部分もありますが、全て載せます)
source.cpp

コード:

 #include "DxLib.h"
#include "Ztaizen.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{

	//宣言
	int MouseX, MouseY;
	int handle[4] = {
		MakeScreen(1920, 1080, FALSE),
		MakeScreen(1920, 1080, FALSE),
		MakeScreen(1920, 1080, FALSE),
		MakeScreen(1920, 1080, FALSE) };

	int window = 0;
	int mode[4] = { 0, 0, 0, 0 };
	int cr = GetColor(255, 255, 255);





	if (DxLib_Init() == -1)        // DXライブラリ初期化処理
	{
		return -1;        // エラーが起きたら直ちに終了
	}


	//設定
	SetGraphMode(1920, 1080, 32);
	ChangeWindowMode(TRUE);
	SetWindowSizeChangeEnableFlag(TRUE);
	window = 0;
	SetDrawScreen(DX_SCREEN_BACK);
	SetMouseDispFlag(TRUE);




	//実行
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 && gpUpdateKey() == 0){
		KeyToWM(&window,mode);
		ClearDrawScreen();
		GetMousePoint(&MouseX, &MouseY);
		windomode(window, mode[window], handle);
		DrawFormatString(0, 0, cr, "0,%d,%d", window, mode[window]);
		DrawGraph(0, 0, handle[window], TRUE);
		ScreenFlip();
		WaitTimer(20);





	}
	for (int i = 0; i < 3; i++)
	{
		DeleteSoftImage(handle[i]);
	}
	DxLib_End();            // DXライブラリ使用の終了処理

	return 0;

}

Ztaizen.h

コード:

 void windomode(int w, int m,int handle[4]);
static unsigned int Key[256];
extern int gpUpdateKey();
void KeyToWM(int* a,int b[4]);
int firstload(); 
Ztaizen.cpp

コード:

 と#include "DxLib.h"
#include"Ztaizen.h"
#include <share.h>

unsigned int Cr = GetColor(120, 0, 255);

int firstload(){
	int clr = GetColor(0, 100, 20);
	char name[] = "load1.txt";
	char ch[20];
	int i;
	FILE *fp ;
	
	if ((fp = _fsopen(name, "r", _SH_DENYNO)) == NULL)
	{
		DrawString(0,0, "ファイルのオープンに失敗 ", clr);
		fp = _fsopen(name, "w", _SH_DENYNO);
		fprintf(fp, "damedesita");
	}
	//DrawFormatString(60, 50, (GetColor(100, 100, 100)), "egw");
	while (fscanf_s(fp, "%d,%s", &i, ch) != EOF){
		DrawFormatString(0,0, clr,"%d:%s", &i,ch);
		//DrawFormatString(60,60, (GetColor(100, 100, 100)), "4rea");
	}
	fclose(fp);
	return 0;
}






void window0(int handle[4])
{
	int p;
	if (p = !0){ 
		p = firstload(); 
	}
	SetDrawScreen(handle[0]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);
	DrawFormatString(50,50, (GetColor(100,100,100)), "%d",p);
}
	
void window11(int handle[4])
{
	SetDrawScreen(handle[1]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);

}
void window12(int handle[4])//パーツ配置
{	SetDrawScreen(handle[1]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);



}
void window13(int handle[4])
{	SetDrawScreen(handle[1]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);

}
void window14(int handle[4])
{	SetDrawScreen(handle[1]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);

}
void window21(int handle[4]){
	SetDrawScreen(handle[2]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window22(int handle[4]){
	SetDrawScreen(handle[2]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window23(int handle[4]){
	SetDrawScreen(handle[2]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window24(int handle[4]){
	SetDrawScreen(handle[2]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window31(int handle[4]){
	SetDrawScreen(handle[3]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window32(int handle[4]){
	SetDrawScreen(handle[3]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window33(int handle[4]){
	SetDrawScreen(handle[3]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window34(int handle[4]){
	SetDrawScreen(handle[3]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
}

void(*windows[][4])(int handle[4]) =
{
	{ window0, window0, window0, window0 },
	{window11, window12, window13, window14 },
	{ window21, window22, window23, window24 },
	{ window31, window32, window33, window34 }
};
void windomode(int w, int m, int handle[4])
{
	windows[w][m](handle);	
}

int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
	for (int i = 0; i<256; i++){
		if (tmpKey[i] != 0){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		}
		else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}



void KeyToWM(int* a, int b[4]){
	if (Key[KEY_INPUT_F1] == 1){

		*a = 1;
	}
	if (Key[KEY_INPUT_F2] == 1){

		*a = 2;
	}
	if (Key[KEY_INPUT_F3] == 1){

		*a = 3;
	}
	if (Key[KEY_INPUT_BACK] == 1){

		*a = 0;
	}
	if (Key[KEY_INPUT_LSHIFT] == 1){

		if (b[*a]<3){

			b[*a] = b[*a] + 1;
		}
		else
		{
			b[*a] = 0;
		}
	}
}
一応起動はした(エラーは出なかった)ものの、フリーズしてしまいました。
解決策があれば、教えてくださるとありがたいです。
最後に編集したユーザー 残念 on 2015年7月18日(土) 21:03 [ 編集 1 回目 ]

アバター
Tatu
記事: 440
登録日時: 8年前
住所: 北海道

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#2

投稿記事 by Tatu » 4年前

fscanfは代入された数を返します。

解決した時は「<解決しました>元のトピック名」とトピック名を編集するのではなく、
投稿時に送信ボタンの隣の解決にチェックを入れてください。
最後に編集したユーザー Tatu on 2015年7月18日(土) 22:10 [ 編集 1 回目 ]

アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#3

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

残念 さんが書きました:

コード:

	if ((fp = _fsopen(name, "r", _SH_DENYNO)) == NULL)
	{
		DrawString(0,0, "ファイルのオープンに失敗 ", clr);
		fp = _fsopen(name, "w", _SH_DENYNO);
		fprintf(fp, "damedesita");
	}
読み込みで開けなかったファイルを書き込みで開こうとして、しかも開けたかどうかチェックしていないですが、大丈夫ですか?
残念 さんが書きました:

コード:

	while (fscanf_s(fp, "%d,%s", &i, ch) != EOF){
		DrawFormatString(0,0, clr,"%d:%s", &i,ch);
		//DrawFormatString(60,60, (GetColor(100, 100, 100)), "4rea");
	}
読み込もうとしているファイルの内容は正しいですか?
残念 さんが書きました:

コード:

	int p;
	if (p = !0){ 
		p = firstload(); 
	}
このif文は意味がなく、毎回firstloadを呼び出すことになります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#4

投稿記事 by 残念 » 4年前

Tatuさん、ご指摘有難うございます。
実は、解決の表示の仕方も自分の過去のトピックへのアクセス方法も知らないというどうしようもない奴だったのですが、
おかげさまで解決の表示の仕方が分かりました。本当に有難うございます!
あと、fscanfは代入された数を返すために不具合があったのも理解できました。
が、如何せん私の頭は悪く解決策がまだ見つからない状態にあるため、「テキストファイルの読み込みがうまくいかない」と題を正し、
随時解決策を募集しつつ、自分でも考えてみます。
有難うございました。

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#5

投稿記事 by 残念 » 4年前

みけCATさん、ご指摘有難うございます。(この前もご指摘をしてくださり、ありがとうございました)
まず、「読み込みで開けなかったファイルを書き込みで開こうとして、しかも開けたかどうかチェックしていない」ことについてなんですが、
私は「ファイルを読み込みで開けなかった」は「ファイルがない」ということである、だからファイルを新規作成して書き込めばいい、という風に考えたのですが…。(「damedesita」ではなく、
他の言葉にしてから再度読み込ませる予定でした。)この考えはどういう風に問題がありますかね?(指摘してくださると助かります。)

あと、firstloadは文字を読み込む部分だけにし、while文の前に用意、そして表示させるのはまた別のところでしようと思います。
ファイルの内容は正しい、かについてですが、間違っていました(どうしようもありませんね言われて気づいたとか恥ずかしくていえない)。
ご指摘有難うございました。修正します。
もし、こちらで解決できたら、報告いたします。

アバター
Tatu
記事: 440
登録日時: 8年前
住所: 北海道

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#6

投稿記事 by Tatu » 4年前

fscanf_sについて載っている
https://msdn.microsoft.com/ja-jp/library/6ybhk9kc.aspx
を見てみたところ、

>これらの関数は、正常に変換および代入されたフィールドの数を返します。
>読み込まれただけで代入されなかったフィールドは戻り値には含まれません。
>戻り値が 0 の場合は、代入されたフィールドがなかったことを示します。
>エラーが発生した場合や、最初の変換の前にファイル ストリームの終端を検出した場合、
>fscanf_s および fwscanf_s は EOF を返します。

とあるのでfscanf_sの戻り値をEOFと比較して繰り返すのは合っているようです。

さらに見ていくと

> セキュリティが強化された関数 (_s サフィックス付き) とその他のバージョンの関数との主な違いは、
>セキュリティが強化された関数では、c、C、s、S、および [ の各型フィールドを使用するとき、
>引数として、それぞれの変数の直後にフィールドのサイズを渡す必要がある点です。
> 詳細については、「scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l」および「scanf 関数の文字幅指定」を参照してください。

とありました。

アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#7

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

残念 さんが書きました:まず、「読み込みで開けなかったファイルを書き込みで開こうとして、しかも開けたかどうかチェックしていない」ことについてなんですが、
私は「ファイルを読み込みで開けなかった」は「ファイルがない」ということである、だからファイルを新規作成して書き込めばいい、という風に考えたのですが…。(「damedesita」ではなく、
他の言葉にしてから再度読み込ませる予定でした。)この考えはどういう風に問題がありますかね?(指摘してくださると助かります。)
「ファイルが存在するけど権限が無い場合」などが考えられていない、という問題がありますが、読み込みで開けなかったら新規作成しようとすること自体は問題ないと思います。
ただい、読み取り専用フォルダなどで書き込みができない場合も考えられるので、書き込みのためのオープンもエラーチェックを行ってください。

【追記】書き込みモードでオープンしたファイル(ポインタ)に対しfscanf_sを使用するのは不自然であり、やめたほうがいいかもしれません。
最後に編集したユーザー みけCAT on 2015年7月18日(土) 22:21 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#8

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

Tatu さんが書きました:fscanf_sについて載っている
https://msdn.microsoft.com/ja-jp/library/6ybhk9kc.aspx
を見てみたところ、

>これらの関数は、正常に変換および代入されたフィールドの数を返します。
>読み込まれただけで代入されなかったフィールドは戻り値には含まれません。
>戻り値が 0 の場合は、代入されたフィールドがなかったことを示します。
>エラーが発生した場合や、最初の変換の前にファイル ストリームの終端を検出した場合、
>fscanf_s および fwscanf_s は EOF を返します。

とあるのでfscanf_sの戻り値をEOFと比較して繰り返すのは合っているようです。
EOFと比較すると、例えば

コード:

sibou,410
という文字列を読み込もうとした時に、"%d,%s"という書式を与えられたfscanfは0を返し、これはEOFではないのでループが続行されます。
次の呼び出しでも同じ場所を読み込もうとし、同じように0を返します。よって無限ループになります。
したがって、EOFと比較するのではなく、読み込もうとする件数(今回は2)と比較するのがいいでしょう。
また、読み込もうとする件数が帰ってきた場合、EOFが帰ってきた場合、それ以外(エラー)に分けてエラーチェックをすると、より安全になると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#9

投稿記事 by 残念 » 4年前

Tatuさん、わざわざリンクまで張っていただき有難うございます!
フィールドのサイズを渡す必要がある、ですか。そこらへんがこのド素人にはさっぱりアレですので、
じっくり調べようかと思います。
今晩は時間の都合でこれ以上返信はできませんが、また時間があるときに随時報告していきます。
有難うございました!

アバター
Tatu
記事: 440
登録日時: 8年前
住所: 北海道

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#10

投稿記事 by Tatu » 4年前

>>みけCATさん

コード:

#include <stdio.h>
#include <stdlib.h>

int main(void){
	char text[100];
	FILE *fp=fopen("test.txt","r");
	if(fp!=NULL){
		while(fscanf_s(fp,"%s",text,_countof(text))!=EOF){
			printf(text);
		}
		fclose(fp);
	}
	return 0;
}
を実行してファイルの改行以外の内容を表示していたので大丈夫だと思っていましたが

書式によってはうまくいかないことがあるのですね。

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#11

投稿記事 by 残念 » 4年前

(少し時間が空いたので)
みけCATさん、分かりやすい解説有難うございます!
ファイルの読み込み、書き込みに関することが完全にで、ではありませんが理解の方向へ一歩進めました。
のですが…すいません。いくつかお尋ねしたいことが。

・フィールドってなんでしょう?
(こちらで調べた際、「クラス内に作った変数」とありました。
これが、正しいとき、
「変数はクラス内で作られていない(そもそもクラスをつくってない)ため、フィールドの数が0、よって返り値が0」 か、
「読み込まれただけで代入されなかったから返り値が0」だと考えたのですが、どちらが正解か、そもそもどちらも間違ってる可能性があるので、このような質問をしました)

あと、
・読み込もうとする件数と比較するのはどのようにすれば宜しいのでしょうか?

・fscanf_sの返り値がEOFになるのはどのような時でしょうか?

大変お手数おかけしますが、教えてくださるととてもありがたいです。

アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#12

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

残念 さんが書きました:・フィールドってなんでしょう?
scanf系関数で読み込むそれぞれの「データ」のことだと思います。
残念 さんが書きました:・読み込もうとする件数と比較するのはどのようにすれば宜しいのでしょうか?
読み込み用の書式指定を数える関数を書いてもいいですが、めんどくさいので素直に書式指定文字列と件数をハードコーディングして

コード:

while (fscanf_s(fp, "%d,%s", &i, ch) == 2){
のようにすればいいでしょう。
残念 さんが書きました:・fscanf_sの返り値がEOFになるのはどのような時でしょうか?
fscanf_s、_fscanf_s_l、fwscanf_s、_fwscanf_s_l
エラーが発生した場合や、最初の変換の前にファイル ストリームの終端を検出した場合、fscanf_s および fwscanf_s は EOF を返します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#13

投稿記事 by 残念 » 4年前

あれから自分なりに直そうとしてみたのですが…
以下のコードを書いたところ
source.cpp

コード:

 #include "DxLib.h"
#include "Ztaizen.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{

	//宣言
	int MouseX, MouseY;
	int handle[4] = {
		MakeScreen(1920, 1080, FALSE),
		MakeScreen(1920, 1080, FALSE),
		MakeScreen(1920, 1080, FALSE),
		MakeScreen(1920, 1080, FALSE) };

	int window = 0;
	int mode[4] = { 0, 0, 0, 0 };
	int cr = GetColor(255, 255, 255);
	char tktk[50][20],tkts[20][15];
	




	if (DxLib_Init() == -1)        // DXライブラリ初期化処理
	{
		return -1;        // エラーが起きたら直ちに終了
	}


	//設定
	SetGraphMode(1920, 1080, 32);
	ChangeWindowMode(TRUE);
	SetWindowSizeChangeEnableFlag(TRUE);
	window = 0;
	SetDrawScreen(DX_SCREEN_BACK);
	SetMouseDispFlag(TRUE);
	firstload(tktk,tkts);
	


	//実行
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 && gpUpdateKey() == 0){
		KeyToWM(&window,mode);
		ClearDrawScreen();
		GetMousePoint(&MouseX, &MouseY);
		
		
		if (window==0)
		{
			window0(handle,tktk,tkts);
		}
		else{
		windomode(window, mode[window], handle);
		}
		
		DrawFormatString(0, 0, cr, "0,%d,%d", window, mode[window]);
		







		DrawGraph(0, 0, handle[window], TRUE);
		ScreenFlip();
		WaitTimer(20);





	}
	for (int i = 0; i < 3; i++)
	{
		DeleteSoftImage(handle[i]);
	}
	DxLib_End();            // DXライブラリ使用の終了処理

	return 0;

}

 
Ztaizen.h

コード:

 void firstload(char a[50][20],char b[20][15]);
void windomode(int w, int m,int handle[4]);
void window0(int handle[4],char k[50][20],char s[20][15]);
static unsigned int Key[256];
extern int gpUpdateKey();
void KeyToWM(int *a,int b[4]);
 
Ztaizen.cpp

コード:

 #include "DxLib.h"
#include"Ztaizen.h"
#include"Share.h"

unsigned int Cr = GetColor(120, 0, 255);

void firstload(char *a[50][20], char *b[20][15]){
	int clr = GetColor(99, 100, 20);
	char load[][10] = { "loadk.txt", "loads.txt" };

	FILE *fp;

	int i, j = 0;
	for (i = 0; i < 3; i++)
	{
		int m;
		if (i == 1){
			if ((fp = _fsopen(load[i], "r", _SH_DENYNO)) == NULL)
			{

				if ((fp = _fsopen(load[i], "w", _SH_DENYNO)) == NULL){


					for (m = 0; m < 50; m++){
						a[m][20] = { "失敗" };
						fprintf(fp, "%s\n", a[m][20]);

					}
					fp = _fsopen(load[i], "r", _SH_DENYNO);
				}


				while (fscanf_s(fp, "%s", a[j][20]) == 1){

					j++;
				}
				j = 0;

			}
		}

			if (i == 2){
				if ((fp = _fsopen(load[i], "r", _SH_DENYNO)) == NULL)
				{

					if ((fp = _fsopen(load[i], "w", _SH_DENYNO)) == NULL){


						for (m = 0; m < 20; m++){
							b[m][15] = { "失敗" };
							fprintf(fp, "%s\n", b[m][15]);

						}
						fp = _fsopen(load[i], "r", _SH_DENYNO);
					}


					while (fscanf_s(fp, "%s", a[j][15]) == 1){

						j++;
					}
					j = 0;

				}
			}
				fclose(fp);


			}



		}






void window0(int handle[4], char k[50][20], char s[20][15])
{	SetDrawScreen(handle[0]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);
	for (int i = 0;  i< 50; i++)
	{
		DrawFormatString(520, 20+5*i, (GetColor(100, 100, 100)), "i:%s",k[i][20]);
	}
	for (int j = 0; j< 20; j++)
	{
		DrawFormatString(920, 20 + 5 * j, (GetColor(100, 100, 100)), "j:%s", s[j][15]);
	}
}
	
void window11(int handle[4])
{
	SetDrawScreen(handle[1]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);

}
void window12(int handle[4])
{	SetDrawScreen(handle[1]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);



}
void window13(int handle[4])
{	SetDrawScreen(handle[1]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);

}
void window14(int handle[4])
{	SetDrawScreen(handle[1]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 255, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
	DrawBox(265, 70, 510, 565, Cr, FALSE);
	DrawBox(265, 575, 510, 1070, Cr, FALSE);

}
void window21(int handle[4]){
	SetDrawScreen(handle[2]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window22(int handle[4]){
	SetDrawScreen(handle[2]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window23(int handle[4]){
	SetDrawScreen(handle[2]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window24(int handle[4]){
	SetDrawScreen(handle[2]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window31(int handle[4]){
	SetDrawScreen(handle[3]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window32(int handle[4]){
	SetDrawScreen(handle[3]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window33(int handle[4]){
	SetDrawScreen(handle[3]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);

}
void window34(int handle[4]){
	SetDrawScreen(handle[3]);
	DrawBox(10, 10, 510, 60, Cr, FALSE);
	DrawBox(10, 70, 510, 1070, Cr, FALSE);
	DrawBox(520, 10, 1900, 1070, Cr, FALSE);
}

void(*windows[][4])(int handle[4]) =
{   { window11, window12, window13, window14 },
	{window11, window12, window13, window14 },
	{ window21, window22, window23, window24 },
	{ window31, window32, window33, window34 }
};
void windomode(int w, int m, int handle[4])
{
	if (w == 0){
		windows[w][m](handle);
	
	}
	windows[w][m](handle);	
}

int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
	for (int i = 0; i<256; i++){
		if (tmpKey[i] != 0){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		}
		else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}



void KeyToWM(int* a, int b[4]){
	if (Key[KEY_INPUT_F1] == 1){

		*a = 1;
	}
	if (Key[KEY_INPUT_F2] == 1){

		*a = 2;
	}
	if (Key[KEY_INPUT_F3] == 1){

		*a = 3;
	}
	if (Key[KEY_INPUT_BACK] == 1){

		*a = 0;
	}
	if (Key[KEY_INPUT_LSHIFT] == 1){

		if (b[*a]<3){

			b[*a] = b[*a] + 1;
		}
		else
		{
			b[*a] = 0;
		}
	}
}

エラー 1 error LNK2019: 未解決の外部シンボル "void __cdecl firstload(char (* const)[20],char (* const)[15])" (?firstload@@YAXQAY0BE@DQAY0P@D@Z) が関数 _WinMain@16 で参照されました。

エラー 2 error LNK1120: 1 件の未解決の外部参照

と出てしまいして…。(いろいろ間違ってるんだろうなぁ…)
どうしたら直るでしょう?(とても漠然とした質問で申し訳ありません)

アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#14

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

残念 さんが書きました:Ztaizen.cpp

コード:

 #include "DxLib.h"
#include"Ztaizen.h"
#include"Share.h"

unsigned int Cr = GetColor(120, 0, 255);

void firstload(char *a[50][20], char *b[20][15]){
エラー 1 error LNK2019: 未解決の外部シンボル "void __cdecl firstload(char (* const)[20],char (* const)[15])" (?firstload@@YAXQAY0BE@DQAY0P@D@Z) が関数 _WinMain@16 で参照されました。

エラー 2 error LNK1120: 1 件の未解決の外部参照

と出てしまいして…。(いろいろ間違ってるんだろうなぁ…)
firstload関数の実体の引数の型についている*が蛇足なので消してください。
オフトピック
DxLib_Initの呼び出しの前にMakeScreenやGetColorを呼び出しているけど、大丈夫なのだろうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#15

投稿記事 by 残念 » 4年前

みけCATさん、早速有難うございます。
それだと、VC++上でfirstload関数内の

コード:

for (m = 0; m < 50; m++){
	a[m][20] = { "失敗" };
fprintf(fp, "%s\n", a[m][20]);
の"失敗"に「"const char *" の値を使用して型 "char" のエンティティを初期化することはできません」
と出るんです。

アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#16

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

残念 さんが書きました:それだと、VC++上でfirstload関数内の

コード:

for (m = 0; m < 50; m++){
	a[m][20] = { "失敗" };
fprintf(fp, "%s\n", a[m][20]);
の"失敗"に「"const char *" の値を使用して型 "char" のエンティティを初期化することはできません」
と出るんです。
確保された領域の外側にアクセスしようとしています。やめてください。

コード:

for (m = 0; m < 50; m++){
	const char *d = "失敗";
	for (size_t p = 0; p==0 || d[p - 1] != '\0'; p++) a[m][p] = d[p];
fprintf(fp, "%s\n", a[m]);
※コンパイル・テストしていません
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#17

投稿記事 by 残念 » 4年前

えっと…
Ztaizen.cpp

コード:

void firstload(char a[50][20], char b[20][15]){
	int clr = GetColor(99, 100, 20);
	char load[][10] = { "loadk.txt", "loads.txt" };
	
	FILE *fp;

	int i,p, j = 0;
	for (i = 0; i < 3; i++)
	{
		int m;
		if (i == 1){
			if ((fp = _fsopen(load[i], "r", _SH_DENYNO)) == NULL)
			{

				if ((fp = _fsopen(load[i], "w", _SH_DENYNO)) == NULL){


					for (m = 0; m < 50; m++){
						const char *d = "失敗";
						for ( p = 0; p == 0 || d[p - 1] != '\0'; p++){ a[m][p] = d[p]; }
						fprintf(fp, "%s\n", a[m]);

					}
					fp = _fsopen(load[i], "r", _SH_DENYNO);
				}


				while (fscanf_s(fp, "%s", a[j][20]) == 1){

					j++;
				}
				j = 0;

			}
		}

			if (i == 2){
				if ((fp = _fsopen(load[i], "r", _SH_DENYNO)) == NULL)
				{

					if ((fp = _fsopen(load[i], "w", _SH_DENYNO)) == NULL){
						for (m = 0; m < 20; m++){
							const char *d = "失敗";
							for (p = 0; p == 0 || d[p - 1] != '\0'; p++) b[m][p] = d[p];
							fprintf(fp, "%s\n", b[m]);
						}

						}
						fp = _fsopen(load[i], "r", _SH_DENYNO);
					}


					while (fscanf_s(fp, "%s", a[j][15]) == 1){

						j++;
					}
					j = 0;

				}
			
				fclose(fp);


			}



		}



こういうこと、ですかね…?
(アクセス違反が発生しました。、だそうなので何かこちらで変なことをやっている
可能性がありますが。)

アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#18

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

残念 さんが書きました:(アクセス違反が発生しました。、だそうなので何かこちらで変なことをやっている
可能性がありますが。)
・61行目で、i==0のときfcloseに不定の値が渡されるかもしれません。
・28行目で確保された領域の範囲外へのアクセスと、ポインタとして無効な値をポインタとして渡すことをしています。
・53行目でポインタとして無効な値(不定?)をポインタとして渡すことをしています。
・28行目および53行目において、fscanf_sにおいて必要な読み込み先の領域のサイズの指定がありません。 (参考:scanf_s() で文字列を入力)
何がしたいのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#19

投稿記事 by 残念 » 4年前

みけCATさん、指摘どころか参考のリンクまで貼っていただき、本当に有難うございます。
fscanf_s関数の使い方が明らかにおかしいことが分かりました。
きちんと使い方を学び(できるだけ)、明日にでも修正してみます。

ちなみに、自分ではSource.cppのchar tktk[50][20],tkts[20][15];にテキストドキュメントから読み込んだ文字列を1行ごとに入れていく予定でした。

たとえば、テキストドキュメントの中身が
1行目にJanuary、2行目にFebruaryと書かれていたら、

tktk[0][20]が「January」
tktk[1][20]が「February」
(すみません、多分 "tktk[0][20]が「January」"って書き方には問題があります)
となるようにしたかったのです。

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#20

投稿記事 by 残念 » 4年前

Tatu さん、みけCATさん、多分…これで一応やりたかったことができました。本当に有難うございました。
(ただ単にテキストを読み込み、表示させるものです)

コード:

#include<stdio.h>
#include<Share.h>


char tktk[50][20];
char tkts[20][15];

void firstload(char a[50][20], char b[20][15]);
int main(void){
	int i;
	

	firstload(tktk,tkts);
	for (i = 0; i < 50;  i++)
	{
		printf("%s\n", tktk[i]);
	}
	for (i = 0; i < 20; i++)
	{
		printf("%s\n", tkts[i]);
	}
	
	return 0;
}

void firstload(char a[50][20], char b[20][15]){

	char load[][10] = { "loadk.txt", "loads.txt" };

	FILE *fp;

	int i;
	for (i = 0; i < 2; i++)
	{

		if (i == 0){
			int m, p, j = 0;

			fp = _fsopen(load[i], "r", _SH_DENYNO);
			if (fp == NULL)
			{

				if ((fp = _fsopen(load[i], "w", _SH_DENYNO)) == NULL){

					for (m = 0; m < 50; m++){
						const char *d = "失敗";
						for (p = 0; d[p] != '\0'; p++){
							a[m][p] = d[p];

						}
					}
					fp = _fsopen(load[i], "r", _SH_DENYNO);
				}
			}
			else{
				while (fscanf_s(fp, "%s", a + j, 20) == 1){

					j++;
				}

				for (; j < 50; j++)
				{
					const char *tkt = "NO DATA";
					for (m = 0; tkt[m] != '\0'; m++)
					{
						a[j][m] = tkt[m];

					}
					for (; m < 20; m++)
					{
						a[j][m] = '\0';

					}
				}


				j = 0;
			}

		}


		if (i == 1){
			int m, p, j = 0;

			fp = _fsopen(load[i], "r", _SH_DENYNO);
			if (fp == NULL)
			{

				if ((fp = _fsopen(load[i], "w", _SH_DENYNO)) == NULL){


					for (m = 0; m < 50; m++){
						const char *d = "失敗";
						for (p = 0; d[p] != '\0'; p++){
							b[m][p] = d[p];

						}
					}
					fp = _fsopen(load[i], "r", _SH_DENYNO);
				}
			}
			else{
				while (fscanf_s(fp, "%s", b + j, 20) == 1){

					j++;
				}

				for (; j < 20; j++)
				{
					const char *tkt = "NO DATA";
					for (m = 0; tkt[m] != '\0'; m++)
					{
						b[j][m] = tkt[m];

					}
					for (; m < 15; m++)
					{
						b[j][m] = '\0';

					}
				}


				j = 0;
			}

		}
		fclose(fp);
	}




}


	

残念
記事: 36
登録日時: 4年前

Re: 恐らくfscanf_s()で何らかの不具合が生じた

#21

投稿記事 by 残念 » 4年前

Tatu さん、みけCATさん、多分…これで一応やりたかったことができました。本当に有難うございました。
(ただ単にテキストを読み込み、表示させるものです。元のだとわかりにくいので、主に変えた部分だけにしています)

コード:

#include<stdio.h>
#include<Share.h>


char tktk[50][20];
char tkts[20][15];

void firstload(char a[50][20], char b[20][15]);
int main(void){
	int i;
	

	firstload(tktk,tkts);
	for (i = 0; i < 50;  i++)
	{
		printf("%s\n", tktk[i]);
	}
	for (i = 0; i < 20; i++)
	{
		printf("%s\n", tkts[i]);
	}
	
	return 0;
}

void firstload(char a[50][20], char b[20][15]){

	char load[][10] = { "loadk.txt", "loads.txt" };

	FILE *fp;

	int i;
	for (i = 0; i < 2; i++)
	{

		if (i == 0){
			int m, p, j = 0;

			fp = _fsopen(load[i], "r", _SH_DENYNO);
			if (fp == NULL)
			{

				if ((fp = _fsopen(load[i], "w", _SH_DENYNO)) == NULL){

					for (m = 0; m < 50; m++){
						const char *d = "失敗";
						for (p = 0; d[p] != '\0'; p++){
							a[m][p] = d[p];

						}
					}
					fp = _fsopen(load[i], "r", _SH_DENYNO);
				}
			}
			else{
				while (fscanf_s(fp, "%s", a + j, 20) == 1){

					j++;
				}

				for (; j < 50; j++)
				{
					const char *tkt = "NO DATA";
					for (m = 0; tkt[m] != '\0'; m++)
					{
						a[j][m] = tkt[m];

					}
					for (; m < 20; m++)
					{
						a[j][m] = '\0';

					}
				}


				j = 0;
			}

		}


		if (i == 1){
			int m, p, j = 0;

			fp = _fsopen(load[i], "r", _SH_DENYNO);
			if (fp == NULL)
			{

				if ((fp = _fsopen(load[i], "w", _SH_DENYNO)) == NULL){


					for (m = 0; m < 50; m++){
						const char *d = "失敗";
						for (p = 0; d[p] != '\0'; p++){
							b[m][p] = d[p];

						}
					}
					fp = _fsopen(load[i], "r", _SH_DENYNO);
				}
			}
			else{
				while (fscanf_s(fp, "%s", b + j, 20) == 1){

					j++;
				}

				for (; j < 20; j++)
				{
					const char *tkt = "NO DATA";
					for (m = 0; tkt[m] != '\0'; m++)
					{
						b[j][m] = tkt[m];

					}
					for (; m < 15; m++)
					{
						b[j][m] = '\0';

					}
				}


				j = 0;
			}

		}
		fclose(fp);
	}




}


	

閉鎖

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