2014-04-14 46 views
0

該程序正在「計算」數組的所有子集。我需要將結果值存儲在另一個名爲polje的2D字段中。如果我只使用printf("%d %d %d ", source[i][0], source[i][1], source[i][2]);,則代碼可以正常工作,但是當它試圖將所有內容複製到結果字段中時,它會失敗。我想我在索引數組polje中加入了一些錯誤的東西。存儲數組的子集

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv) { 

     int f; 
     int i,j; 
     int source[2][3] = {{0,3,5},{3,4,2}}; 
     int currentSubset = 3; 
     int polje[8][3]; 

     for(i=0;i<8;i++){ 
       for(j=0;j<3;j++){ 
         polje[i][j]=0; 
       }} 
     int tmp; 
     while(currentSubset) 
     { 
       tmp = currentSubset; 
       for(i = 0; i<3; i++) 
       { 
         if (tmp & 1) 
         { 
           printf("%d %d %d ", source[i][0], source[i][1], source[i][2]); //writes out everything I want 
           polje[currentSubset][0]=source[i][0]; 
           polje[currentSubset][1]=source[i][1]; 
           polje[currentSubset][2]=source[i][2]; 
         } 
         tmp >>= 1; 
       } 
       printf("\n"); 
       currentSubset--; 
     } 

     for(i=0;i<8;i++){ 
       for(j=0;j<3;j++){ 
         printf("%d ", polje[i][j]); 
       }printf("\n");} 
     return (EXIT_SUCCESS); 
} 

輸出領域應該是:

0 3 5 
3 4 2 
3 4 2 
0 0 0 
0 3 5 
0 0 0 
0 0 0 
0 0 0 

但取而代之的則是:

0 3 5 
3 4 2 
3 4 2 
0 0 0 
*0 0 0* 
0 0 0 
0 0 0 
0 0 0 
+0

'INT TMP; while(currentSubset) tmp = currentSubset;'對我來說看起來很糟糕。可以做得更簡單。 – wildplasser

回答

1

tmp是一個只有兩位的位掩碼,所以內部循環應該是for (i = 0; i < 2; i++)

而且正確的索引進polje陣列polje[currentSubset * 2 + i][0]因爲在每個polje需要subset兩個空間和i是0或1。

1

我覺得你只是有一個邏輯錯誤。你的循環的骨架是:

currentSubset = 3; 
while (currentSubset) 
{ 
// ... 
    polje[currentSubset][...] = ...; 
// ... 
    currentSubset--; 
} 

所以你從來沒有寫任何行,除了前三個。

+0

哦,是的,現在很明顯,關於如何存儲數組的任何想法? – arcticme

+0

確保你可以手工完成你想要的算法(例如在紙上或頭上)。然後將其分解成您希望程序執行的嬰兒步驟列表;然後檢查你的程序是否實現了每個步驟。 –