Struktury – co jest nie tak z funkcją "wyswietlPostacie"?

0

Witam,
mógłby mi ktoś wytłumaczyć co jest nie tak z funkcją "wyswietlPostacie" ?
Nie za bardzo jeszcze rozumiem odwołania między strukturami robię to wszystko metodą prób i błędów.

#include <stdio.h>
#include <stdlib.h>

#define MAX_NAZWA   10

struct Data     // STRUKTURY
{
    int dzien;
    int miesiac;
    int rok;
};

struct Postac
{
    char nazwa[ MAX_NAZWA ];
    int sila;
    int zrecznosc;
    struct Data data_utworzenia;
    int szybkosc;
    int id_gracza;
};

struct Postacie
{
    struct Postac postacie[20];
    int liczba_postaci;
};


void wczytajPostacie(struct Postacie *postacie);
void wczytajPostac(struct Postac *postac) ;
float obliczSredniaSzybkosc(struct Postacie * postacie );
void wyswietlPostacie(struct Postacie postacie );


void obliczMaxMinSzybkosc(struct Postacie * postacie, int * max, int * min )
{
    int i;

    * max = postacie->postacie[0].szybkosc;
    * min = postacie->postacie[0].szybkosc;

    for(i=1; i < postacie->liczba_postaci; ++i)
    {
        if (postacie->postacie[i].szybkosc > * max)
             * max = postacie->postacie[i].szybkosc;

        if (postacie->postacie[i].szybkosc < * min)
             * min = postacie->postacie[i].szybkosc;
    }
}


int main()
{
    struct Postacie postacie;

    wczytajPostacie(&postacie);

    int maxSzybkosc, minSzybkosc;
    obliczMaxMinSzybkosc(&postacie, & maxSzybkosc, & minSzybkosc);
    printf("Maksymalna szybkosc: %d\n", maxSzybkosc);
    printf("Minimalna szybkosc: %d\n", minSzybkosc);

    wyswietlPostacie( postacie );
    return 0;
}

 void wczytajPostacie(struct Postacie *postacie)
{

    printf( "Podaj liczbe postaci:");
    scanf( "%d", & (postacie->liczba_postaci) );

    for( int i = 0; i < postacie->liczba_postaci; ++i )
        wczytajPostac(& (postacie->postacie[i]) );
}

 void wczytajPostac(struct Postac *postac)
{

    printf("Wczytywanie postaci\n");
    printf( "\tnazwa:");
    scanf( "%s", postac->nazwa);
    printf( "\tsila:");
    scanf( "%d", &postac->sila);
    printf( "\tzrecznosc:");
    scanf( "%d", &postac->zrecznosc);
    printf( "\tszybkosc:");
    scanf( "%d", & (postac->szybkosc));
    printf( "\tID gracza:");
    scanf( "%d", & (postac->id_gracza));



}



float obliczSredniaSzybkosc(struct Postacie * postacie )
{
    int suma = 0;
    for (int i=0; i < postacie->liczba_postaci; ++i)
    {
        suma += postacie->postacie[i].szybkosc;
    }
    return (float)suma/(float)(postacie->liczba_postaci);
}

void wyswietlPostacie(struct Postacie postacie)
{
    for (int i=0; i < Postac.postacie->liczba_postaci; ++i)
        {
            printf("Postac[%d] %s",i,Postac.nazwa);
            printf("\tSila %d",&Postac.sila);
            printf("\tZrecznosc %d",&Postac.zrecznosc);
            printf("\tSzybkosc %d",&Postac.szybkosc);
            printf("\tID gracza %d",&Postac.id_gracza);
        }

    // praca domowa wyœwietliæ dane
    // w pêtli wywo³aæ funkcjê wyswietlPostac( struct Postac postac)
}
||=== Build file: "no target" in "no project" (compiler: unknown) ===|
|In function 'wyswietlPostacie':|
118|error: 'Postac' undeclared (first use in this function)|
118|note: each undeclared identifier is reported only once for each function it appears in|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

2

Tak jak pisze, nie masz zdefiniowanej zmiennej 'Postac', za to masz zmienną 'Postacie'.

Powinno byc tak:
for (int i=0; i < postacie.liczba_postaci; ++i)

No i w pętli też musisz analogicznie zmienić

2

