• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[ANSI C] Struktura jako argument funkcji.

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,054 wizyt
pytanie zadane 8 kwietnia 2018 w C i C++ przez giedymin33 Początkujący (290 p.)

Witam, potrzebuję uzyskać informację jak przekazać strukturę do funkcji, która będzie daną strukturę wypełniała?

Struktura [i]plytacd[/i] zawiera to co zawiera. Ma być możliwość utworzenia 10 takich płyt CD, w której będą informacje nt tytułu płyty, nazwiska wykonawcy itp. I potem user podaje ile piosenek chce dodać do tej płyty(MAX 25). Wtedy zrobiłem strukturę TUtwor w strukturze plytacd(można tak?).

struct plytacd
{
    char tytul[15];
    char nazwisko_wykonawcy[25];
    char wydawca[25];
    int rok_wydania;
    int cena;

struct TUtwor
{
    char autor_utworu, wykonawca, czas_trwania;
}tab_utwory[25];



}tab_plyty[10];

Następnie mam coś takiego:

int wypelnianie_inf_plyt(???)
{
    int ilosc=0;
    int i=0;
    int j=0;
    int ilepiosenek=0;


    printf("Ile plyt chcesz dodac?\n");
    scanf("%d",&ilosc);

    while (i!=ilosc)
    {
      printf("Podaj tytul [%d] plyty: \n",i+1);
      scanf("%c",&plytacd[i].tytul);

      printf("Podaj nazwisko wykonawcy plyty : \n",plytacd.tytul);
      scanf("%c",&plytacd[i].nazwisko_wykonawcy);

      printf("Podaj wydawce plyty '%c': \n",plytacd.tytul);
      scanf("%c",&plytacd[i].wydawca);

      printf("Podaj rok wydania plyty '%c': \n",plytacd.tytul);
      scanf("%c",&plytacd[i].rok_wydania);

        printf("Podaj cene plyty '%c': \n",plytacd.tytul);
      scanf("%c",&plytacd[i].cena);

      printf("Dodano plyte nr [%d]!\n\n",i+1);

      printf("Ile piosenek chcesz dodac do plyty '%c'!\n\n",plytacd.tytul);
      scanf("%d",&ilepiosenek);

            while (j!=ilepiosenek)
            {

/* tutaj mam wypełniać piosenki tj. tytul, czast trwania*/

            }



    }


}

Nie wiem w jaki sposób potem zrobić, żeby funkcja mogła pracować na strukturze.
Nie wiem, czy dobrze zrobiłem, jeżeli chodzi o deklaracje tablic dla 10 struktur plytacd i 25 dla TUtwor.

Jak potem całość wypisać?

1 odpowiedź

0 głosów
odpowiedź 8 kwietnia 2018 przez RafalS VIP (122,820 p.)

Można zrobić strukture w strukturze i można zainicjować obiekt struktury zaraz po jej definicji, ale w tym przypadku nie wiem co chcesz przez to osiągnąć. Jeśli te struktury są zdefiniowane w mainie, to nie przekażesz ich do funkcji, bo w zakresie globalnym struktura plytacd nie jest widoczna, z drugiej strony jeśli ten pierwszy kod jest w obszarze globalnym (przed mainem) to masz odrazu zmienną globalną, której nie trzeba przekazywać do funkcji.
Sugerowałbym inne rozwiązanie - zdefiniuj strukture plytacd w obszarze globalnym, a jej instancje stwórz w obszarze lokalnym w ten sposób:

struct plytacd tab_plyty[10];

Wtedy do funkcji możesz przekazać ją tak samo jak przekazujesz dowolną tablicę, czyli:
 

void fun(struct plytacd plyty[]){}

I możesz też pyknąć typedefa, żeby nie musieć za każdym razem pisać struct nazwa_struktury, tylko samo nazwa_struktury. Wystarczy po definicji struktury dodać taki kod:

typedef struct plytacd plytacd;

i wtedy nazwa plytacd będzie zachowywała się jak każdy inny typ (int, char...).

Poza tym masz błąd w wewnętrznej strukturze, bo autor utworu to char a nie tablica charów.

Dodatkowo w pętlach while stosowałbym < zamiast !=, bo "<" jest bardziej odporne na błędy, jeśli jakimś cudem licznik przeskoczy Ci o 2 to pętla nigdy się nie skończy.

 

Podobne pytania

0 głosów
1 odpowiedź 677 wizyt
pytanie zadane 6 kwietnia 2018 w JavaScript przez JSJerry Początkujący (260 p.)
0 głosów
1 odpowiedź 804 wizyt
–1 głos
3 odpowiedzi 1,468 wizyt
pytanie zadane 9 września 2018 w C i C++ przez niezalogowany

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

62,657 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...