どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#31

投稿記事 by 史上最悪のデスペナ » 13年前

頑張ってみたのですがやはり分かりません。(ver.梨樹さん)

梨樹さんのプログラムをフルコピペするとWin16がどうこうみたいなよく分からないエラーになるので
勝手にこちらでDxLibを用いる方法にしました。また、入力形式にするのは面倒だったのでプログラム内で
勝手に文字列を宣言しました

コード:

#include "DxLib.h"
#include <iostream>
#include <string>
#include <fstream>
 
 
void write( const char* str, float f )
{
    printf( "\n入力されたデータ\nstr:%s\nf  :%f\n", str, f );
 
    // ▼ ここから下に、str と f を保存するプログラムを書いてみてください。
    //    ※ C の標準関数のみ使い、fwrite は 1 度だけ使う事。

	BYTE *binBuff = new BYTE[1024]; //← 本当は書きこむデータサイズをちゃんと確認して確保すべきです。
 	
	size_t StrLen = strlen(str);
	size_t FSize = sizeof(f);

	//memmove( binBuff, str, StrLen );・・・・・・・・・・・a1
	//memmove( &binBuff[StrLen+1], &f, FSize );・・・a2


	FILE *sf;
	sf = fopen("data0.ESO","wb");
	//fwrite( binBuff, sizeof(binBuff), 1, sf);・・・・・・a3
	//fwrite(str,strlen(str),1,sf);・・・・・・・・・・・・・・・・・・b
	//fwrite(&f,sizeof(f),1,sf);・・・・・・・・・・・・・・・・・・・・c

	fclose(sf);
 
    // ▲ ここまで
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	std::string str;
	float f;
	str = "くぁwせdrftgyふじこlp";
	f=10.0f;
    write( str.c_str(), f );

	DxLib_End();
	return 0;

}
以上のような形にしました。
結果、
コメントのbを有効にすると上段
コメントのcを有効にすると中段
コメントのa系列を有効にすると下段
分かりません.png
分かりません.png (14.65 KiB) 閲覧数: 24586 回
となりました。aが間違っているんでしょうが、これ以上は分かりませんでした

また、a1とa3を有効にしても下段と同じになりました。
最後に編集したユーザー 史上最悪のデスペナ on 2012年1月07日(土) 19:10 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#32

投稿記事 by ISLe » 13年前

a3のsizeof(binBuff)はポインタのサイズですよ。

バッファすべて書き出すのか、最低限のサイズを書き出すのか、方針を決めましょう。

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#33

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

コード:

    memmove( binBuff, str, StrLen );・・・・・・・・・・・a1
    memmove( &binBuff[StrLen+1], &f, FSize );・・・a2
 
 
    FILE *sf;
    sf = fopen("data0.ESO","wb");
    fwrite( binBuff, sizeof(binBuff), 1, sf);・・・・・・a3
このプログラムの問題点は、
・文字列のサイズをファイルに書き込んでいないこと。
・文字列終端を表すナル文字が書き出されていない事。
・binBuffと言うのはポインタなのでポインタのサイズをfrwriteしていること。
ですね。ここをまず直してみてください。
出来れば書き出すファイルフォーマットを先に決めて欲しいところです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#34

投稿記事 by 史上最悪のデスペナ » 13年前

出来ました!!!

コード:

    // ▼ ここから下に、str と f を保存するプログラムを書いてみてください。
    //    ※ C の標準関数のみ使い、fwrite は 1 度だけ使う事。

	BYTE *binBuff = new BYTE[1024]; //← 本当は書きこむデータサイズをちゃんと確認して確保すべきです。
 	
	size_t StrLen = strlen(str);
	size_t FSize = sizeof(f);
	size_t Total = StrLen + FSize + 3;

	memmove( binBuff, &StrLen, 1);
	memmove( &binBuff[1], str, StrLen );
	memmove( &binBuff[StrLen+1], "\0", 2 );
	memmove( &binBuff[StrLen+3], &f, FSize );

	FILE *sf;
	sf = fopen("data0.ESO","wb");
	fwrite( binBuff, Total, 1, sf);

	fclose(sf);
 
	delete []binBuff;
    // ▲ ここまで