Nie testując kodu, ale powinno być: postacie.liczba_postaci zamiast Postac.postacie. Nie Sądzisz, że ta struktura postacie to jest overkill? Wystaczyłoby zadeklarować tablicę struktur typu Postac, i referencję do niej przesyłać między funkcjami.

0
lion137 napisał(a):

Nie testując kodu, ale powinno być: postacie.postacie zamiast Postac.postacie. Nie Sądzisz, że ta struktura postacie to jest overkill? Wystaczyłoby zadeklarować tablicę struktur typu Postac, i referencję do niej przesyłać między funkcjami.

Niestety nie ja ten kod pisałem, wykładowca na studiach tak nas prowadzi i niestety innej drogi przez to nie ma :/

2

Akurat ten błąd odnosi się do funkcji wyswietlPostacie, było tam kilka problemów. Tutaj wersja kompilująca się (co nie oznacza, że tak powinna wyglądać implementacja):

void wyswietlPostacie(struct Postacie postacie)
{
    for (int i = 0; i < postacie.liczba_postaci; ++i)
    {
        printf("Postac[%d] %s", i, postacie.postacie[i].nazwa);
        printf("\tSila %d", postacie.postacie[i].sila);
        printf("\tZrecznosc %d", postacie.postacie[i].zrecznosc);
        printf("\tSzybkosc %d", postacie.postacie[i].szybkosc);
        printf("\tID gracza %d", postacie.postacie[i].id_gracza);
    }
}

Moja rada - nie programuj metodą prób i błędów. Nie tędy droga. Przysiądź i naucz się solidnych podstaw C. Zobaczysz wtedy, że Twój kod, który wkleiłeś ma jeszcze sporo niespodzianek.

0
rrowniak napisał(a):

Akurat ten błąd odnosi się do funkcji wyswietlPostacie, było tam kilka problemów. Tutaj wersja kompilująca się (co nie oznacza, że tak powinna wyglądać implementacja):

void wyswietlPostacie(struct Postacie postacie)
{
    for (int i = 0; i < postacie.liczba_postaci; ++i)
    {
        printf("Postac[%d] %s", i, postacie.postacie[i].nazwa);
        printf("\tSila %d", postacie.postacie[i].sila);
        printf("\tZrecznosc %d", postacie.postacie[i].zrecznosc);
        printf("\tSzybkosc %d", postacie.postacie[i].szybkosc);
        printf("\tID gracza %d", postacie.postacie[i].id_gracza);
    }
}

Moja rada - nie programuj metodą prób i błędów. Nie tędy droga. Przysiądź i naucz się solidnych podstaw C. Zobaczysz wtedy, że Twój kod, który wkleiłeś ma jeszcze sporo niespodzianek.

Ok faktycznie kompiluje się, wkleiłem funkcje do main'a ale mimo to nie wyświetliły mi się postacie. Staram się zrozumieć ten kod rozpisałem sobie struktury na kartce mniej więcej tak jak niżej

