Funkcja nie wykonuje się w całości w zależności od zdarzenia

1

Witam
Mam dość nietypowy problem, właściwie pytam bardziej w celu zrozumienia co tu się dzieje, bo jest to dość dziwne i niesymetryczne.
Mianowicie piszę w builderze prostego arkanoida i po przegranej są dwa sposoby na zresetowanie planszy: kliknięcie na napis "game over" (gameoverMouseUp) oraz naciśnięcie dowolnego klawisza (FormKeyDown).
Każdy z tych sposobów po prostu uruchamia funkcję restart() która w obu przypadkach wykonuje się tak samo aż do paru ostatnich linii kodu w których zawarta jest pętla ustawiająca Visible wszystkich bloków na true.
W przypadku gdy naciskamy myszką na "game over" wszystko się wykonuje poprawnie, zaś gdy naciskamy klawisz to wszystko (albo większość, nie sprawdzałem każdej linijki, jednak np paletka i piłka wracają na pozycję startową, co dowodzi że funkcja faktycznie została uruchomiona) oprócz tej ostatniej pętli działa.
Nie rozumiem co ma na to wpływ, funkcja jest wywoływana jako pierwsza w zdarzeniu, nawet nie ma żadnych argumentów a jedyne czym się te sytuacje różnią to event który ją uruchamia.

void restart()
{
   hor_unit=HOR_UNIT;
   ver_unit=VER_UNIT;

   Form1->paddleMoveLeft->Interval=PADDLE_FREQ;
   Form1->paddleMoveRight->Interval=PADDLE_FREQ;
   Form1->ballMove->Interval=BALL_FREQ;


   int pleft=Form1->ClientWidth/2-Form1->paddle->Width/2;
   int ptop=Form1->ClientHeight*27/32;

   Form1->paddle->Left=pleft;
   Form1->paddle->Top=ptop;

   Form1->ball->Top=ptop-Form1->ball->Height*2;
   Form1->ball->Left=pleft+Form1->paddle->Width/2-Form1->ball->Width/2;

   Form1->gameover->Visible=false;
   Form1->ball->Visible=true;
   Form1->ballMove->Enabled=true;

   TImage * bricks[NUM_BLOCKS]={Form1->brick1,Form1->brick2,Form1->brick3,Form1->brick4,Form1->brick5,Form1->brick6,Form1->brick7,Form1->brick8,Form1->brick9,Form1->brick10,Form1->brick11,Form1->brick12};


   for(int i;i<NUM_BLOCKS;i++)                       //NUM_BLOCKS zostało zdefiniowane na samym początku pliku .h (tuż po includach)
        {
        bricks[i]->Visible=true;
        Form1->Button1->Visible=true;      //tą linię dodałem aby sprawdzić kiedy pętla się wykona, a kiedy nie. Wedle przypuszczeń button pojawiał się tylko przy kliknięciu myszką
        }
                                                               //gdy linię z buttonem dodałem tuż przed oraz tuż po pętli, przycisk pojawiał się w każdym przypadku
}
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
 if(gameover->Visible==true&&Key!=VK_LEFT&&Key!=VK_RIGHT)restart();                          // nawet gdy warunek uprościłem do if(gameover->Visible==true)restart();  nic się nie zmieniło
 if(Key == VK_LEFT)paddleMoveLeft->Enabled=true;                                                   //próbowałem także przenieść do innego eventu: OnKeyUp oraz OnKeyPress, jednak nic się nie zmieniło
 if(Key == VK_RIGHT)paddleMoveRight->Enabled=true;
}
void __fastcall TForm1::gameoverMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
 restart();                                               //a tu jakoś wszystko zawsze działa
}
5
for(int i;i<NUM_BLOCKS;i++) 

Jaką wartość ma i? UB :​)

1 użytkowników online, w tym zalogowanych: 0, gości: 1