結果がこちらです
バグっているようです.png
バグっているようです.png (7.13 KiB) 閲覧数: 24576 回
データの最初の「1E」は10進数の「30」であり、(1Eを消してみて分かりましたが)後ろは「くぁwせdrft」が入っているので文字列を入れれたことが分かりますが、最後の4つ「00 00 20 41」は、「10.0f」のみを保存したとき(「00 00 20 41」)と同じなので大丈夫だということが分かります。
softya(ソフト屋) さんが書きました:とりあえずstringクラスというのは忘れてC言語的な文字列で扱ってみましょう。

softya(ソフト屋) さんが書きました:
【追記】
もしC++が使えない状況で、C言語で可変長(最大値不明)、可変個数(最大値不明)の文字列一覧を扱う場合はどの様なデータ構造を使い管理しますか?まず、そこから考えてみるってのはどうでしょう。これを応用してポインタをファイル相対値に書き換えてファイルに書きだせばバイナリファイルになります。


これをやって見ませんか?
今度はこれをやってみたいと思います

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#35

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

2つの値の扱いが変です。
memmove( binBuff, &StrLen, 1);
これはコピーするStrLenのサイズを調べずに1バイトと決めつけています。256文字を超えたらどうしますか?
あとリトルエンディンだからたまたま上手く動いているだけです。

こっちは、ナル文字のバイト数が変です。
memmove( &binBuff[StrLen+1], "\0", 2 );
マルチバイト文字であればナル文字は1バイトです。
それとstrバッファにナル文字も入っているので、そのまま使いましょう。

惜しいところまでは来てるんですよ。
もうちょっとです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#36

投稿記事 by 史上最悪のデスペナ » 13年前

そんな・・・・・・・・・・・orz
softya(ソフト屋) さんが書きました:memmove( binBuff, &StrLen, 1);
これはコピーするStrLenのサイズを調べずに1バイトと決めつけています。256文字を超えたらどうしますか?
ここは
memmove( binBuff, &StrLen, sizeof(StrLen) );
とすればいいですよね。まあ、その後のmemmoveもそれに合わせて
&binBuff[sizeof(StrLen)],&binBuff[StrLen+sizeof(StrLen)]・・・・・としないといけませんが。
softya(ソフト屋) さんが書きました:あとリトルエンディンだからたまたま上手く動いているだけです。
リトルエンディアンは後ろから順に入っていくということしか分からないので今はとりあえずパスします。させて下さい。
softya(ソフト屋) さんが書きました:マルチバイト文字であればナル文字は1バイトです。
¥0だから2文字だと思いました^^;

では、手直ししてきます。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#37

投稿記事 by 史上最悪のデスペナ » 13年前

コード:

	size_t StrLen = strlen(str);
	size_t LenSize = sizeof(StrLen);
	size_t FSize = sizeof(f);
	size_t Total = StrLen + FSize + LenSize+1;

	memmove( binBuff, &StrLen, LenSize);
	memmove( &binBuff[LenSize], str, StrLen+1 );
	memmove( &binBuff[StrLen+LenSize+1], &f, FSize );
バグっているようです.pngとほぼ同じですが、最初「1E」と「82」の間に「00 00 00」が入り、右側にちゃんと文字列の中身がフルで見えるようになりました。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#38

投稿記事 by beatle » 13年前

史上最悪のデスペナ さんが書きました:¥0だから2文字だと思いました^^;
エスケープシーケンスというものを勉強してください.

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#39

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

うまくいきましたね。これでOKです。
次に取り掛かってみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#40

投稿記事 by 史上最悪のデスペナ » 13年前

史上最悪のデスペナ さんが書きました: softya(ソフト屋) さんが書きました:
とりあえずstringクラスというのは忘れてC言語的な文字列で扱ってみましょう。

