mati220 Temat założony przez niniejszego użytkownika |
Funkcje lokalne, oddzielenie interfejsu listy od implementacji » 2016-11-12 21:23:12 Witam. Chciałem ostatnio podzielić program na pliki dla lepszej organizacji kodu. Dodałem plik nagłówkowy z deklaracjami funkcji a drugi z implementacją tych funkcji. W zasadzie są to funkcje do obsługi listy. Chciałem odizolować funkcje pomocnicze do obsługi listy od tych "głównych", które mają być dostępne dla korzystającego z tej listy. Po prostu żeby korzystający z tej listy nie miał możliwości wglądu do tzw. bebech tej listy jedynie takie jak dodaj, usuń itp. Próbowałem w pliku *.cpp przed funkcją dodać słowo kluczowe static ale nic to nie daje. W jaki sposób osiągnąć takie oddzielenie "interfejsu" listy od implementacji tych funkcji pomocniczych? Z góry dzięki za pomoc :) |
|
marcolo2307 |
» 2016-11-12 21:29:09 lib.hpp void funkcjaGlowna(); help.hpp void pomocniczna(); lib.cpp #include "lib.hpp" #include "help.hpp" void funkcjaGlowna() { pomocnicza(); } Chyba zrozumiesz o co mi chodzi :P Po prostu pomocnicze deklarujesz w osobnym nagłówku, którego nie oddajesz użytkownikowi, więc nie będzie miał do nich dostępu. Ewentualnie schowaj je w jakąś przestrzeń nazw, np. priv::. |
|
mati220 Temat założony przez niniejszego użytkownika |
» 2016-11-12 21:34:31 Ok :) już zabieram się do pisania nowego nagłówka :) a co do słowa kluczowego static, w wielu źródłach napisane jest że za pomocą tego słowa można tę funkcję/zmienną "zostawić do wglądu" jedynie w tym pliku w którym została zadeklarowana. Czemu jednak można jej użyć w funkcji głównej programu pomimo zastosowania słowa static? :) |
|
marcolo2307 |
» 2016-11-12 22:01:09 W tym już ci nie pomogę, nigdy z tego nie korzystałem :/ |
|
mati220 Temat założony przez niniejszego użytkownika |
» 2016-11-12 22:15:18 Napisałem tak jak poleciłeś a i tak dalej z funkcji głównej mam wgląd do tych pomocniczych. Może źle to napisałem, to może opiszę jak zrobiłem. W pliku lista.h mam deklaracje funkcji głównych w pliku lista_funkcje_pomocnicze.h mam deklaracje funkcji pomocniczych w pliku lista.cpp mam definicje wszystkich funkcji w programie tych pomocniczych jak i głównych do obsługi listy. W pliku głównym programu włączam tylko lista.h gdzie znajduje się sam "interfejs" do obsługi listy a jednak dalej mogę dalej używać funkcji pomocniczych które nie są włączone do tego pliku.
Gdzie w takim razie problem? |
|
marcolo2307 |
» 2016-11-12 22:41:31 Nie includujesz pomocniczych w nagłówku interfejsu? |
|
carlosmay |
» 2016-11-12 23:07:32 Pokaż co masz, lub coś na obraz tego co robisz. Z fusów nikt ci nie powróży. |
|
mati220 Temat założony przez niniejszego użytkownika |
» 2016-11-13 10:15:29 Ok. Pokażę chociaż zarys tego co mam. Jest to konsolowa wersja bazy kontaktów zrobiona na liście. Ogólnie program był napisany w C ale zmuszony zostałem do przepisania go na C++ ale nie chciałem się bawić w pisanie na obiektach, musiałbym to praktycznie od nowa projektować czego mi się robić nie chce. Dlatego część funkcji jest z C a niektóre do zarządzania pamięcią z C++. Ale do rzeczy. Zawartość lista.h, teoretycznie tylko te funkcje miały być udostępnione dla użytkownika. #ifndef lista_h #define lista_h #define N 50
struct osoba { int id, * nr_tel, ilosc_nr_telefonu, ilosc_adresow_email; char imie[ N ], nazwisko[ N ], miasto[ N ], ulica[ N ], nr_domu[ N ], kod_pocztowy[ N ], poczta[ N ]; struct mail { char email[ N ]; } * adres_email; struct osoba * next; };
void napisy( int napis );
int zapisywanie_do_pliku( struct osoba * lista );
int wczytywanie_z_pliku( struct osoba ** lista );
struct osoba * dodawanie_danych( struct osoba ** lista );
void wyswietlanie_z_sortowaniem( struct osoba * list_pointer );
struct osoba * usuwanie( struct osoba * list_pointer );
struct osoba * edycja( struct osoba * list_pointer );
void wyswietlanie_wyszukanych( struct osoba * lista );
#endif Zawartość lista_funkcje_pomocnicze.h. Te funkcje dokonują różnych operacji których użytkownik ma nie widzieć. #ifndef lista_funkcje_pomocnicze_h #define lista_funkcje_pomocnicze_h
int szukaj_wolnego_id( struct osoba * lista );
int szukaj_ostatniego_id( struct osoba * lista );
struct osoba * szukaj_ostatniego_elementu( struct osoba * lista );
struct osoba * szukaj_wybranego( struct osoba * lista, int nr );
struct osoba * sprawdz_czy_istnieje_id( struct osoba * lista, int nr );
struct osoba * szukaj_miejsca( struct osoba * lista, int id );
void usuwanie_znaku_nowego_wiersza( char * ciag );
struct osoba * dodawanie_do_posortowanej( struct osoba * lista, struct osoba * mini );
void wyswietlanie( struct osoba * lista, int wyswitlanie_usuwanie );
struct osoba * usuwanie_w_sortowaniu( struct osoba * lista, int wybor );
void usuwanie_listy( struct osoba ** lista );
struct osoba * kopiowanie_danych( struct osoba * lista, struct osoba * oryginal );
struct osoba * kopiowanie_listy( struct osoba * nowa_lista, struct osoba * oryginal );
void sortowanie( struct osoba * lista, int sortowanie_po_polu, int sposob );
void wyszukiwanie( struct osoba * lista, int wyszukiwanie_po_polu, char * szukane, int szukane_int );
#endif
Zawartość lista.cpp. Tutaj są definicje wszystkich funkcji, tych pomocniczych jak i tych, które powinien dostać użytkownik. Raczej nie wkleję całego kodu bo zajmuje on niespełna 1400 linijek a i tak nie potrzebne są raczej ich implementacje do wglądu. #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <conio.h> #define N 50 #include "lista.h" #include "lista_funkcje_pomocnicze.h"
int szukaj_wolnego_id( struct osoba * lista ) { }
int szukaj_ostatniego_id( struct osoba * lista ) { }
struct osoba * szukaj_ostatniego_elementu( struct osoba * lista ) { }
struct osoba * szukaj_wybranego( struct osoba * lista, int nr ) { }
struct osoba * sprawdz_czy_istnieje_id( struct osoba * lista, int nr ) { }
struct osoba * szukaj_miejsca( struct osoba * lista, int id ) { }
void napisy( int napis ) { }
void usuwanie_znaku_nowego_wiersza( char * ciag ) { }
struct osoba * dodawanie_do_posortowanej( struct osoba * lista, struct osoba * mini ) { }
int zapisywanie_do_pliku( struct osoba * lista ) { }
int wczytywanie_z_pliku( struct osoba ** lista ) { }
struct osoba * dodawanie_danych( struct osoba ** lista ) { }
void wyswietlanie( struct osoba * lista, int wyswitlanie_usuwanie ) { }
struct osoba * usuwanie_w_sortowaniu( struct osoba * lista, int wybor ) { }
void usuwanie_listy( struct osoba ** lista ) { }
struct osoba * kopiowanie_danych( struct osoba * lista, struct osoba * oryginal ) { }
struct osoba * kopiowanie_listy( struct osoba * nowa_lista, struct osoba * oryginal ) { }
void sortowanie( struct osoba * lista, int sortowanie_po_polu, int sposob ) { }
void wyswietlanie_z_sortowaniem( struct osoba * list_pointer ) { }
struct osoba * usuwanie( struct osoba * list_pointer ) { }
struct osoba * edycja( struct osoba * list_pointer ) { };
void wyszukiwanie( struct osoba * lista, int wyszukiwanie_po_polu, char * szukane, int szukane_int ) { }
void wyswietlanie_wyszukanych( struct osoba * lista ) { }
Zawartość pliku głównego programu. Ogólnie sam program może nie jest napisany bardzo profesjonalnie bo nie miałem okazji zobaczyć jak takie się pisze, jest to tylko projekt z 2 semestru, który teraz przerabiam. Także jak coś razi po oczach to sory ale to pierwszy grubszy projekt napisany "własnoręcznie" :D. Dodatkowo teraz widzę też co można byłoby poprawić w stosunku do tego co robiłem itp ale nie o to teraz chodzi :) #include <stdio.h> #include <stdlib.h> #include <conio.h> #include "lista.h"
int main() { int wybor; osoba * list_pointer = NULL; wczytywanie_z_pliku( & list_pointer ); do { napisy( 0 ); wybor = 0; fflush( stdin ); scanf( "%d", & wybor ); switch( wybor ) { case 1: list_pointer = dodawanie_danych( & list_pointer ); zapisywanie_do_pliku( list_pointer ); break; case 2: system( "CLS" ); list_pointer = usuwanie( list_pointer ); zapisywanie_do_pliku( list_pointer ); break; case 3: system( "CLS" ); wyswietlanie_z_sortowaniem( list_pointer ); break; case 4: list_pointer = edycja( list_pointer ); zapisywanie_do_pliku( list_pointer ); break; case 5: wyswietlanie_wyszukanych( list_pointer ); break; case 6: system( "CLS" ); napisy( 7 ); puts( "| Nacisnij dowolny klawisz by przejsc do Menu |" ); puts( "----------------------------------------------------------------------------\n" ); getch(); break; case 7: break; default: system( "CLS" ); puts( "----------------------------------------------------------------------------" ); puts( "| Nie ma takiej opcji |" ); puts( "| Nacisnij dowolny klawisz by powrocic do Menu |" ); puts( "----------------------------------------------------------------------------\n" ); getch(); break; } system( "CLS" ); } while( wybor != 7 ); return 0; system( "pause" ); }
|
|
« 1 » 2 3 |