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

如果有兆字节的数据,那么我会通过内存映射数据文件读取数据,只读。我会安排一些事情,这样我就可以直接使用数据文件,而不必在启动时将其全部读取。

这样做的原因是,如果您只想使用一些值,您不想在启动时读取兆字节的数据。通过使用内存映射,您的操作系统将自动读取您需要的文件部分。而且,如果您的 RAM 不足,您的操作系统可以重用为该文件分配的内存,而不必浪费时间将其写入交换文件。

如果你的函数的输出是一个数字,你可能只需要一个整数数组。您可能需要一个二维数组,例如:

#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]);

有关内存映射文件的更多信息,请参阅WikipediaUNIX 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')

然后将生成的源代码编译为项目的一部分。然后,您可以通过#include 标头并f_data[]直接访问数组来使用它。

这非常适用于中小型数据表,例如图标。对于较大的数据表(数百万条目),一些 C 编译器会失败,您可能会发现编译/链接速度慢得无法接受。

如果您的数据更复杂,您可以使用相同的方法来定义结构。

[基于 Mark Ransom 的回答,但有一些风格差异和更多解释]。

于 2012-04-09T21:14:18.940 回答