softya(ソフト屋) さんが書きました:
【追記】
もしC++が使えない状況で、C言語で可変長(最大値不明)、可変個数(最大値不明)の文字列一覧を扱う場合はどの様なデータ構造を使い管理しますか?まず、そこから考えてみるってのはどうでしょう。これを応用してポインタをファイル相対値に書き換えてファイルに書きだせばバイナリファイルになります。


これをやって見ませんか?
次はこれですね

C++とCの違いからまずは調べてきます。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#41

投稿記事 by 史上最悪のデスペナ » 13年前

可変個数(最大値不明)というのを満たしていませんが、

コード:

#include "DxLib.h"
#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <time.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	srand( time(NULL) );
	int count = rand()%4;
	int i;

	char *Str[5];
		Str[0] = "バイナリデータ作成練習";
		Str[1] = "Let's make MMORPG!";
		Str[2] = "そろそろネタがなくなってきたぞ";
		Str[3] = "あと二つ・・・・何を書こうか";
		Str[4] = "これで終わり";

	size_t StrLen[5];
	size_t LenSize[5];
		for( i=0 ; i<5 ; i++ )
		{
			StrLen[i] = strlen( Str[i] );
			LenSize[i] = sizeof( StrLen[i] );
		}
	size_t Total;

	// ▼ ここから下に、str と f を保存するプログラムを書いてみてください。
    //    ※ C の標準関数のみ使い、fwrite は 1 度だけ使う事。
	BYTE *binBuff = new BYTE[1024]; //← 本当は書きこむデータサイズをちゃんと確認して確保すべきです。
 	
	count++;
	memmove( binBuff, &count, sizeof(count) );

	Total = sizeof(count);
	for( i=0 ; i<count ; i++ )
	{
		memmove( &binBuff[Total], &StrLen[i], LenSize[i] );
		Total += LenSize[i];
	}

	for( i=0 ; i<count ; i++ )
	{
		memmove( &binBuff[Total], Str[i], StrLen[i]+1 );
		Total += StrLen[i]+1;
	}

	FILE *sf;
	sf = fopen("data0.ESO","wb");
		fwrite( binBuff, Total, 1, sf);
	fclose(sf);
 
	delete []binBuff;
    // ▲ ここまで

	DxLib_End();
	return 0;

}
としたところ
摩訶不思議.png
摩訶不思議.png (26.93 KiB) 閲覧数: 24556 回
となりました。
上下の違いは、バイナリデータ上のカーソル部です。(上は00あり、下は無し)

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#42

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

乱数で可変している意味があまり無いので5固定で良いと思います。
あとLenSize[]に入る値が全て固定なので、sizeof(size_t)で良いんじゃないでしょうか?
つまり、
memmove( &binBuff[Total], &StrLen, sizeof(size_t));
Total += sizeof(size_t);
の方がわかりやすいですし。

壊れているデータの方は原因がわかりません。
出力データを見るかぎり1バイト縮んだ事になりますがサイズ部分を見るかぎり同じデータなんですよね。これ再現性がありますか?
メモリ破壊要因がなくて時々データが破損すると言うことは、CPUかメモリが破損寸前ということも考えられます。
まぁ、普通パソコンが不安定になるはずなんですけどね。

で、少し問題があるかも知れないので読み込みを作ってみましょう。
私の趣味じゃないという所でもあるのですが。何処かは後で明かします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#43

投稿記事 by 史上最悪のデスペナ » 13年前

softya(ソフト屋) さんが書きました:壊れているデータの方は原因がわかりません。
出力データを見るかぎり1バイト縮んだ事になりますがサイズ部分を見るかぎり同じデータなんですよね。これ再現性がありますか?
ごめんなさい。書き忘れてました。
上のは出力されたデータそのまま、下はこちらが勝手に00を消したものです。

乱数取得なので毎回データは変わりますが、同じ4個の文字列が書き出されたときは同じ状況が起きました。(3回のみ確認)

読み込みですね。分かりました。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#44

投稿記事 by 史上最悪のデスペナ » 13年前

エラーの見方がわかりません。

コード:

