[C] Problem wkaznik do struktury w innej strukturze

0

Mam kod:

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

#define DL_IMIENIA 15
#define DL_NAZWISKA 30
#define DL_TYTULU 30
#define MAX_AUTOROW 5
#define MAX_KSIAZKI 5

struct autor {
             char imie[DL_IMIENIA];
             char nazwisko[DL_NAZWISKA];
             int rokurodzenia;
             };
struct ksiazka {
               char tytul[DL_TYTULU];
               int rok;
               float cena;
               struct autor *autorzy[MAX_AUTOROW];
               };

int ileksiazek(struct ksiazka **ksiazki);
void dodawanie(struct ksiazka **ksiazki,int ile);

main () {
     int wybor,ile;                       // Zmienna wyboru opcji z menu oraz ilosc ksiazek w bazie
     struct ksiazka *ksiazki[MAX_KSIAZKI]={0,};
     
     // Nieskonczona petla, program dziala, dopoki nie zostanie wybrana opcja wyjscia z menu
     for (;;) {   
     
     // Ile ksiazek jest juz w bazie
     ile=ileksiazek(&ksiazki);
     
     // Menu wyboru opcji
     printf("Obecnie w bazie znajduje sie %d ksiazek\n\n   Menu wyboru zadan:\n1. Dodaj ksiazke do bazy\n9. Wyjdz z programu\n\nTwoj wybor to:\n",ile);
     
     wybor=getch();
     system("cls"); // Czyszczenie ekranu dla zachowania estetycznosci
     
     switch(wybor) {
                   case '1': 
                            dodawanie(&ksiazki,ile);
                            break;
                   case '2':
                            //edytowanie();
                            break;
                   case '3':
                            //pokaz();
                            break;
                   case '4':
                            //usun();
                            break;
                   case '5':
                            //szukaj();
                            break;
                   case '6':
                            //zapisz();
                            break;
                   case '7':
                            //wczytaj();
                            break;
                   case '8':
                            //opis();
                            break;
                   case '9': 
                            exit(0);
                            break;
                   default: 
                            printf("Niepoprawny wybor\n\n"); // Co ma robic program jesli wybierzemy opcje ktora nie istnieje
                            break;
                   
                   } // Koniec funkcji switch
     
             } // Koniec petli for
     } // koniec main  

// Deklaracje funkcji

int ileksiazek (struct ksiazka **ksiazki) {
     int i=0,licznik=0;
     while(i<MAX_KSIAZKI) {
                          if(*ksiazki != 0) licznik++;
                          //printf("%d\n",*ksiazki);
                          i++;
                          ksiazki++;
                          }
     return licznik;
    }

void dodawanie(struct ksiazka **ksiazki,int ile) {
     ksiazki+=ile;
     //printf("%d",*ksiazki);
     *ksiazki=malloc(sizeof(struct ksiazka));
     struct autor *autor;
     autor=malloc(sizeof(struct autor));
     autor=(*ksiazki)->autorzy;

     printf("Podaj tytul ksiazki numer %d:\n", ile+1); //Przypisywanie tytulu
     while(strlen(gets((*ksiazki)->tytul))>DL_TYTULU) printf("Za dlugi\n");

     printf("Podaj imie autora ksiazki \"%s\":\n",(*ksiazki)->tytul); //Przypisywanie autora
     while(strlen(gets((*ksiazki)->autorzy[0]->imie))>DL_IMIENIA) printf("Za dlugie:\n",); // TU COS JEST ZLE
     printf("Podaj nazwisko autora ksiazki \"%s\":\n",(*ksiazki)->tytul); //Przypisywanie autora
     while(strlen(gets((*ksiazki)->autorzy[0]->nazwisko))>DL_IMIENIA) printf("Za dlugie:\n"); // TU COS JEST ZLE

     printf("Podaj rok urodzenia autora: %s %s:\n",(*ksiazki)->autorzy[0]->imie,(*ksiazki)->autorzy[0]->nazwisko);
     scanf("%d%*c",&(*ksiazki)->autorzy[0]->rokurodzenia);

     printf("\n\n%d\n\n",(*ksiazki)->autorzy[0]->rokurodzenia);
     }
 

W tych linijkach gdzie napisalem ze tam jest zle, gdy uruchamiam przez Debuggera bo wywala blad:
"W twoim programie zgłoszono naruszenie praw dostępu(błąd segmentacji)"

Wiecie moze co tam jest nie tak?

0

printf("Za dlugie:\n",);
Usuń przecinek.

Nie używaj gets(): http://www.gidnetwork.com/b-56.html

Nigdzie nie zwalniasz zaalokowanej pamięci.
Co się tutaj dzieje?

autor=malloc(sizeof(struct autor));
     autor=(*ksiazki)->autorzy;

struct autor *autor;
Typy raczej nazywaj z wielkiej litery, dzięki czemu zmienna mająca taką samą nazwę jak typ, lecz zapisana z małej litery, nie zmniejsza czytelności i możliwości łatwej refaktoryzacji kodu za pomocą różnych narzędzi (chociażby wbudowanych w IDE).

Kompilacja Twojego kodu wyrzuca mi:

cc1.exe: warnings being treated as errors
test.c:26:1: error: return type defaults to 'int'
test.c: In function 'main':
test.c:34:6: error: passing argument 1 of 'ileksiazek' from incompatible pointer type
test.c:23:5: note: expected 'struct ksiazka **' but argument is of type 'struct ksiazka * (*)[5]'
test.c:39:6: error: implicit declaration of function 'getch'
test.c:39:6: error: nested extern declaration of 'getch'
test.c:44:29: error: passing argument 1 of 'dodawanie' from incompatible pointer type
test.c:24:6: note: expected 'struct ksiazka **' but argument is of type 'struct ksiazka * (*)[5]'
test.c: In function 'dodawanie':
test.c:98:11: error: assignment from incompatible pointer type
test.c:104:89: error: expected expression before ')' token

Dodając #include <conio.h> zostaje:

test.c:27:1: error: return type defaults to 'int'
test.c: In function 'main':
test.c:35:6: error: passing argument 1 of 'ileksiazek' from incompatible pointer type
test.c:24:5: note: expected 'struct ksiazka **' but argument is of type 'struct ksiazka * (*)[5]'
test.c:45:29: error: passing argument 1 of 'dodawanie' from incompatible pointer type
test.c:25:6: note: expected 'struct ksiazka **' but argument is of type 'struct ksiazka * (*)[5]'
test.c: In function 'dodawanie':
test.c:99:11: error: assignment from incompatible pointer type
test.c:105:89: error: expected expression before ')' token

O tej porze nie mam zamiaru się w to wczytywać, ale wydaje mi się, że powinieneś przemyśleć co i jak chcesz zrobić i zacząć od początku, co jakiś czas kompilując i sprawdzając kod. ;)

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