c - 如何处理类型在运行时确定的数组的声明和分配?

标签 c malloc type-conversion

假设我在磁盘上有五个二进制文件。这五个文件以二进制格式对数字序列进行编码,只是它们都有不同的类型。假设它们是 SHORT INT、INT、LONG、FLOAT 和 DOUBLE。我们将让这些文件也存储不同数量的数字。

现在假设我有一个程序,在执行时询问用户

Enter filename you wish to load:

用户可以从这五个文件中选择一个。我希望程序将这些文件加载​​到一个数组中,以便可以执行进一步的计算。

我们可以假设存在两个函数:一个返回一个整数值,该整数值对文件的类型(即 SHORT INT、INT、LONG、FLOAT 或 DOUBLE)进行编码(称为“getfiletype”),另一个返回文件中数字的数量(例如 1000、9338、8131、0 等)(称之为“getfilesize”)。条目的实际数量可能是数十亿个数字。如果可能的话,在程序中,我想为保存用户选择的任何文件的值的数组使用相同的名称(比如“数组”)。这样我就可以拥有像

这样的 block
N=getfilesize("pickedfile.dat");
for(i=0 ; i<N ; i++ ) {
    doublearray[i]==2.0*(double)array[i]+7.12;
}

可以变换数组。在这里,我引入了一个名为“doublearray”的新数组来保存转换后的值。然后,此 double 组将以 DOUBLE 格式写入文件,或者在写入其他格式之一之前进行转换。

我该怎么做这种事情?完全糊涂了。

最佳答案

您的程序可以创建一个静态(或全局)void* 数组,该数组将由对 getfiletype() 或 getfilesize() 的最新调用填充。然后你必须适本地转换它(就像你在你的例子中专门做的那样)。假设您已经解决了文件数据方面的加载问题。

虽然这种方法在使用方面并不是很干净(依赖静态或全局会限制您执行不同对话的选项 - 特别是在目前的情况下,您必须确保以顺序方式操作)。

一个更简洁的 API 可能是这样的:

enum TypeEnum { SHORT_INT, INT, LONG, FLOAT, DOUBLE };
void* getfiledata(char *filename, unsigned int *size, TypeEnum *type);
#define GET_DATA_AND_CAST(filename, array, array_size) \
    do { \
        TypeEnum type; \
        void* arr = getfiledata(filename, array_size, &type); \
        switch(type) { \
            case SHORT_INT: \
                array = (short*)arr; break; \
            case INT: \
                array = (int*)arr; break; \
            case LONG: \
                array = (long*)arr; break; \
            case FLOAT: \
                array = (float*)arr; break; \
            case DOUBLE: \
                array = (double*)arr; break; \
            default: \
                // ASSERT \
        } \
    } while(0)

然后您可以像这样使用它:

void process_doubles(void *array) {
    double to_conv[];
    unsigned int size;
    GET_DATA_AND_CAST("pickedfile.dat", to_conv, &size);

    for(i=0; i<size; ++i ) {
        doublearray[i] = 2.0 * to_conv[i] + 7.12;
    }
}

恕我直言,C++ 会让这变得更好(因为您可以使用模板),但由于这个问题只用 C 标记,所以我只是在 C 中提供选项。

关于c - 如何处理类型在运行时确定的数组的声明和分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12105765/

相关文章:

C Memory free in loop error -> 大小为 1 的无效读取

c++ - {1, 2} 是一个值吗?如果是,它的类型是什么?如果不是,为什么可以将其分配给初始化列表?

JavaScript 类型转换 : (true && 1) vs (true | | 1)

ios - 在 Swift 中将 Int 转换为 String

C:多线程

c - 与素数相关的输出

c - 在 OpenGL 中,我可以绘制一个恰好位于坐标 (5, 5) 的像素吗?

c - 为什么 _mm512_store_pd 在这个矩阵乘法代码中 super 慢?

c - 为什么我在函数 search_lastname 中遇到段错误?

c - 为什么当我使用函数分配内存时失败