#include "DxLib.h"
#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <time.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	DxLib_Init();

	FILE *lf;
	lf = fopen("data0.ESO","rb");

		char *NumStr = "";
			fgets( NumStr, sizeof(size_t), lf );

		int Num = atoi( NumStr);

		char *StrLen;
			StrLen = new char[Num];
				int i;
				for( i=0 ; i<=Num ; i++ )
				{
					fgets( &StrLen[i], sizeof(size_t), lf );
				}

		char *Str;
			Str = new char[Num];
				for( i=0 ; i<=Num ; i++ )
				{
					fgets( &Str[i], StrLen[i]+1, lf );
				}

		delete []StrLen;

	fclose(lf);

	for( i=0 ; i<=Num ; i++ )
	{
		DrawFormatString( 0, 10*Num, GetColor(255,255,255), "%s", &Str[i] );
	}

	delete []Str;

	DxLib_End();
	return 0;

}
という読み込む(つもりで)コードを書いたのですが、
fgets( NumStr, sizeof(size_t), lf );で

SAO-Client.exe の 0x0132f77b でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x013b23d1 に書き込み中にアクセス違反が発生しました。

と出て、fgets.cの90行目 if ((*pointer++ = (_TSCHAR)ch) == _T('\n'))

に→が現れたのですが、どこを直せということでしょうか?

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#45

投稿記事 by beatle » 13年前

fgetsにNumStrを渡しているのがまずいんです.fgetsに渡すのは「バッファ」です.

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#46

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

バイナリデータですのでfgetsは相応しくないです。freadを使いましょう。fgetsは文字列専用です。

それとchar *NumStr = "";は書き換えできるメモリを確保しているわけではないので、エラーになります。
""は定数のポインタなのでNumStr が指す先は書き換えできませんし、型がcharである必要性もありません。
つまり、size_tの変数を定義してそこに読み込んだほうががシンプルなわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#47

投稿記事 by 史上最悪のデスペナ » 13年前

今度はこうなりました

コード:

#include "DxLib.h"
#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <time.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	DxLib_Init();

	FILE *lf;
	lf = fopen("data0.ESO","rb");

		size_t Num;
			fread( &Num, sizeof(size_t), 1, lf );

		size_t *StrLen;
			StrLen = new size_t[Num];
			fread( StrLen, sizeof(size_t), Num, lf );

		char *Str;
			Str = new char[Num];
				int i;
				for( i=0 ; i<=Num ; i++ )
				{
					fread( &Str[i], StrLen[i]+1, 1, lf );
				}

		delete []StrLen;

	fclose(lf);

	for( i=0 ; i<=Num ; i++ )
	{
		DrawFormatString( 0, 10*i, GetColor(255,255,255), "%s", &Str[i] );
	}
	ScreenFlip();
	WaitKey();
	delete []Str;

	DxLib_End();
	return 0;

}
としたところ

Windows によって SAO-Client.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。○○.exe または読み込まれた DLL にバグがあります。
あるいは、○○.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。

だそうです。
場所はdelete []Str;でした

ちなみに、全く上手くいっておらず、こんな感じでした。
これは・・・・.png
これは・・・・.png (22.67 KiB) 閲覧数: 24526 回

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#48

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

char *Str;が間違っています。文字列を読み込むメモリが確保されていません。
Str = new char[Num];ではどう考えてメモリが足りませんよね?

必要なのは文字列の配列ですので、要はchar*の配列が必要になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#49

投稿記事 by 史上最悪のデスペナ » 13年前

softya(ソフト屋) さんが書きました:char *Str;が間違っています。文字列を読み込むメモリが確保されていません。
Str = new char[Num];ではどう考えてメモリが足りませんよね?
そんな単純なことを見落としていたとは・・・・・・・・・

ちなみに、プログラムの考え方自体は合っていますか?

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#50

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

OKですよ。読み込む方法の一つとして合っています。
もう一つの方法は、最初にファイルサイズを調べて一括で読み込んでからバイナリの内容を取り出す方法です。newが一回で済むのでメモリ管理が楽です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#51

投稿記事 by 史上最悪のデスペナ » 13年前

