2015-02-10 116 views
0

我有一個程序,它應該將元素數量調整爲與其工作的設備數量。我有一個config * .txt文件,其中包含一些參數,允許不懂編程語言的用戶根據需要調整程序。從文件中讀取數組大小

舉例來說,直到現在,所有的事情都是這樣處理的。在頭文件:

enum 
{ 
    // number of input and output channels 
    kMaxInputChannels = 8, 
    kMaxOutputChannels = 8 
}; 

typedef struct AudioDriverSettings 
{ 
    (...) 
    ASIOBufferInfo bufferInfos[kMaxInputChannels + kMaxOutputChannels]; 
    ASIOChannelInfo channelInfos[kMaxInputChannels + kMaxOutputChannels]; 
    (...) 

} AudioDriverSettings; 

typedef struct AudioFileConfig 
{ 
    (...) 
    int inputId[kMaxInputChannels]; 
    int outputId[kMaxOutputChannels]; 
    bool shouldMixInput[kMaxInputChannels]; 
    bool shouldRecordChannel[kMaxInputChannels]; 
    (...) 

} AudioFileConfig; 

在* .TXT還存在變數:

NUM_CHANNELS_IN    8 
NUM_CHANNELS_OUT   8 

而且在程序啓動我讀它,並寫入變量:

if (!strcmp(tmp_str, "NUM_CHANNELS_IN")) 
     NUM_CHANNELS_IN = atoi(token); 
if (!strcmp(tmp_str, "NUM_CHANNELS_OUT")) 
     NUM_CHANNELS_OUT = atoi(token); 

我想得到如下效果,但變量需要是常量,因此它不起作用。

int NUM_CHANNELS_IN; 
int NUM_CHANNELS_OUT; 

typedef struct AudioDriverSettings 
{ 
    (...) 
    ASIOBufferInfo bufferInfos[NUM_CHANNELS_IN + NUM_CHANNELS_OUT]; 
    ASIOChannelInfo channelInfos[NUM_CHANNELS_IN + NUM_CHANNELS_OUT]; 
    (...) 

} AudioDriverSettings; 

typedef struct AudioFileConfig 
{ 
    (...) 
    int inputId[NUM_CHANNELS_IN]; 
    int outputId[NUM_CHANNELS_OUT]; 
    bool shouldMixInput[NUM_CHANNELS_IN]; 
    bool shouldRecordChannel[NUM_CHANNELS_IN]; 
    (...) 

} AudioFileConfig; 

有沒有簡單的方法來處理它?

+0

哪個變量需要是const?你會得到什麼錯誤? – 4386427 2015-02-10 07:31:39

+0

「error C2057:expected constant expression」in line:ASIOBufferInfo bufferInfos [NUM_CHANNEL_IN + NUM_CHANNEL_OUT];例如。這些int值從文件中讀取。我想根據在程序啓動時寫入文件的值設置buferInfos []數組的大小(我不需要稍後改變它)。 – F1sher 2015-02-10 07:35:37

+0

順便說一句,這是C不是C++。 – emlai 2015-02-10 07:48:59

回答

0

如果這是C,你需要動態分配你的陣列:

ASIOBufferInfo *bufferInfos; 
... 
bufferInfos = malloc(sizeof(ASIOBufferInfo) * (NUM_CHANNELS_IN + NUM_CHANNELS_OUT)); 

如果這是C++,使用std::vector類:

std::vector<ASIOBufferInfo> bufferInfos; 
... 
bufferInfos.reserve(NUM_CHANNELS_IN + NUM_CHANNELS_OUT); 

,然後push_backvector 。或者:

std::vector<ASIOBufferInfo> bufferInfos(NUM_CHANNELS_IN + NUM_CHANNELS_OUT); 

然後只是訪問像bufferInfos.at(i)這樣的元素。

+0

看起來很有希望。我將在後天測試它。謝謝你的回答。 – F1sher 2015-02-10 10:02:31

-2

我相信你正在尋找的答案是使用指針。通過改變:

int NUM_CHANNELS_IN; int NUM_CHANNELS_OUT;

: int * NUM_CHANNELS_IN; int * NUM_CHANNELS_OUT;

你可以通過函數等傳遞你的變量。我不能說你需要對你的代碼做出確切的修改,你可能需要刷一下指針的正確語法,但我相信這是如果我已經正確地解釋你的問題,最簡單的方法來實現你正在嘗試做的事情。

希望這會有所幫助!