C podzial na pliki w dev 5.5.2.

0

Witam

Miałem za zadanie stworzenie prostej bazy danych w C. Uporałem się ze wszystkim i przy dzieleniu kodu na pliki mam problemy. Przed podziałem program kompiluje się bez nawet ostrzeżeń, natomiast po podziale jest masa błędów.
Gdyby ktoś wiedział co jest nie tak w tym.
Usunąłem większą cześć kodu głównego pliku, aby nie było aż tak wiele scrolowania. Oczywiście najpierw wybrałem stworzenie projektu, a później po kolei dodawałem kolejne pliki do projektu. Błędy pojawiają się w pliku obliczeniowe.c w linijce: "el_listy *wsk=poczatek;" a dalej to już jest ich pełno. Zupełnie tak, jakby w innych plikach nie było "widać" struktury.

główny plik:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "obliczeniowe.h"
#include "obsluga.h"

typedef struct element
{
	struct element *next;  //wskaznik do nastepnego elementu na liscie
	char *imie;
	char *nazwisko;
	char *kierunek;
	int rok;
	int nr_albumu;
	int wiek;
} el_listy;

el_listy *dodaj;
el_listy *poczatek=NULL;  // wskazniki do poczatku i konca listy
el_listy *koniec=NULL;
int lp = 0;

obliczeniowe.h

#ifndef obliczeniowe_h
#define obliczeniowe_h

void wyszukiwanie(int w);
void sortowanie(int z);

#endif

obliczeniowe.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "obliczeniowe.h"

void wyszukiwanie(int w)
{
	int i=0,p,blad;
	char check[20];
	char ch[20];
	fprintf(stdout, "\n\n Podaj szukana wartosc: "); 
	if(w==3 || w==5 || w==6)  //w zaleznosci jaka opcje wybralismy bedziemy wczytywac albo int albo char
		while(fscanf(stdin, "%d", &p) != 1) //dopóki nie uda się wczytać
		{
			czerwony();
	    	fprintf(stdout, " Bledne wprowadzenie danych. \n");
	    	bialy();
	    	fprintf(stdout, " Podaj szukana wartosc: ");
	  		while((blad = getchar()) != '\n' && blad != EOF);
		}
	if(w==1 || w==2)
		fscanf(stdin, "%s",&check);
			if(check[0]>96 && check[0]<123)
			check[0]=check[0]-32;
	if(w==4)
		fscanf(stdin, "%s",&ch);
			if(ch[0]>64 && ch[0]<91)
			ch[0]=ch[0]+32;	
		
		
	el_listy *wsk=poczatek;
	while(wsk->next!=NULL)
	{
		switch(w)
		{
			case 1:
			{	
				if(strcmp(poczatek->imie, check) != 0)  //sprawdzamy czy glowa listy jest szukanym elementem, jesli nie usuwamy ja
				{
					el_listy *usuwany=poczatek;
					poczatek=usuwany->next;
					free(usuwany);  //zwalniamy pamiec
					wsk=poczatek;
				}
       		
				if(strcmp(wsk->next->imie, check) != 0)  // to samo dla pozostałych elementów
				{
					el_listy *usuwany=wsk->next;
					wsk->next=usuwany->next;
					free(usuwany);  //zawlniamy pamiec
				}	
				else
				wsk=wsk->next;
		
			} break;
			
			case 2:
			{	
				if(strcmp(poczatek->nazwisko, check) != 0)
				{
					el_listy *usuwany=poczatek;
					poczatek=usuwany->next;
					free(usuwany);
						wsk=poczatek;
				}
       		
				if(strcmp(wsk->next->nazwisko, check) != 0)
				{
					el_listy *usuwany=wsk->next;
					wsk->next=usuwany->next;
					free(usuwany);
				}	
				else
				wsk=wsk->next;
		
			} break;
			
			case 3:
			{	
				if(poczatek->wiek!=p)
				{
					el_listy *usuwany=poczatek;
					poczatek=usuwany->next;
					free(usuwany);
						wsk=poczatek;
				}
				if(wsk->next->wiek!=p)
				{
					el_listy *usuwany=wsk->next;
					wsk->next=usuwany->next;
					free(usuwany);
				}	
				else
				wsk=wsk->next;
			} break;
				
			case 4:
			{
				if(strcmp(poczatek->kierunek, ch) != 0)
				{
					el_listy *usuwany=poczatek;
					poczatek=usuwany->next;
					free(usuwany);
					wsk=poczatek;
				}
				if(strcmp(wsk->next->kierunek, ch) != 0)
				{
					el_listy *usuwany=wsk->next;
					wsk->next=usuwany->next;
					free(usuwany);
				}	
				else
				wsk=wsk->next;
			} break;
			
			case 5:
			{	
				if(poczatek->rok!=p)
				{
					el_listy *usuwany=poczatek;
					poczatek=usuwany->next;
					free(usuwany);
						wsk=poczatek;
				}
				if(wsk->next->rok!=p)
				{
					el_listy *usuwany=wsk->next;
					wsk->next=usuwany->next;
					free(usuwany);
				}	
				else
				wsk=wsk->next;
			} break;
			
			case 6:
			{	
				if(poczatek->nr_albumu!=p)
				{
					el_listy *usuwany=poczatek;
					poczatek=usuwany->next;
					free(usuwany);
						wsk=poczatek;
				}
				if(wsk->next->nr_albumu!=p)
				{
					el_listy *usuwany=wsk->next;
					wsk->next=usuwany->next;
					free(usuwany);
				}	
				else
				wsk=wsk->next;
			} break;
			
			
	 	}
	}
}