史上最悪のデスペナ さんが書きました:
softya(ソフト屋) さんが書きました:char *Str;が間違っています。文字列を読み込むメモリが確保されていません。
Str = new char[Num];ではどう考えてメモリが足りませんよね?
そんな単純なことを見落としていたとは・・・・・・・・・
とはいうものの、どう直せばいいのかがわかりませんでした。

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#52

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

要は文字列はchar型の配列なので、これを更に配列にする2次元配列になります。
ダブルポインタ**を使って下さい。
char **Str;
まず、ポインタであるchar*型をNumサイズ分確保して、つぎに各char*ごとに文字列を格納にするのに必要な大きさのメモリを確保してやります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#53

投稿記事 by 史上最悪のデスペナ » 13年前

コード:

char **Str;
	*Str = new char[Num];
最初こうやったときにエラーになった(Strが初期化されてない)のは
softya(ソフト屋) さんが書きました:ポインタであるchar*型をNumサイズ分確保して、つぎに各char*ごとに文字列を格納にするのに必要な大きさのメモリを確保してやります。
をしてなかったからなんですね。

それを踏まえて

コード:

char **Str;
	*Str = new char[Num];
		int i;
		for( i=0 ; i<=Num ; i++ )
		{
			Str[i] = new char[ StrLen[i]+1 ];
			fread( &Str[i][i], StrLen[i]+1, 1, lf );
		}
としてみたところ、

Run-Time Check Failure #3 - The variable 'Str' is being used without being initialized.

と出たのですが、「中断」ではなく「継続」させると以下のエラー文が出ました

○○.exe の 0x01242d9f でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcccccccc に書き込み中にアクセス違反が発生しました。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#54

投稿記事 by beatle » 13年前

なんだか,史上最悪のデスペナさんの一連の書き込みを見ると,C言語のポインタや配列の知識がごっそり抜けているようですね.バイナリファイル云々という話をするまえに,ポインタ・配列・多次元配列あたりの勉強を,体系的におこなうのが良いと思います.
今のように,エラーが出たからその場所を直す,という場当たり的な学習では,きちんとしたまとまった知識は手に入りにくいと思います.

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#55

投稿記事 by 史上最悪のデスペナ » 13年前

beatle さんが書きました:なんだか,史上最悪のデスペナさんの一連の書き込みを見ると,C言語のポインタや配列の知識がごっそり抜けているようですね.バイナリファイル云々という話をするまえに,ポインタ・配列・多次元配列あたりの勉強を,体系的におこなうのが良いと思います.
今のように,エラーが出たからその場所を直す,という場当たり的な学習では,きちんとしたまとまった知識は手に入りにくいと思います.
分かりました。取り合えず、勉強の旅に出かけてきます。

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#56

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

参考サイトをお届け。

「ポインタ虎の巻」
http://www.nurs.or.jp/~sug/soft/tora/index.htm
「ポインタ」
http://www9.plala.or.jp/sgwr-t/c/sec10.html
「配列とポインタ」
http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
「ポインタと文字列」
http://www9.plala.or.jp/sgwr-t/c/sec10-3.html
「ポインタのポインタ」
http://www9.plala.or.jp/sgwr-t/c/sec10-4.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#57

投稿記事 by 史上最悪のデスペナ » 13年前

調べても分かりませんと、泣きつこうと思ったら参考サイトを貼って下さっていたので
もう一度、流離ってきます

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#58

投稿記事 by 史上最悪のデスペナ » 13年前

良く分かってないけど(ここ重要)一応出来ました。

コード:

char **Str = new char*[Num];
	int i;
	for( i=0 ; i<Num ; i++ )
	{
		Str[i] = new char[ StrLen[i]+1 ];
		fread( Str[i], StrLen[i]+1, 1, lf );
	}
分からない所は

コード:


//OK
char **Str = new char*[Num];

////////////////////////////////////////

//実行時エラー
char **Str;
**Str = new char*[Num];

である理由です。

まあ、全体的に消化しきれて無い感がありありですが追々勉強していけば何とかなるんじゃないかと希望的観測^^;

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#59

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

**Str と*StrとStrの違いを書いてみてください。
説明したサイトにも有ったと思いますが図を書いてみると理解が進むと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#60

