0

C ++での厄介なオーバーフローの問題のため、代わりにPythonを使用していくつかの値を事前計算したいと思います。次に値を吐き出す関数f(a、b)があります。aとbの範囲に基づいて必要なすべての値をファイルに出力できるようにしたいので、C ++でそのファイルを読み取り、一般的なベクトルや配列などを読み取ります。

  1. f(a、b)を出力するのに適した形式は何ですか?
  2. これをC++に読み戻すための最良の方法は何ですか?
  3. ベクトルまたはマルチディム配列?
4

3 に答える 3

1

Python を使用して、C++ ソース構文と互換性のある .h ファイルを書き出すことができます。

h_file.write('{')
for a in range(a_size):
    h_file.write('{' + ','.join(str(f(a, b)) for b in range(b_size)) + '},\n')
h_file.write('}')

おそらく、そのコードを変更して余分な改行を挿入する必要があるでしょう。実際、後で表示できるコードがあります (現在はアクセスできません)。

于 2012-04-09T20:12:47.833 に答える
0

メガバイトのデータがある場合は、データ ファイルを読み取り専用でメモリ マッピングしてデータを読み取ります。起動時にデータ ファイルをすべて読み込まなくても、データ ファイルを直接使用できるように調整します。

このようにする理由は、一部の値のみを使用する場合、起動時にメガバイトのデータを読みたくないからです。メモリ マッピングを使用すると、OS はファイルの必要な部分だけを自動的に読み取ります。また、RAM が不足している場合、OS はスワップ ファイルに書き込む時間を無駄にすることなく、そのファイルに割り当てられたメモリを再利用できます。

関数の出力が単一の数値である場合は、おそらく int の配列が必要です。おそらく、2D 配列が必要になるでしょう。たとえば、次のようになります。

#define DATA_SIZE (50 * 25)
typedef const int (*data_table_type)[50];
int fd = open("my_data_file.dat", O_RDONLY);
data_table_type data_table = (data_table_type)mmap(0, DATA_SIZE,
                                  PROT_READ, MAP_SHARED, fd, 0);
printf("f(5, 11) = %d\n", data_table[5][11]);

メモリ マップ ファイルの詳細については、Wikipedia、またはUNIX の mmap() 関数、またはWindows の CreateFileMapping() 関数を参照してください。

より複雑なデータ構造が必要な場合は、C/C++ 構造と配列をファイルに入れることができます。ただし、ポインターや、仮想的なものを持つ C++ クラスを埋め込むことはできません。

データをどのように読み取るかを決定したら、次の問題はそれをどのように生成するかです。 これにはstruct.pack()が非常に便利です。Python の値を適切な形式の Python 文字列に変換し、ファイルに書き込むことができます。

于 2012-04-09T20:57:45.687 に答える
0

Python を使用して、データを含む C++ ソース コードを書き出すことができます。例えば:

def f(a, b):
    # Your function here, e.g:
    return pow(a, b, 65537)
num_a_values = 50
num_b_values = 50
# Write source file
with open('data.cpp', 'wt') as cpp_file:
    cpp_file.write('/* Automatically generated file, do not hand edit */\n\n')
    cpp_file.write('#include "data.hpp"\n')
    cpp_file.write('const int f_data[%d][%d] =\n'
                       % (num_a_values, num_b_values))
    cpp_file.write('{\n')
    for a in range(num_a_values):
        values = [f(a, b) for b in range(num_b_values)]
        cpp_file.write('  {' + ','.join(map(str, values)) + '},\n')
    cpp_file.write('}\n')
# Write corresponding header file
with open('data.hpp', 'wt') as hpp_file:
    hpp_file.write('/* Automatically generated file, do not hand edit */\n\n')
    hpp_file.write('#ifndef DATA_HPP_INCLUDED\n')
    hpp_file.write('#define DATA_HPP_INCLUDED\n')
    hpp_file.write('#define NUM_A_VALUES %d\n' % num_a_values)
    hpp_file.write('#define NUM_B_VALUES %d\n' % num_b_values)
    hpp_file.write('extern const int f_data[%d][%d];\n'
                              % (num_a_values, num_b_values))
    hpp_file.write('#endif\n')

次に、生成されたソース コードをプロジェクトの一部としてコンパイルします。f_data[]その後、ヘッダーを #include し、配列に直接アクセスすることで使用できます。

これは、アイコンなどの小規模から中規模のサイズのデータ​​ テーブルに非常に適しています。大規模なデータ テーブル (数百万のエントリ) の場合、一部の C コンパイラが失敗し、コンパイル/リンクが許容できないほど遅くなることがあります。

データがより複雑な場合は、この同じ方法を使用して構造を定義できます。

[Mark Ransom の回答に基づいていますが、いくつかのスタイルの違いと詳細な説明があります]。

于 2012-04-09T21:14:18.940 に答える