logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Funkcja w C. Program się kompiluje, ale wiesza się przy uruchomieniu.

maciek11 04 Mar 2007 11:56 1667 8
REKLAMA
  • #1 3641659
    maciek11
    Poziom 17  
    Posty: 299
    Pomógł: 3
    Ocena: 7
    Napisałem krótki programik w Dev-C++, lecz w poniższej funkcji coś nie działa. Program się kompiluje, ale przy uruchomieniu wiesza. Wiem że pewnie jakiś głupi błąd zrobiłem, więc proszę o wyrozumiałość :D

    int srednia(int tab[], int ilosc)
    {
    int i;
    int tmp=0;
    for (i=1;i=ilosc;i++)
    {
    tmp=tmp+tab[i];
    printf(tab[i],"%d");
    }
    tmp=tmp/ilosc;
    printf(tmp, "%d");
    return(tmp);
    }
  • REKLAMA
  • #2 3641768
    x3r
    Poziom 18  
    Posty: 126
    Pomógł: 32
    Ocena: 2
    
     for (i=1;i=ilosc;i++) 
    


    Zamien na

    
     for (i=1;i<=ilosc;i++)
    


    "=" to operator przypisania i zawsze bedzie zwracal prawde wiec Twoja petelka bedzie leciec bez konca. Z drugiej strony jak dasz operator porownania "==" tak jak to zapewne chciales zrobic to petla nawet nie zacznie dzialac bo warunek na wstepie da false.

    A jezeli chcesz zeby to dzialalo poprawnie procz tego ze wogole bedzie dzialac to zrob tak:

    
     for (i=0;i<=ilosc-1;i++)
    


    indeksowanie tablic w C/C++ zaczyna sie od 0. A tak pozatym to pamietaj ze wynikiem dzielenia nie zawsze jest liczba calkowita...

    pozdrawiam
  • #3 3641847
    maciek11
    Poziom 17  
    Posty: 299
    Pomógł: 3
    Ocena: 7
    Pętle zmieniłem zgodnie z tym co kolega napisał. Niestety problem zawieszającego się programu występuje nadal. Gdzie szukać przyczyny?
  • REKLAMA
  • #4 3642439
    marmur99
    Poziom 17  
    Posty: 285
    Pomógł: 5
    Ocena: 4
    Te dwie rzeczy dziwnie wygladaja:
    maciek11 napisał:

    printf(tab[i],"%d");
    printf(tmp, "%d");

    Ja bym raczej napisal:
    printf("%d", tab[i]);
    printf("%d", tmp);

    Marmur99
  • REKLAMA
  • #5 3643907
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    proponuję:
    1. kleić cały kod programu
    2. użyć debuggera i przechodzić przez program krok po kroku, obserwując gdzie się wiesza (czy najpewniej zapętla)
  • #6 3644113
    maciek11
    Poziom 17  
    Posty: 299
    Pomógł: 3
    Ocena: 7
    Dzięki Marmur99. Poprawiłem printf-y. Program juz cos liczy, ale pokazuje jakieś 4 ogromne liczby.
  • REKLAMA
  • #8 3644843
    marmur99
    Poziom 17  
    Posty: 285
    Pomógł: 5
    Ocena: 4
    gol:
    nie, na pewno nie.
    Podajesz albo 'int * tab' albo 'int tab[]'.
    Oba wyrazenia to pointer do pierwszego elementu tablicy.

    Marmur99
  • #9 3645355
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Na podstawie tego co niżej podaję,możesz napisać program. On liczy średnią z dowolnych liczb, nie muszą być całkowite:

    #include <iostream>
    #include <conio.h>
    using namespace std;
    int ilosc,i;
    float tab[20],tmp=0.0;
    float srednia(int ilosc)
    {

    for (i=0;i<ilosc;i++)
    tmp=tmp+(tab[i]);
    tmp=tmp/ilosc;
    return(tmp);
    }
    main()
    {
    cout<<"podaj ilosc liczb z ktorych policzysz srednia max 20 ";cin>>ilosc;
    for(i=0;i<ilosc;i++)
    {
    cout<<"podaj "<<i+1<<" liczbe ";
    cin>>tab[i];
    }
    srednia(ilosc);
    cout<<"srednia= "<<tmp;
    getch();
    }

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z funkcją w języku C, która kompiluje się, lecz zawiesza program podczas uruchomienia. Główną przyczyną jest błąd w pętli for, gdzie zamiast operatora porównania użyto operatora przypisania, co powodowało nieskończoną pętlę. Poprawiono warunek pętli na prawidłowy zakres indeksów tablicy (od 0 do ilosc-1). Dodatkowo wskazano błędy w użyciu funkcji printf, gdzie argumenty były podawane w niewłaściwej kolejności. Zaproponowano użycie debuggera do śledzenia działania programu. Wskazano również, że deklaracja tablicy jako int tab[] lub int *tab jest równoważna. Na koniec przedstawiono przykładowy program w C++ z poprawnym obliczaniem średniej liczb zmiennoprzecinkowych, z uwzględnieniem poprawnego indeksowania i wczytywania danych od użytkownika.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA