2013-08-27 85 views
2

目前,我已经工作的代码读取这样的:动态输入

char input[4][10] = {ARR1, ARR2, ARR3, ARR4}; 

显然,我建立与这些一维数组,这是在别处定义的常量的2D阵列。但是,我需要更改此代码,以便从文件中读取所需的1d数组的名称并相应地初始化2d数组。

例如,如果该文件包含:

ARR9 ARR3 ARR5 ARR7

然后,初始化将运行等(假定所有这些阵列都被定义):

char input[4][10] = {ARR9, ARR3, ARR5, ARR7}; 

我从文件中读取没有问题,但在创建2d数组时遇到困难,并且使用从文件中读取的值作为数组的名称。

+0

如果你知道二维数组的大小,你可以malloc一个二维数组,然后用一维数组的值填充它 – jambono

回答

2

C没有introspectionreflection,所以它不是真的有可能的方式。

但是,您可以有一个转换表,从"ARR1""ARR2"等翻译,实际阵列,然后你可以从实际的数组内容复制到input条目。或代替阵列具有阵列像你现在,你可以有一个指针数组,只是设置指针指向正确的数组。

+0

这种方法可能的打嗝是我不知道所有数组的名称可能可能会通过文件传入。是否有可能有一个字符串匹配同名的数组转换表(假设用户写了一个有效的数组名),而不是简单地字符串和数组的名称之间的映射是预先确定的? –

+0

@ C.Williamson没有在运行期间得到标识符名称的方式,标识只是一个概念的来源和有没有相应的运行理念。 –

+2

@ C.Williamson还有另一种解决方案,那就是阵列本身存储在你的程序的执行过程中读取文件。然后,您可以将它们存储为具有其名称和值的文件格式。 –

0

比方说, “常量别处定义” 目前这个样子

const char *ARR1 = "Alpha"; 
const char *ARR2 = "Bravo"; 
const char *ARR3 = "Charlie"; 

解决方案1 ​​

const char *ARR_Value[] = "Alpha", "Bravo", "Charlie", 0; 
const char *ARR_Name[] = "ARR1", "ARR2", "ARR3", 0; 
// Pseudo code 
Read file keyword 
find matching ARR_Name[] 
apply corresponding ARR_Value[] to input[] 

一个更优雅的解决方案

typedef struct { 
    const char *Name; 
    const char *Value; 
    } ARR_t; 

const ARR_t ARR[] = { 
    { "ARR1", "Alpha"}, 
    { "ARR2", "Bravo"}, 
    { "ARR3", "Charlie"}, 
    { 0, 0} 
}; 

// Pseudo code 
Read file keyword 
find matching ARR[] by doing strcmp(keyword, ARR[i].Name) 
apply corresponding ARR[i].Value to input[] 

如果OP不明确需要初始化和n切换输入[]的内容或不作为后是char input[4][10],而不是const char input[4][10]

+0

我看到我迟到了派对。 – chux