- ベストアンサー
こんな時はどうすれば良いのでしょうか?
C/C++ Visual Studio 2005 ファイルを参照して、そこに格納してあるデータ一部のデータを参照するとき、プログラムで実行するときはそのデータのアドレス(場所)決まっているが、コンパイルする前の段階では場所が不定です。 今は毎回そのデータがどこなのかファイルを毎回しらべて、そのアドレスをプログラム中に書き込んで使ってます。とても、めんどくさく量が多くなると手の付けようがありません。 プログラム中でそのデータの場所を検索することは無駄なのでしたくありません。 なにかいい方法ありませんか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
データのアドレスを調べる別プログラムを作成して、データが変更されたらそのプログラムを使ってアドレスを算出するようにしては? 算出されたアドレスを #define DATA_ADDRESS xxxx のようにテキストファイルに出力するようにプログラムを作成して、そのファイルをincludeするようにしておけば、コンパイル前にそのプログラムを実行するように設定するだけで何の苦労もいらなくなります。
その他の回答 (5)
- SilverThaw
- ベストアンサー率32% (260/806)
No.1です。 >こんにちわの先頭は0x0Aです。 違います。 「0x0D,0x0A」で一行目の「おはよう」と二行目の「こんにちは」の「後ろの改行コード(CR-LF)」です。 「こんにちは」の先頭は「0x82」の部分です。但し、2Byteコードのため「0x82」だけでは先頭を特定することはできません。 「こんにちは」の先頭の「こ」を確認したいのであれば、「0x82,0xB1」を確認する必要があります。 ですから >この0x0Aを変数に格納して使いたいのですが、こんにちわの前に文字を追加すると当然0x0Aではなくなりますよね。 というのは間違いです。 一度「Shift-JISコード」と「ASCIIコード(正確には、JIS-X0201)」の文字コードを確認してください。 それと、私も含めて「別ファイルで持つ」という案が提示されていますが、こちらでは駄目なのでしょうか? 駄目な利用は書かれていませんが……
お礼
回答ありがとうございます。 別ファイルで持つの意味がよくわかりませんでした。
- ttega
- ベストアンサー率52% (9/17)
いまいちご質問の意図がはっきり分かりませんが、プログラム実行時に決まっていてコンパイル時に決まっていないと言うことは、実行ファイル内に埋め込まれたデータを参照したいという話でしょうか? 配列などの形でデータを定義しているのなら単に配列のアドレスをみればいいですし(コンパイル時には決まっていませんがリンク時に解決されます)、Windows のリソースとして取り込んでおけば LoadResource することもできます。
補足
質問が伝わりにくかってです。 例えば、ABC.txt(実際はテキストのファイルではなくオリジナルのバイナリファイル)というファイルをリソースとして、持たせておきそのテキストファイルには おはよう こんにちわ こんばんわ と書いてあった時。アスキーでバイナリ表示で下のようになるとおもいます。 82 A8 82 CD 82 E6 82 A4 0D 0A 82 B1 82 F1 82 C9 82 BF 82 ED 0D 0A 82 B1 82 F1 82 CE 82 F1 82 ED こんにちわの先頭は0x0Aです。 この0x0Aを変数に格納して使いたいのですが、こんにちわの前に文字を追加すると当然0x0Aではなくなりますよね。 今は毎回ソースの0x0A部分を書き換えてからコンパイルしているわけです。 で、データー検索すれば当然、目的の先頭位置はわかるわけですが、リリースするときには0x0Aは固定なもので、プログラムを実行するたびにわざわざ検索をすることは無駄ですし、検索数とその対象が多くなれば当然時間もかかってしまい、それは避けたいのです。
- ICE_FALCON
- ベストアンサー率56% (63/111)
1.mainの引数argc,argvを使う。 2.環境変数を使う。
補足
質問が伝わりにくかってです。 例えば、ABC.txt(実際はテキストのファイルではなくオリジナルのバイナリファイル)というファイルをリソースとして、持たせておきそのテキストファイルには おはよう こんにちわ こんばんわ と書いてあった時。アスキーでバイナリ表示で下のようになるとおもいます。 82 A8 82 CD 82 E6 82 A4 0D 0A 82 B1 82 F1 82 C9 82 BF 82 ED 0D 0A 82 B1 82 F1 82 CE 82 F1 82 ED こんにちわの先頭は0x0Aです。 この0x0Aを変数に格納して使いたいのですが、こんにちわの前に文字を追加すると当然0x0Aではなくなりますよね。 今は毎回ソースの0x0A部分を書き換えてからコンパイルしているわけです。 で、データー検索すれば当然、目的の先頭位置はわかるわけですが、リリースするときには0x0Aは固定なもので、プログラムを実行するたびにわざわざ検索をすることは無駄ですし、検索数とその対象が多くなれば当然時間もかかってしまい、それは避けたいのです。
- zwi
- ベストアンサー率56% (730/1282)
>プログラム中でそのデータの場所を検索することは無駄なのでしたくありません。 毎回検索せずにファイルの日付を調べて更新されていたら検索しては? iniファイルなどに、ファイルの名前、検索したときのファイルの日付、データのアドレスを記録しておきます。 ファイルの日付を調べて、同じであれば記録してあるデータのアドレスで処理できます。
補足
質問が伝わりにくかってです。 例えば、ABC.txt(テキストのファイルではなくオリジナルのバイナリファイル)というファイルをリソースとして、持たせておきそのテキストファイルには おはよう こんにちわ こんばんわ と書いてあった時。アスキーでバイナリ表示で下のようになるとおもいます。 82 A8 82 CD 82 E6 82 A4 0D 0A 82 B1 82 F1 82 C9 82 BF 82 ED 0D 0A 82 B1 82 F1 82 CE 82 F1 82 ED こんにちわの先頭は0x0Aです。 この0x0Aを変数に格納して使いたいのですが、こんにちわの前に文字を追加すると当然0x0Aではなくなりますよね。 今は毎回ソースの0x0A部分を書き換えてからコンパイルしているわけです。 で、データー検索すれば当然、目的の先頭位置はわかるわけですが、リリースするときには0x0Aは固定なもので、プログラムを実行するたびにわざわざ検索をすることは無駄ですし、検索数とその対象が多くなれば当然時間もかかってしまい、それは避けたいのです。
- SilverThaw
- ベストアンサー率32% (260/806)
簡単な方法は、 iniファイルのような設定ファルを作ってそこに登録しておき、起動時にファイルから参照位置を取得する。
補足
質問が伝わりにくかってです。 例えば、ABC.txt(テキストのファイルではなくオリジナルのバイナリファイル)というファイルをリソースとして、持たせておきそのテキストファイルには おはよう こんにちわ こんばんわ と書いてあった時。アスキーでバイナリ表示で下のようになるとおもいます。 82 A8 82 CD 82 E6 82 A4 0D 0A 82 B1 82 F1 82 C9 82 BF 82 ED 0D 0A 82 B1 82 F1 82 CE 82 F1 82 ED こんにちわの先頭は0x0Aです。 この0x0Aを変数に格納して使いたいのですが、こんにちわの前に文字を追加すると当然0x0Aではなくなりますよね。 今は毎回ソースの0x0A部分を書き換えてからコンパイルしているわけです。 で、データー検索すれば当然、目的の先頭位置はわかるわけですが、リリースするときには0x0Aは固定なもので、プログラムを実行するたびにわざわざ検索をすることは無駄ですし、検索数とその対象が多くなれば当然時間もかかってしまい、それは避けたいのです。
お礼
回答ありがとうございます。 その手がありました。早速作ってみました。