投稿記事 by 史上最悪のデスペナ » 13年前

**Str・・・・・・・文字
*Str・・・・・・・・**Strのアドレス(メモリの番地)
Str・・・・・・・・・*Strのアドレス(メモリの番地が入っているメモリの番地)

かな?

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#61

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

 ちょっと微妙なのでcharを使って型で書いてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#62

投稿記事 by 史上最悪のデスペナ » 13年前

**Str・・・・・・char**
*Str・・・・・・・char*
Str・・・・・・・・char

のような気もするけど・・・・

**Str・・・・・・char***
*Str・・・・・・・char**
Str・・・・・・・・char*

ですかね?

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#63

投稿記事 by beatle » 13年前

史上最悪のデスペナ さんが書きました:**Str・・・・・・・文字
*Str・・・・・・・・**Strのアドレス(メモリの番地)
Str・・・・・・・・・*Strのアドレス(メモリの番地が入っているメモリの番地)
史上最悪のデスペナ さんが書きました:**Str・・・・・・char**
*Str・・・・・・・char*
Str・・・・・・・・char
が矛盾していることには気づいてますか?

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#64

投稿記事 by 史上最悪のデスペナ » 13年前

beatle さんが書きました:
史上最悪のデスペナ さんが書きました:**Str・・・・・・・文字
*Str・・・・・・・・**Strのアドレス(メモリの番地)
Str・・・・・・・・・*Strのアドレス(メモリの番地が入っているメモリの番地)
史上最悪のデスペナ さんが書きました:**Str・・・・・・char**
*Str・・・・・・・char*
Str・・・・・・・・char
が矛盾していることには気づいてますか?
ほほう。そうなんですか。

じゃあ、
**Str・・・・・・・・・・char
*Str・・・・・・・・・・・char*
Str・・・・・・・・・・・・char**

かな?(消去法?勘?微妙な思い付きによる答え)
softya(ソフト屋) さんが書きました:説明したサイトにも有ったと思いますが図を書いてみると理解が進むと思います。
図が描けませんでした!

もう笑うしかないですね^^;全っ然理解できません。
なのに気付いたらランクが上級者にww
上級者以上のランカーで私以下のレベルの方がいるだろうか、いやいないだろう。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#65

投稿記事 by beatle » 13年前

softyaさんは,charを使って「型で書け」と言ったのです.
C言語で1文字を表す型は char ですね.
C言語でcharへのポインタを表す型は char * ですね.
すなわち,C言語で「charへのポインタ」へのポインタを表す型は char ** です.

Strっていう変数名を使っていますけれど,Strはstringの略ですから,普通は文字列を表すのにstrという変数名を使います.
誤解の元ですから,char *以外の型の変数をstrという名前にするのは止めた方が賢明です.

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#66

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

ポインタは多くの人が躓くのでしっかり勉強しましょう。
まんまの「ポインタのポインタ」ってのが参考サイトにあるんですが読みましたか?
あと 単純なポインタから図を書いてみたほうが良いでしょうね。

ポインタだけで本があるぐらいですから理解を焦ってはダメですよ。
「Amazon.co.jp: ポインタ: 本」
http://www.amazon.co.jp/%E3%83%9D%E3%82 ... %BF&page=1

【補足】 参考を追加しておきます。自分が分かりやすいと思うものを読んでみてください。
「Part4 誰もがつまずくポインタを完璧理解 - C/C++は永久に不滅です!:ITpro」
http://itpro.nikkeibp.co.jp/article/COL ... 06/256198/
「C言語ポイント学習 (配列とポインタその1)」
http://www2.netf.org/pointer1.html
「第6回 ポインタを理解して文字列を扱う - よくわかるC言語:ITpro」
http://itpro.nikkeibp.co.jp/article/COL ... 31/252216/
「C言語~ポインタ~ -ヒバリのとまりぎ-」
http://spitzayano.web.fc2.com/arrangeme ... inter.html

それとデバッガを上手く使ってイメージを掴みましょう!ポインタや配列、文字列をデバッガで覗いてみましょう!
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#67