Data
{ 
  dzień
  miesiąc
  rok
{

Postac
{
  nazwa
  sila
  zrecznosc
  struct Data
  szybkosc
  id_gracza
}

Postacie
{
  struct Postac postacie
  liczba postaci
}


I teraz moje pytania:

  1. Dlaczego wszystko odwołania wyglądają tak || postacie.postacie[i].nazwa || skoro struktura nazywa się Postacie? Czy nie powinny wyglądać tak || Postacie.postacie[i].nazwa || ?
  2. Całość w takiej formie jak mi podałeś skompilowała się prawidłowo jednak funkcja nie działa po wklejeniu jej do main'a? Mógłbyś mnie nakierować na błąd który to powoduje?
1

"Dlaczego wszystko odwołania wyglądają tak || postacie.postacie[i].nazwa || skoro struktura nazywa się Postacie? Czy nie powinny wyglądać tak || Postacie.postacie[i].nazwa || ?"
Nie, Postacie to nazwa typu, do niej sie nie Odwołujesz, a jego konkretny element to postacie.

0

Co dokładnie nie działa? Nie wywołuje się? Czy też może wywołuje się ale bez danych postaci?

Jeśli to pierwsze to bardzo prawdopodobne, że postacie.liczba_postaci = 0;

I tak przypuszczam, że to będzie to. Musisz ustawić poprawną liczbę postaci, ponieważ teraz wynosi zero i pętla for się nie uruchamia.

0

Wklejam jeszcze raz kod po poprawce wszystko pięknie działa oprócz wartości zmiennych.

#include <stdio.h>
#include <stdlib.h>
#define MAX_NAZWA   10



struct Data     // STRUKTURY
{
    int dzien;
    int miesiac;
    int rok;
};

struct Postac
{
    char nazwa[ MAX_NAZWA ];
    int sila;
    int zrecznosc;
    struct Data data_utworzenia;
    int szybkosc;
    int id_gracza;
};

struct Postacie
{
    struct Postac postacie[20];
    int liczba_postaci;
};


void wczytajPostacie(struct Postacie *postacie);
void wczytajPostac(struct Postac *postac) ;
float obliczSredniaSzybkosc(struct Postacie * postacie );
void wyswietlPostacie(struct Postacie postacie );


void obliczMaxMinSzybkosc(struct Postacie * postacie, int * max, int * min )
{
    int i;

    * max = postacie->postacie[0].szybkosc;
    * min = postacie->postacie[0].szybkosc;

    for(i=1; i < postacie->liczba_postaci; ++i)
    {
        if (postacie->postacie[i].szybkosc > * max)
             * max = postacie->postacie[i].szybkosc;

        if (postacie->postacie[i].szybkosc < * min)
             * min = postacie->postacie[i].szybkosc;
    }
}


int main()
{
    struct Postacie postacie;

    wczytajPostacie(&postacie);

    int maxSzybkosc, minSzybkosc;
    obliczMaxMinSzybkosc(&postacie, & maxSzybkosc, & minSzybkosc);
    printf("Maksymalna szybkosc: %d\n", maxSzybkosc);
    printf("Minimalna szybkosc: %d\n", minSzybkosc);

    wyswietlPostacie(postacie);

    return 0;
}

 void wczytajPostacie(struct Postacie *postacie)
{

    printf( "Podaj liczbe postaci:");
    scanf( "%d", & (postacie->liczba_postaci) );

    for( int i = 0; i < postacie->liczba_postaci; ++i )
        wczytajPostac(& (postacie->postacie[i]) );
}

 void wczytajPostac(struct Postac *postac)
{

    printf("Wczytywanie postaci\n");
    printf( "\tnazwa:");
    scanf( "%s", postac->nazwa);
    printf( "\tsila:");
    scanf( "%d", &postac->sila);
    printf( "\tzrecznosc:");
    scanf( "%d", &postac->zrecznosc);


    // w szczególnoœci datê utworzenia - dodaæ funkcjê
    //struct Data wczytajDate();
   //&postac.data_utworzeni) = wczytajDate();

    printf( "\tszybkosc:");
    scanf( "%d", & (postac->szybkosc));
    printf( "\tID gracza:");
    scanf( "%d", & (postac->id_gracza));



}



float obliczSredniaSzybkosc(struct Postacie * postacie )
{
    int suma = 0;
    for (int i=0; i < postacie->liczba_postaci; ++i)
    {
        suma += postacie->postacie[i].szybkosc;
    }
    return (float)suma/(float)(postacie->liczba_postaci);
}

void wyswietlPostacie(struct Postacie postacie)
{
    for (int i=0; i < postacie.liczba_postaci; ++i)
        {
            printf("\nPostac[%d] %s",i,postacie.postacie[i].nazwa);
            printf("\nSila %d",&postacie.postacie[i].sila);
            printf("\nZrecznosc %d",&postacie.postacie[i].zrecznosc);
            printf("\nSzybkosc %d",&postacie.postacie[i].szybkosc);
            printf("\nID gracza %d\n",&postacie.postacie[i].id_gracza);
        }

    // praca domowa wyœwietliæ dane
    // w pêtli wywo³aæ funkcjê wyswietlPostac( struct Postac postac)
}

title

1

Po co te ampersandy dla printf?
Jakbyś przeczytał ostrzeżenia kompilatora i potraktował poważnie, to byś od razu wiedział, co jest nie tak.
na dodatek przekazujesz strukturę przez wartość, powinno być: void wyswietlPostacie(struct Postacie *postacie)

0
MarekR22 napisał(a):

Po co te ampersandy dla printf?
Jakbyś przeczytał ostrzeżenia kompilatora i potraktował poważnie, to byś od razu wiedział, co jest nie tak.
na dodatek przekazujesz strukturę przez wartość, powinno być: void wyswietlPostacie(struct Postacie *postacie)

Faktycznie pousuwałem zbędne rzeczy i wszystko śmiga dziękuję wszystkim za pomoc :)

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