Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] warunek zdarzenia i wyrzucanie bledu - wyciek pamieci?

mihau87 18 Kwi 2010 17:21 708 5
  • #1 18 Kwi 2010 17:21
    mihau87
    Poziom 11  

    Witam

    Zalaczam kod mojego programu. nie umiem dobrac poprawnego warunku spotkania kota i myszy zeby potem wypisal tekst i zakończył pętlę.

    Dodatkowo wywala błąd czasami - sądzę że to problem z tablica... ale nie umiem go znaleźć...

    Proszę o pomoc

    Code:
    #include <stdio.h>
    
    #include <stdlib.h>                               //rand i srand
    #include <time.h>                                //wykorzystywany przy srand


    #define X 12                                  //ilosc wierszy ekranu
    #define Y 60                                 // ilosc kolumn ekranu


    void menu();                             //ekran powitalny

    void widzowie();                        //obserwujace koty
    main()
    {
    char ekran[X][Y];                   //wywolanie tablicy
    int a,b;                                //do petli
    int w_k1=0;                             // zmienna wierszy kota
    int w_k2=0;                            // zmienna kolumn kota
    int w_m1=0;                           //zmienna wierszy myszy
    int w_m2=0;                           //zmienna kolumn myszy
    int temp;                                 // do tymczasowego przechowania wartosci


    menu();               // ekran powitalny

    for( a=0, w_k1=w_k2=0;a<a+1;a++/*,w_k1+=rand()%2,w_k2+=rand()%2*/)
    {
       for( a=0; a<X; a++)               // uzupelnianie tablicy pustymi znakami
    {
        for( b=0; b<Y; b++)
        ekran[a][b]=' ';   
    }

    srand(time(NULL));
    temp=rand()%12-6;
    w_k1=w_k1+temp;                            // losowanie pozycji myszy




    temp=rand()%8-4;
    w_k2+=temp;
    if(w_k1>X-4 || w_k1+1<0|| w_k1+4<0){w_k1=0;++w_k2;}
    if(w_k2>Y-7 || w_k2+6<0|| w_k2+7<0){w_k2=0;++w_k1;}

    //drukowanie kota
    ekran[1+w_k1][6+w_k2]='\\';
    ekran[1+w_k1][5+w_k2]='/';
    ekran[1+w_k1][1+w_k2]=')';
    ekran[2+w_k1][2+w_k2]='\\';
    ekran[2+w_k1][4+w_k2]='(';
    ekran[2+w_k1][6+w_k2]='\'';
    ekran[2+w_k1][7+w_k2]=')';
    ekran[3+w_k1][1+w_k2]='(';
    ekran[3+w_k1][4+w_k2]='/';
    ekran[3+w_k1][6+w_k2]=')';
    ekran[4+w_k1][2+w_k2]='\\';
    ekran[4+w_k1][3+w_k2]='(';
    ekran[4+w_k1][4+w_k2]='_';
    ekran[4+w_k1][5+w_k2]='_';
    ekran[4+w_k1][6+w_k2]=')';
    ekran[4+w_k1][7+w_k2]='|';

    // drukowanie myszy

    temp=rand()%4-2;
    w_m1+=temp;                          // losowanie pozycji myszy
    temp=rand()%6-2;
    w_m2+=temp;

    ekran[1+w_m1+4][4+w_m2+5]='_';
    ekran[1+w_m1+4][5+w_m2+5]='_';
    ekran[1+w_m1+4][6+w_m2+5]='_';
    ekran[2+w_m1+4][1+w_m2+5]='_';
    ekran[2+w_m1+4][2+w_m2+5]='_';
    ekran[2+w_m1+4][3+w_m2+5]='(';
    ekran[2+w_m1+4][4+w_m2+5]='_';
    ekran[2+w_m1+4][5+w_m2+5]='_';
    ekran[2+w_m1+4][6+w_m2+5]='_';
    ekran[2+w_m1+4][7+w_m2+5]='\'';
    ekran[2+w_m1+4][8+w_m2+5]='>';


    for(a=0; a<X;a++)      // drukowanie tablicy
    {
        for( b=0; b<Y; b++)
         printf("%c",ekran[a][b]);
        printf("\n");

    }
    printf("\n");
    widzowie();

    //warunek wygranej kota
    if(w_k1+2==w_m1+5 || w_k2+7==w_m2+6 || w_k2+5==w_m2+9){;system("cls");break;}

    //warunek wygranej kota
    else if(w_m1+7>X || w_m2>Y-14|| w_m1+4<0 || w_m2+8<0){system("cls");break;}


    _sleep(100);
    system("cls");                  // czyszczenie ekranu
    }

    //wypisnie tekstu przy spotkaniu
    if(w_k1+2==w_m1+5 || w_k2+5==w_m2+10 || w_k2+5==w_m2+9){printf("Kot zjadl mysz hahaha\n\n\n\n");}

    // wypisanie tekstu gdy mysz wygra
    if(w_m1>X-5 || w_m2>Y-14|| w_m1+4<0 || w_m2+8<0){printf("Mysz uciekla ]:->\n\n\n\n");}

    system("pause");

    }
    void menu()
    {
        printf("=======================================================\n");
        printf("                 Witam!!\n");
        printf("                 Pojekt 1\n");
        printf("  ()-()         'Kot i mysz'          |\\__/,|   ('\\\n");
        printf("  (o o)        by Michal Adamczyk  _. |o o  |_   ) )\n");
        printf(" ==\\o/==                          -(((---(((----------\n");
        printf("=======================================================\n\n\n");
        printf("Nacisnij spacje aby wlaczyc program\n\n");
        system("pause");
    }
    void widzowie()
    {

    printf("                      /^--^\\     /^--^\\     /^--^\\\n");
    printf("                      \\____/     \\____/     \\____/\n");
    printf("                     /      \\   /      \\   /      \\\n");
    printf("                    |        | |        | |        |\n");
    printf("                     \\__  __/   \\__  __/   \\__  __/\n");
    printf("|^|^|^|^|^|^|^|^|^|^|^|^\\ \\^|^|^|^/ /^|^|^|^|^\\ \\^|^|^|^|^|^|^|^|^|^|^|^|\n");
    printf("| | | | | | | | | | | | |\\ \\| | |/ /| | | | | | \\ \\ | | | | | | | | | | |\n");
    printf("########################/ /######\ \###########/ /#######################\n");
    printf("| | | | | | | | | | | | \\/| | | | \\/| | | | | |\\/ | | | | | | | | | | | |\n");
    printf("|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|\n\n");

    }

    0 5
  • #2 18 Kwi 2010 18:43
    utak3r
    Poziom 25  

    Co to jest?

    Code:
    for( a=0, w_k1=w_k2=0;a<a+1;a++/*,w_k1+=rand()%2,w_k2+=rand()%2*/)
    
    {
       for( a=0; a<X; a++)               // uzupelnianie tablicy pustymi znakami
    {
        for( b=0; b<Y; b++)
        ekran[a][b]=' ';            //uzupelnianie ostatniego elementy enterem
    }


    To jakiś bełkot, nie rozumiem, co chcesz w tych pętlach zrobić.... a już warunek a<a+1 kompletnie tutaj wszystko psuje.


    A co do pytania głównego, spróbuj jaśniej wyrazić, co chcesz.

    0
  • #3 18 Kwi 2010 19:14
    mihau87
    Poziom 11  

    warunek ten jest po to żeby pętla wykonywała się w niekończoność. i są dwa warunki przerwania jej:
    - spotkanie kota i myszy
    - mysz ucieka poza ekran

    petla którą pokazałeś ma na celu uzupełnienia pustej tablicy spacjami.
    a komentarz "uzupelnianie enterem" jest zbedny

    program na działać tak:
    1. losuje wspolrzedne kota i myszy
    2. tworzy tablice X x Y
    3. w tablicy zapisywane sa znaki kota i myszy wraz ze wspolrzednymi
    4. wszystko sie rusza do czasu az mysz nie wyjdzie poza ekran lub kot jej nie zlapie (dlatego nieskonczona petla)

    a potrzebuje:
    1. sprawdzenia dlaczego niekiedy wyskakuje blad programu
    2. poprawne warunki przerwania petli dla spotkania sie kota i myszy bo jakos nie wychodzi mi to :(

    0
  • #4 18 Kwi 2010 21:08
    utak3r
    Poziom 25  

    Ok, po kolei:

    Pętle nieskończone robimy tak:

    Code:

    while (1) // albo for (;;)
    {
      ......
      if (warunek_wyjscia)
      {
        break;
      }
      .....
    }


    Druga sprawa na początek, to instrukcje typu:

    Code:
    ekran[2+w_m1+4][8+w_m2+5]='>'; 


    Musisz upewnić się, że np. 2+w_m1+4 jest na pewno mniejsze od X - inaczej zaczniesz pisać poza zakresem tablicy, co zaskutkuje błędem.

    0
  • #5 19 Kwi 2010 14:32
    mihau87
    Poziom 11  

    tak juz sprawdzilem:)

    dzieki za pomoc! nie rozumiem jednak po co w ten sposob pisać tą petlę nieskończoną skoro moja też działa...

    Dzięki!

    0
  • #6 20 Kwi 2010 00:17
    utak3r
    Poziom 25  

    mihau87 napisał:
    nie rozumiem jednak po co w ten sposob pisać tą petlę nieskończoną skoro moja też działa...


    Dla czytelności kodu. Jak otworzysz źródło za pół roku, zrozumiesz.

    0