2016-03-15 52 views
0

具有可變索引我有ID的緩衝器,其看起來像這樣 InBuffer={ID1,ID2,ID3,...}(雙)for循環用C

我需要一個返回指針到的數據的函數使用所述ID來遍歷,每次分配給這個ID和數據的大小。然後我需要填寫另一個緩衝區,其結果是

OutBuffer={ID1,SIZE1,DATA1.WORD1,...,DATA1.WORDSIZE1, 
    ID2,SIZE2,DATA2.WORD1,...,DATA2.WORDSIZE2, 
    ..., 
    IDN,SIZEN,DATAN.WORD1,...,DATAN.WORDSIZEN 
} 

我有形成整體for循環,這和它的索引,這主要是因爲每個SIZE變量可以是不同的問題的形式的。它應該很簡單,但我似乎無法使它工作。

在此先感謝您的幫助。

// For example 
// Iterate through the remaining of the Request Buffer (m=0,1 already set) 
for (m = 2; m < InBuffer; m++)` 
{ 
    OutBuffer[m] = InBuffer[m]; 
    returnPointersToDataAndSizeFunction(InBuffer[m], &SIZE, &DATA); 
    OutBuffer[m + 1] = SIZE; // e.g. SIZE = 2, therefore DATA has 2 fields 
    OutBuffer[m + 2] = DATA.1; // first field 
    OutBuffer[m + 3] = DATA.2; // second field 
    // and so on 
} 
+4

請添加一些更多的代碼,我們可以幫助你。特別是你在第二段中描述的那一點。 – nobism

+0

@ user3374479,還不清楚。也許你可以用實際的數據和相關的代碼寫一個清晰的例子。 – Ravi

+0

@ user3374479當你不知道你的索引應該如何流入你的算法時,你應該通過聲明它們並開始使用你的數學教科書中的名字來開始你的評論,例如:'1 2 * m。 – ikrabbe

回答

6

我注意到的第一件事是,你正在使用m索引兩個緩衝器:

for (m = 2; m < InBuffer; m++) 
{ 
    OutBuffer[m]=InBuffer[m]; 

但此時你使用的抵消m的附加數據OutBuffer

OutBuffer[m+1]=SIZE; 
OutBuffer[m+2]=DATA; 

那麼,你認爲在循環的下一次迭代中會發生什麼?假設你經過第一次循環,使m爲2。下一次,這是m++,即3,和你做一次這樣分配:

OutBuffer[m]=InBuffer[m]; 

但是你已經在m[3]分配的東西,那就是前一次迭代的值爲SIZE。您還在m[4]處指定了DATA,這將在此迭代中被SIZE值覆蓋。最終,您將以OutBuffer結束,其中包含InBuffer中的內容,以及最後一個ID的SIZEDATA值。

您需要使用不同的變量指標OutBuffer,是這樣的:

for (m = 2, n = m; m < InBuffer; m++) { 
    OutBuffer[n++] = InBuffer[m]; 
    returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA); 
    OutBuffer[n++] = SIZE; 
    OutBuffer[n++] = DATA; 
} 

還有一些其他的問題。例如,for循環中的條件不應該比較mInBuffer,而應該比較mInBuffer中的條目數。但只是理順你的索引應該是一大進步。

更新:我剛剛注意到,每個ID的數據大於只有一個字段。你需要另一個循環中的第一個內,然後,讓你最終是這樣的:

for (m = 2, n = m; m < InBuffer; m++) { 
    OutBuffer[n++] = InBuffer[m]; 
    returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA); 
    OutBuffer[n++] = SIZE; 
    for (i = 0; i < SIZE; i++) { 
     OutBuffer[n++] = DATA[i]; 
    } 
} 

如果DATA是字段,而不是數組的結構,那麼你可能需要一系列的if語句來檢查是否應包含每個字段。您不能使用像i這樣的變量的值作爲字段的名稱,即您不能說DATA.i其中i是一個變量。我不認爲C結構可以包含數字的字段名稱 - 標識符通常必須以字母或下劃線開頭,所以試圖做到這一點不會有多大意義。如果您可以控制DATA的類型,則應該將其設置爲數組而不是結構。所以你的循環看起來更像這樣:

for (m = 2, n = m; m < InBuffer; m++) { 
    OutBuffer[n++] = InBuffer[m]; 
    returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA); 
    OutBuffer[n++] = SIZE; 
    i = 0; 
    if (i++ < SIZE) { OutBuffer[n++] = DATA.field1; } 
    if (i++ < SIZE) { OutBuffer[n++] = DATA.field2; } 
    // and so on for each field in DATA's type 
} 
+0

我喜歡for循環,而不是最後一個例子,通常最好避免在一個語句中增加和索引操作符('OutBuffer [n ++]'),至少在你完全知道你在做什麼 – ikrabbe

+0

Caleb你還在比較int與指針:m

+0

謝謝@Caleb,在轉移我的代碼的例子時,我笨拙地沒有比較InBuffer的長度。 – user3374479

1

正如Caleb指出的,你應該爲每個數組使用一個變量。

如果你說DATA可以包含多個元素,那麼你應該增加變量outBufferSIZE每次迭代。還可以使用一個循環來ASIGN DATA S場到OutBuffer

int n = XXX; // set n to the first element you need to assign an ID to 
for (m = 2; m < ElementsInBuffer; m++) 
{ 
    OutBuffer[n] = InBuffer[m]; 
    returnPointersToDataAndSizeFunction(InBuffer[m],&SIZE,&DATA); 
    OutBuffer[n + 1] = SIZE; 
    for (int i = 0; i < SIZE; i++) 
    { 
    OutBuffer[n + 2 + i] = DATA[i]; // works for array only see Calebs answer to see how it works for structs 
    } 
    n += SIZE + 1; // +1 to also skip the field for SIZE 
}