• 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.

Object Storage Arubacloud
0 głosów
840 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ź 607 wizyt
pytanie zadane 6 kwietnia 2018 w JavaScript przez JSJerry Początkujący (260 p.)
0 głosów
1 odpowiedź 563 wizyt
–1 głos
3 odpowiedzi 1,034 wizyt
pytanie zadane 9 września 2018 w C i C++ przez niezalogowany

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...