投稿記事 by 史上最悪のデスペナ » 13年前

私が理解できないのがいけないのですが何か別の方向に向かっている気がするので
史上最悪のデスペナ さんが書きました:分からない所は

コード:

 
//OK
char **Str = new char*[Num];
 
////////////////////////////////////////
 
//実行時エラー
char **Str;
**Str = new char*[Num];
である理由です。
ここの部分を別にトピックを立てて、こっちでは(その場しのぎを繰り返しながら)次の段階にどんどん進めていっていただいても宜しいですか?

Ryo

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#68

投稿記事 by Ryo » 13年前

Strは「char**」型
それを使うときにも**をつけたら4つの*がついてることになる

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#69

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

セーブや通信を後回しにして別のことを並行するなら別に構わないと思いますが、セーブや通信をやるならポインタをまず理解しないと進まない状況だと思います。
[補足]ともかくトピックが長くなったので仕切り直すのは賛成です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。


史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#71

投稿記事 by 史上最悪のデスペナ » 13年前

softya(ソフト屋) さんが書きました:セーブや通信をやるならポインタをまず理解しないと進まない状況だと思います。
[補足]ともかくトピックが長くなったので仕切り直すのは賛成です。
エンディアンだとかバディングとかもポインタの知識が必要になりますか?メモリ関係なのでなりそうですが、あまり関係なかったら教えていただけると幸いです。
beatle さんが書きました:blog.php?u=783&b=2698
ポインタ攻略法を書いてみました.ご参考にどうぞ.
ありがとうございます。softya(ソフト屋)さんの貼ってくださったリンクと共に勉強させていただきます。

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#72

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

史上最悪のデスペナ さんが書きました:エンディアンだとかバディングとかもポインタの知識が必要になりますか?メモリ関係なのでなりそうですが、あまり関係なかったら教えていただけると幸いです。
エンディアンは違うタイプのCPUが混ざらない限りは大丈夫です。ただ、バイナリエディタで見ているうちに覚える気もしますが。
パディングはメモリ配置の話ですので、バイナリデータで構造体を扱う限りは意識する必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#73

投稿記事 by 史上最悪のデスペナ » 13年前

softya(ソフト屋) さんが書きました:エンディアンは違うタイプのCPUが混ざらない限りは大丈夫です。
オンラインゲームを作りたいので知る必要がありますね。教えてください!

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#74

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

史上最悪のデスペナ さんが書きました:
softya(ソフト屋) さんが書きました:エンディアンは違うタイプのCPUが混ざらない限りは大丈夫です。
オンラインゲームを作りたいので知る必要がありますね。教えてください!
とりあえず史上最悪のデスペナさんが使う可能性がある一般的パソコンで動いているWindows/Linux/MacはINTELやAMDのx86アーキテクチャを使っているので全部リトルエンディアンです。レンタルサーバーでこれ以外が無いわけはないですが、わざわざ借りることもないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 14年前

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#75

投稿記事 by 史上最悪のデスペナ » 13年前

softya(ソフト屋) さんが書きました:とりあえず史上最悪のデスペナさんが使う可能性がある一般的パソコンで動いているWindows/Linux/MacはINTELやAMDのx86アーキテクチャを使っているので全部リトルエンディアンです。レンタルサーバーでこれ以外が無いわけはないですが、わざわざ借りることもないと思います。
じゃあもう全部リトルエンディアンでいいじゃん、と思ってしまいます^^;

では、ここは解決にしておきます。
ありがとうございました。

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

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#76

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

あくまでも史上最悪のデスペナさんが使う環境の話ですのでゲーム機とかビックエンディアンのCPUは沢山あります。ファイル形式としてビックエンディンが定められているファイルもありますので、いつでもリトルエンディアンが通用するわけではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: どんなデータ型(のアドレスでも可)でも保存できる変数ってありますか?

#77

投稿記事 by ISLe » 13年前

ネットワークバイトオーダーは一般的にビッグエンディアン…というのはここでは関係ない話ですね。
余談でした。

閉鎖

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