2010-10-17 104 views
0

我將創建一個位圖,該位圖保存512位的控制權,所有512位應該爲0,以表示程序啓動時該位是空閒的。函數occupyDataBlocks(int number)應該找到空閒位將數組中的位置位int data_blocks []並將佔位位設置爲1.C中的位圖,二進制運算

下面是一些代碼,它執行一些工作:除char位[512/8]是在函數內部聲明的,所以當我調用occupyDataBlocks時會聲明一個數組,這會在我的編程中產生相同的輸出和大的失敗,當我嘗試將char位聲明爲全局時,程序返回的內存不足變量。

我需要幫助來獲得代碼來實現這一點,並設置位爲 佔用。請給我一個編碼的手,我有解決方案的理解,但不能表達它C.

 #include <stdio.h> 
     #include <string.h> 

     void occupyDataBlocks(int number) 
     { 

      int ab = number; 

      char bit[512/8]; 

      int bitNum = 0; 

      int count; 

      int data_blocks[ab]; 

      int b = 0; 

      for(bitNum = 0; bitNum < (sizeof(bit)/sizeof(char)); bitNum++) { 
       char x = bit[bitNum]; 

       for(count = 0; x != 0; x >>= 1) { 
        if(!(x & 0)) { 
         data_blocks[b++] = count; 
        } 

        if(count == number) { 
         break; 
        } 
        count++; 
       } 
       if(count == number) { 
        break; 
       } 
      } 

      if(count == number) { 
       int a; 

       for(a = 0; a < 5; a++) { 
        printf("%d\n", data_blocks[a]); 
       } 

      } else { 
       printf("Not enough data blocks\n"); 
      } 
     } 

     int main(void) 
     { 
      occupyDataBlocks(3); 
      occupyDataBlocks(3); 


      return 1; 
     } 

#include <stdio.h> 
#include <string.h> 

int occupyDataBlocks(char bit, int number) 
{ 

    int ab = number; 

    int bitNum = 0; 

    int count; 

    int data_blocks[ab]; 

    int b = 0; 

    for(bitNum = 0; bitNum < (sizeof(bit)/sizeof(char)); bitNum++) { 
     char x = bit[bitNum]; 

     for(count = 0; x != 0; x >>= 1) { 
      if(!(x & 0)) { 
       data_blocks[b++] = count; 
      } 

      if(count == number) { 
       break; 
      } 
      count++; 
     } 
     if(count == number) { 
      break; 
     } 
    } 

    if(count == number) { 
     int a; 

     for(a = 0; a < 5; a++) { 
      printf("%d\n", data_blocks[a]); 
     } 

    } else { 
     printf("Not enough data blocks\n"); 

     return 0; 
    } 

    return 1; 
} 

int main(void) 
{ 
    unsigned char bit[512/8]; 

    /* 
    * I need 3 data blocks that is ready for me to use. Put the position to the free data block in array data_blocks[], 
    * where data_blocks[0] can be 100 (the first free data block), data_block[1] = 400 (second free datablock) etc. 
    * 
    */ 

    int data_blocks[3]; 
     memcpy(data_blocks, occupyDataBlocks(bit, 3), sizeof(data_blocks));/* A try to copy the result of occypyDataBlocks to data_blocks*/ 

    return 1; 
} 
+2

平臺什麼你在忙?我很難相信它不會讓你聲明64字節的全局變量。 – 2010-10-17 18:07:57

+0

是這個作業嗎? – 2010-10-17 18:33:38

+0

Jepp。這是作業 – user265767 2010-10-17 18:42:44

回答

0

幾點可以幫助:

  • 它是無效的C(C99除外)聲明「可變大小的數組」,如int data_blocks[ab];。您可能需要使用malloc()
  • (x & 0)總是等於0
  • if (count == number)沒有任何意義。
  • 你需要弄清楚如果沒有足夠的空閒位會發生什麼。
+2

可變大小的數組在C99中是合法的。 – 2010-10-17 18:18:30

+0

@tristopia:確實。但並非所有的C都是C99! – 2010-10-17 18:19:38

+0

C99是當前的標準。 – 2010-10-17 18:31:13

0

正如您所提到的,數組bit需要維護功能occupyDataBlocks()以外的狀態。對於這個程序,你可以在main()定義它們,並把它傳遞給函數作爲

int main() { 

    unsigned char bit[512/8];  // Note: unsigned 

    occupyDataBlocks(bit, 3); 
    occupyDataBlocks(bit, 3); 
} 

我仍然不清楚爲什麼int data_blocks[]陣列。如果您用更精確的要求和兩個示例更新您的問題,那麼我可能會提供更好的建議。

+0

謝謝。現在看代碼(在底部)。 ; d – user265767 2010-10-17 18:40:53

1

我不確定,你想要做什麼,閱讀你的代碼。 它太混亂或太倉迷。

1.)如果你想從多個循環中「跳出」,你可能想爲循環編寫一個輔助函數,而用「return」代替。

2.)我不確定你是否知道這一點:b ++的意思是:返回b的值,然後增加變量。

b++ equals: 
{int x=b; b=b+1; return x;} 

++b equals: 
{b=b+1; return b;} 

3.)運營商&和|和^是按位,& &和||和!是布爾運算符,隱式地將0/NULL轉換爲false/0,其他所有轉換爲true/1。因此,(x & 0)總是等於0,並且!(x & 0)等於1.

4。)我沒那麼肯定這一點,我的C-知識是不完整的:什麼是這個值:

((signed char)0xff) >> 1 == 0xff 
or 
((signed char)0xff) >> 1 == 0x7f 

字符是正式既未簽署字符也不是無符號的字符;它們是不同的類型,這可能類似於有符號或無符號的字符,具體取決於編譯器。

5)此代碼等於:

for(a,aa;b;c,cc)d,dd; 

{a;aa; while(b){d;dd;c;cc;} } 

使用的,而不是同時可能把事情說清楚,但對那些三個參數,應明確地用來把事情說清楚。對於編譯器來說,這不是那麼相關,而是給讀者。

6)的sizeof(char)的始終是1.你可能想要寫的是某事像這樣: (的sizeof(myarray的)/的sizeof(myarray的[0]))