2015-05-12 118 views
0

我正在用C編寫一些代碼,在微處理器上的LCD屏幕上隨機顯示精靈。目前,當我運行這段代碼時,它會產生從上到下運行的8行代碼。所以它以隨機順序打印一些東西,但不是精靈。爲什麼是這樣?任何人都可以幫我嗎? (注:蘭特是在一個單獨的功能,工作正常接種,問題僅僅是內此代碼。)我的print_random_sprites函數有什麼問題?

void zombies() { 

    Sprite zombie_sprite; 
    Sprite * zombie_sprite_pointer = &zombie_sprite; 
    byte zombie_bitmap [] = { 
    BYTE(11100000), 
    BYTE(01000000), 
    BYTE(11100000) 
}; 

    for (int i = 0; i < 8; i++) { 
     Sprite * zombie_sprites = &zombie_sprites[i]; 
     init_sprite(zombie_sprites, rand()%76, rand()%42, 3, 3, zombie_bitmap); 
     } 
    create_zombies();  
} 

void create_zombies(Sprite * zombie_sprites) { 
    while(1) { 
    clear(); 
    draw_sprite(&zombie_sprites); 
    refresh(); 
    } 
    return 0; 
} 
+1

您已經在不提供參數的情況下調用'create_zombies()'。 –

+0

這行'Sprite * zombie_sprites =&zombie_sprites [i];'產生一個編譯器警告。正確的是:它是自引用的。 –

+0

隨機線現在看起來不同,但它仍然沒有顯示精靈 –

回答

0

的主要問題是,Sprite zombie_sprite只有一個對象。使這個對象數組,你可以開始看其他問題。接下來,對指向Sprite對象的指針會有一些混淆。爲了簡化一些事情,我們可以調整zombies函數中的變量,並對最佳實踐進行一些「整理」。

// Start by using a compile-time constant to define the number of zombies. 
// This could be changed to a vriable in the, once the simple case is working. 
#define NUMBER_OF_ZOMBIES 8 

void zombies() 
{ 
    // Eight zombies are required, so define an array of eight sprites. 
    Sprite zombie_sprites[NUMBER_OF_ZOMBIES]; 
    byte zombie_bitmap [] = 
    { 
     BYTE(11100000), 
     BYTE(01000000), 
     BYTE(11100000) 
    }; 

// Continued below... 

這使得該函數的其餘部分更容易初始化精靈。這一次,可以將指針指向數組中的i th元素。此外,您將看到create_zombies函數需要一個參數:Sprite對象的地址,因此將它傳遞給剛剛初始化的同一陣列中第一個精靈的地址。

再次,進行一些內部的,功能的其餘部分是這樣的:

// ...continued from above 

    for (int i = 0; i < NUMBER_OF_ZOMBIES; i++) 
    { 
     // Initialise the ith sprite using the address of its element 
     // in the zombie_sprites array. 
     init_sprite(&zombie_sprites[i], rand()%76, rand()%42, 
        3, 3, zombie_bitmap); 
    } 

    // Animate the zombies in the array. 
    create_zombies(&zombie_sprites[0]);  
} 

最後,create_zombies功能本身需要循環的微小變化,通過所有的精靈的數組中傳遞作爲其參數。此外,它的類型爲void它沒有return語句。

void create_zombies(Sprite * zombie_sprites) 
{ 
    while(1) 
    { 
     clear(); 

     // loop round drawing all of the sprites. 
     for(int zombie_index = 0; zombie_index < NUMBER_OF_ZOMBIES; zombie_index++) 
     { 
      draw_sprite(&zombie_sprites[zombie_index]); 
     } 

     refresh(); 
    } 
} 

未來的改進可能包括:

  • 更改NUMBER_OF_ZOMBIES是一個變量。
  • 使用mallocfree替換動態分配的陣列中的靜態陣列。
  • 用更復雜的抽象數據類型(如列表或雙向鏈表)替換數組,以便在運行時添加或刪除殭屍。
  • 重命名函數並重構每個被調用的地方。