void sortowanie(int z)
{
	int i=0,j,min,b,l=1;  // zmienne pomocnicze
	el_listy tab[lp],a; // tworzymy tablice z liczba rowna liczbie rekordow w bazie
	el_listy *wsk=poczatek;
	while(wsk!=NULL)
	{
		tab[i].imie=wsk->imie;  // przypisujemy kolejnym indeksom w tablicy kolejne pola na liscie
		tab[i].nazwisko=wsk->nazwisko;  // dzieki temu bedziemy mielei łatwy dostep do kazdego elementu na liscie co ułatwi sortwoanie
		tab[i].wiek=wsk->wiek;
		tab[i].kierunek=wsk->kierunek;
		tab[i].rok=wsk->rok;
		tab[i].nr_albumu=wsk->nr_albumu;
		wsk=wsk->next;
		i++;	
	}
		czerwony();
		fprintf(stdout, "\n\n Lp.          Imie       Nazwisko   Wiek         Kierunek    Rok   Nr albumu \n");
		bialy();
		
	for(i=0;i<lp;i++)  // sortujemy metoda przez wybieranie
	{
		min=i;
		for(j=i;j<lp;j++)
		{
			switch(z)  // w zaleznosci jaka opcje wybralismy sortujemy wedlug dowolnego pola
			{
				case 1:
				{
					 if(strcmp(tab[min].imie,tab[j].imie)>0)
					 	min=j;	
				} break;
				case 2:
				{
					 if(strcmp(tab[min].nazwisko,tab[j].nazwisko)>0)
					 	min=j;	
				} break;
				case 3:
				{
					 if(tab[min].wiek>tab[j].wiek)
					 	min=j;	
				} break;
				case 4:
				{
					 if(strcmp(tab[min].kierunek,tab[j].kierunek)>0)
					 	min=j;	
				} break;
				case 5:
				{
					 if(tab[min].rok>tab[j].rok)
					 	min=j;	
				} break;
				case 6:
				{
					 if(tab[min].nr_albumu>tab[j].nr_albumu)
					 	min=j;	
				} break;
				
			}	
		}
		
		a=tab[i];
		tab[i]=tab[min];
		tab[min]=a;
	}
	
	for(i=0;i<lp;i++,l++) //wypisujemy posortowana baze
	{
		fprintf(stdout, "\n%3d. %13s  %13s  %5d  %15s  %5d  %10d", l, tab[i].imie,tab[i].nazwisko, tab[i].wiek, tab[i].kierunek, tab[i].rok, tab[i].nr_albumu);
	}
	
	
}

obsluga.h

#ifndef obsluga_h
#define obsluga_h

void wczytywanie();
void zapis();

#endif

obsluga.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "obsluga.h"

void wczytywanie()
{
	FILE *plik;  
	plik=fopen("baza.txt","r");  //otwiera pli baza.txt, "r"-tylko do odczytu
	char im[20];
	char naz[20];
	char kier[20];
	int r, nra,w;
	koniec=NULL;  // koniec ustawiamy na początku
	if(plik==NULL)  // jesli nie ma pliku przerywamy funkcje
	return;
	while(feof(plik)==0)
	{
		dodaj=malloc(sizeof(el_listy));
	
		fscanf(plik,"%s",im);  
			if(im[0]>96 && im[0]<123)
			im[0]=im[0]-32;
		dodaj->imie=malloc( sizeof(char) * strlen(im));
		strcpy( dodaj->imie, im );
	
		fscanf(plik,"%s",naz);
			if(naz[0]>96 && naz[0]<123)
			naz[0]=naz[0]-32;
		dodaj->nazwisko=malloc( sizeof(char) * strlen(naz));
		strcpy( dodaj->nazwisko, naz );
	
		fscanf(plik,"%d",&w);
		dodaj->wiek=w;
	
		fscanf(plik,"%s",kier);
			if(kier[0]>64 && kier[0]<91)
			kier[0]=kier[0]+32;
		dodaj->kierunek=malloc( sizeof(char) * strlen(kier));
		strcpy( dodaj->kierunek, kier );
		
		fscanf(plik,"%d",&r);
		dodaj->rok=r;
	
		fscanf(plik,"%d",&nra);
		dodaj->nr_albumu=nra;
	
		dodaj->next=NULL;
		
		if (koniec == NULL)
 	       poczatek = koniec = dodaj;
 	    else 
		{
	        koniec->next = dodaj;
	        koniec = dodaj;
 	    } 
	}	
	fclose(plik);//zamykamy plik
}

void zapis()
{
	int lp = 1;
	FILE *plik;
	plik=fopen("baza.txt","w");  //otwiera pli baza.txt, "r"-tylko do odczytu
	el_listy *wsk=poczatek;  // wskaznik ustawiamy na poczatek listy
	while(wsk!=NULL)
	{
		fprintf(plik, "%13s", wsk->imie);     // zapisujemy do pliku kolejne pola
        fprintf(plik, "%13s", wsk->nazwisko);
        fprintf(plik, "%5d", wsk->wiek);
        fprintf(plik, "%15s", wsk->kierunek);
        fprintf(plik, "%5d", wsk->rok);
        fprintf(plik, "%10d", wsk->nr_albumu);
		wsk=wsk->next;
		lp++;	
	}
	fclose(plik);  //zamykamy plik
}
0

Napisy potrzebują o jeden znak więcej miejsca (na znak zakończenia).
Zapoznaj się z funkcją strdup()

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