Witam!!!
Napisałem baze danych w c do obsługi biblioteki(projekt na zaliczenie).
Wszystko na windowsie działa lecz po kompilacji gcc w linuksie dostaje następujacy błąd..
baza.c: In function ‘Dodaj’:
baza.c warning: incompatible implicit declaration of built-in function ‘malloc’
oczywiście stdlib dodany.
Poniżej kod programu:
#include <stdio.h>
#include <string.h>
typedef struct elementy //deklaracja struktury o nazwie "elementy"
{
int liczba_stron, rok_wydania, nr_wydania; //deklaracja zmiennych
char autor[20];
char tytul[20];
char wydawnictwo[20];
struct elementy *nastepnik; //wkaznik do struktury - nastepnik rekordu
struct elementy *poprzednik; //wkaznik do struktury - poprzednik rekordu
} rekord;
rekord *glowa; //glowa listy dwukierunkowej
rekord *ogon; //ogon listy dwukierunkowej
Dodaj()
{
int liczba_stron, rok_wydania, nr_wydania; //deklaracja zmiennych ze struktury
char autor[20], tytul[20], wydawnictwo[20];
rekord *nowy; //deklaracja wskaznika "nowy"
nowy=(rekord*)malloc(sizeof(rekord)); //przydzielenie pamieci o wielkosci "rekord" do wskaznika
printf("Podaj autora: ");
getchar();
gets(nowy->autor); //wczytanie zmiennych z klawiatury
printf("Podaj tytul: ");
gets(nowy->tytul);
printf("Podaj wydawnictwo: ");
gets(nowy->wydawnictwo);
printf("Podaj liczbe stron: ");
while (scanf("%d",&nowy->liczba_stron)!=1 || nowy->liczba_stron<0 ) //zabezpieczenie przed podaniem nieprawidlowych danych wejsciowych
{
printf("Nieprawidlowe dane wejsciowe! Sprawdz liczbe stron. Sprobuj ponownie.\n");
fflush(stdin);
}
printf("Podaj rok wydania: ");
while (scanf("%d",&nowy->rok_wydania)!=1 || nowy->rok_wydania>2009 || nowy->rok_wydania<0)
{
printf("Nieprawidlowe dane wejsciowe! Sprawdz rok wydania. Sprobuj ponownie.\n");
fflush(stdin);
}
printf("Podaj numer wydania: ");
while (scanf("%d",&nowy->nr_wydania)!=1)
{
printf("Nieprawidlowe dane wejsciowe! Sprobuj ponownie.\n");
fflush(stdin);
}
rekord *wsk;
wsk = (rekord*)malloc(sizeof(rekord));
wsk = ogon;
rekord *wsk2;
wsk2 = (rekord*)malloc(sizeof(rekord));
while(wsk->nastepnik != NULL) //wskaznik "wsk" wskazuje na ostatni rekord listy
{
wsk = wsk->nastepnik;
}
wsk2 = wsk->poprzednik; //przesuniecie nowo utworzonego rekordu na koniec listy
wsk->poprzednik = nowy;
nowy->nastepnik = wsk;
wsk2->nastepnik = nowy;
nowy->poprzednik = wsk2;
printf("Nowy rekord zostal dodany.\n");
}
Podglad()
{
rekord *wsk; //deklaracja wskaznika
wsk=(rekord *)malloc(sizeof(rekord));
wsk=glowa->nastepnik; //wskaznik "wsk" wskazuje na nastepnik glowy listy
int n=1;
printf(" |\tAutor\t\t|\tTytul\t\t|\tWydawnictwo | Liczba stron | Rok wydania | Nr Wydania |\n");
printf("----------------------------------------------------------------------------------------------------------------------\n");
while(wsk->nastepnik != NULL) //wyswietlanie rekordow
{
printf("%d | %-20s | %-20s | %-20s | %-12d | %-11d | %-14d |\n", n, wsk->autor, wsk->tytul, wsk->wydawnictwo, wsk->liczba_stron, wsk->rok_wydania, wsk->nr_wydania);
wsk=wsk->nastepnik;
n++;
}
}
Usun()
{
rekord *wsk;
wsk = (rekord*)malloc(sizeof(rekord));
wsk = glowa->nastepnik;
int d=0, n, m;
while(wsk->nastepnik != NULL) //liczenie rekordow
{
wsk=wsk->nastepnik;
d++;
}
if(d==0) //zabezpieczenie przed podaniem nieprawidlowych danych wejsciowych
{
printf("Baza rekordow jest pusta.\n");
return;
}
printf("Ktory rekord chcesz usunac ?\n");
getchar();
while(scanf("%d", &n)!=1 || n>d)
{
printf("Blad! Nieprawidlowe dane wejsciowe lub Nie ma takiego rekordu.\n");
fflush(stdin);
}
wsk=glowa->nastepnik;
for(m=1; m<n; m++)
{
wsk = wsk->nastepnik;
}
(wsk->poprzednik)->nastepnik = wsk->nastepnik; //nastepnikiem poprzednika rekordu do usuniecia staje sie nastepnik tego rekordu
(wsk->nastepnik)->poprzednik = wsk->poprzednik; //poprzednikiem nastepnika rekordu do usuniecia staje sie poprzednik tego rekordu
free(wsk); //zwolnienie obszaru pamieci
printf("Rekord %d zostal usuniety.\n", n);
}
Edytuj()
{
int liczba_stron, rok_wydania, nr_wydania;
char autor[20], tytul[20], wydawnictwo[20];
rekord *wsk;
wsk = (rekord*)malloc(sizeof(rekord));
wsk = glowa->nastepnik;
int d=0, n, m;
while(wsk->nastepnik != NULL)
{
wsk=wsk->nastepnik;
d++;
}
if(d==0)
{
printf("Baza rekordow jest pusta.\n");
return;
}
printf("Ktory rekord chcesz edytowac ?: "); //wybor rekordu do edytowania
while(scanf("%d", &n)!=1 || n>d || n<0)
{
printf("Blad! Nieprawidlowe dane wejsciowe lub Nie ma takiego rekordu.\n");
fflush(stdin);
}
wsk=glowa->nastepnik;
for(m=1; m<n; m++)
{
wsk = wsk->nastepnik;
}
printf("Ktore pole chcesz edytowac ?:\n"); //wybor pola do edytowania
printf("0- Anuluj\n1- Autor\n2- Tytul\n3- Wydawnictwo\n4- Liczba stron\n5- Rok wydania\n6- Nr wydania\n");
int i;
while(scanf("%d", &i)!=1 || i>6 || i<0)
{
printf("Blad! Nieprawidlowe dane wejsciowe lub Nie ma takiej opcji.\n");
fflush(stdin);
}
switch(i)
{
case 0: return;
case 1:
{
printf("Podaj autora: ");
getchar();
gets(wsk->autor);
break;
}
case 2:
{
printf("Podaj tytul: ");
getchar();
gets(wsk->tytul);
break;
}
case 3:
{
printf("Podaj wydawnictwo: ");
getchar();
gets(wsk->wydawnictwo);
break;
}
case 4:
{
printf("Podaj liczbe stron: ");
while (scanf("%d",&liczba_stron)!=1 || liczba_stron<0 )
{
printf("Nieprawidlowe dane wejsciowe! Sprawdz liczbe stron. Sprobuj ponownie.\n");
fflush(stdin);
}
wsk->liczba_stron = liczba_stron;
break;
}
case 5:
{
printf("Podaj rok wydania: ");
while (scanf("%d",&rok_wydania)!=1 || rok_wydania>2009 || rok_wydania<0)
{
printf("Nieprawidlowe dane wejsciowe! Sprawdz rok wydania. Sprobuj ponownie.\n");
fflush(stdin);
}
wsk->rok_wydania = rok_wydania;
break;
}
case 6:
{
printf("Podaj numer wydania: ");
while (scanf("%d",&nr_wydania)!=1)
{
printf("Nieprawidlowe dane wejsciowe! Sprobuj ponownie.\n");
fflush(stdin);
}
wsk->nr_wydania = nr_wydania;
break;
}
}
printf("Pole zostalo zmienione.\n");
}
Odczyt()
{
FILE *plik;
plik = fopen("dane.txt", "r"); //otwieranie pliku "dane.txt"
if(plik==NULL)
{
printf("Blad! - nie ma takiego pliku\n\n");
return;
}
else
{
while(feof(plik)==0) //dopoki nie jest to koniec pliku wykonuj petle
{
rekord *wsk; //deklaracja wskaznikow
wsk = (rekord *)malloc(sizeof(rekord));
rekord *bufor;
bufor = (rekord *)malloc(sizeof(rekord));
rekord *nowy;
nowy = (rekord*)malloc(sizeof(rekord));
fscanf(plik, "%s", &nowy->autor); //czytanie poszczegolnych elementow z pliku
fscanf(plik, "%s", &nowy->tytul);
fscanf(plik, "%s", &nowy->wydawnictwo);
fscanf(plik, "%d", &nowy->liczba_stron);
fscanf(plik, "%d", &nowy->rok_wydania);
fscanf(plik, "%d", &nowy->nr_wydania);
if(feof(plik)==0)
{
wsk=ogon;
while(wsk->nastepnik != NULL)
{
wsk = wsk->nastepnik;
}
bufor=wsk->poprzednik; //przesuwanie wczytanego rekordu na koniec listy
wsk->poprzednik = nowy;
nowy->nastepnik = wsk;
bufor->nastepnik = nowy;
nowy->poprzednik = bufor;
}
}
}
fclose(plik);
printf("Plik zostal odczytany.\n");
}
Zapisz()
{
FILE *plik;
plik = fopen("dane.txt", "w"); //otwieranie pliku "dane.txt"
rekord *wsk;
wsk = (rekord *)malloc(sizeof(rekord));
wsk = glowa->nastepnik;
while(wsk->nastepnik != NULL) //kazdy rekord zostaje zapisany od nowej linii
{
fprintf(plik, "%s ", wsk->autor); //zapisywanie poszczegolnych elementow rekordu
fprintf(plik, "%s ", wsk->tytul);
fprintf(plik, "%s ", wsk->wydawnictwo);
fprintf(plik, "%d ", wsk->liczba_stron);
fprintf(plik, "%d ", wsk->rok_wydania);
fprintf(plik, "%d\n", wsk->nr_wydania);
wsk = wsk->nastepnik;
}
printf("Zapisywanie zakonczone.\n");
fclose(plik);
}
Sortuj()
{
int i, j, n=0, opcja, d=0;
rekord *wsk;
wsk = (rekord*)malloc(sizeof(rekord));
rekord *bufor;
bufor = (rekord*)malloc(sizeof(rekord));
wsk=glowa->nastepnik;
while(wsk->nastepnik != NULL) //liczenie rekordow
{
wsk=wsk->nastepnik;
n++;
}
if(n==0)
{
printf("Baza rekordow jest pusta.\n");
return;
}
/*printf("Wybierz pole sortowania:\n");
printf("0- Wstecz\n1- Autor\n2- Tytul\n3- Wydawnictwo\n4- Liczba stron\n5- Rok wydania\n6- Numer wydania\n");
while(scanf("%d", &opcja)!=1 || opcja>n || opcja<0)
{
printf("Blad! Nieprawidlowe dane wejsciowe lub Nie ma takiej opcji. Sprobuj ponownie.\n");
fflush(stdin);
}
switch(opcja)
{
case 0: return;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
}*/
for(j=1; j<=(n-1); j++) //algorytm sortowania babelkowego
{
wsk = glowa->nastepnik;
for(i=1 ; i<=(n-1); i++)
{
if((wsk->nastepnik != NULL) && (strcmp(wsk->wydawnictwo, (wsk->nastepnik)->wydawnictwo)<0))
{
wsk = wsk->nastepnik;
}
else
{
memcpy(bufor, wsk->nastepnik, 70);
memcpy(wsk->nastepnik, wsk, 70);
memcpy(wsk, bufor, 70);
wsk = wsk->nastepnik;
}
}
}
printf("Sortowanie zakonczone.\n");
}
Czyszczenie_bazy()
{
glowa = (rekord* )malloc(sizeof(rekord));
ogon = (rekord* )malloc(sizeof(rekord));
glowa->nastepnik = ogon;
glowa->poprzednik = NULL;
ogon->nastepnik = NULL;
ogon->poprzednik = glowa ;
printf("Baza rekordow zostala wyczyszczona.\n");
}
main()
{
glowa = (rekord* )malloc(sizeof(rekord)); //zerowanie bazy rekordow
ogon = (rekord* )malloc(sizeof(rekord));
glowa->nastepnik = ogon;
glowa->poprzednik = NULL;
ogon->nastepnik = NULL;
ogon->poprzednik = glowa ;
int i; //wyswietlanie MENU
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
do
{
printf("Wybierz opcje z MENU: ");
while (scanf("%d",&i)!=1)
{
printf("Nieprawidlowe dane wejsciowe! Sprobuj ponownie.\n");
fflush(stdin);
}
switch(i)
{
case 1:
{
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
Dodaj();
break;
}
case 2:
{
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
Podglad();
break;
}
case 3:
{
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
Podglad();
Usun();
break;
}
case 4:
{
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
Podglad();
Edytuj();
break;
}
case 5:
{
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
Odczyt();
break;
}
case 6:
{
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
Zapisz();
break;
}
case 7:
{
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
Sortuj();
break;
}
case 8:
{
system("clear");
printf("================================================================================================\n");
printf("|MENU|1.Dodaj |2.Podglad |3.Usun |4.Edytuj |5.Odczyt |6.Zapisz |7.Sortuj |8.Czysc baze |9.Wyjdz |\n");
printf("================================================================================================\n");
Czyszczenie_bazy();
break;
}
case 9:
{
i=-1;
}
}
}
while(i>=0);
system("clear");
return 0;
}
z góry dzieki za pomoc :)