porownywanie wskaznikow

0

mam cos takiego :
char * nazwa;
nazwa = new char[40];
cin >> nazwa;

potrzebuje w pewnym momencie w jakiejs funkcji porownac zawartosc, ktora kryje sie pod wskaznikami :
z = strcmp(dana, nazwa)
gdzie dana (parametr wywolania funkcji) to wskaznik do zmiennej wzorzec, wprowadzanej przez uzytkownika.
Wszystko kompiluje sie swietnie, ale program gdy dochodzi do tego punktu wyrzuca error : "Access violation at address xxxxxx". Czyli jest to blad ze wskaznikami. Czy nie mozna porownywac dwoch wskaznikow?

Probowalem zrobic cos takiego : z = strcmp( & dana, &nazwa), ale podczas kompilacji wywala : "cannot convert 'char * *' to 'char *'. Nie wiem dlaczego wlasnie taki blad sie pojawia :/
Gdy pozbede sie wskaznikow wszystko dziala ladnie, ale pozbyc sie ich raczej nie moge, bo bez wskaznikow trudno bedzie o zaliczenie :/
Pomocy...

0

Nie chodzi Ci o porównywanie wskaźników, a porównywanie zawartości dwóch łańcuchów w stylu C. Twoje wywołanie strcmp jest dobre, a Access Violation możesz mieć z następujących powodów:

  1. Któryś ze wskaźników przekazanych do strcmp nie wskazuje na prawidłowo przydzielony obszar pamięci. Coś zrobiłeś z tym łańcuchem źle wcześniej.
  2. Któryś ze wskazywanych łańcuchów nie jest zakończony znakiem '\0'. Może niechcący zamazałeś '\0' wpisując znaki do łańcucha?

Nie podałeś pełnego kodu, to nie mogę wykazać Ci gdzie masz dokładnie błąd, ale na pewno to Twoja wina.

Próbowałeś wypisać oba łańcuchy przed porównaniem? Np. tak: printf("%s", dana);
Zobacz przy którym printfie Ci się wywali.

0

Tak patrzylem w kod i nie jestem w stanie powiedziec, gdzie jest blad :/
Oto link do pliku: http://hoth.amu.edu.pl/~trunk/baza_danych.cpp
Bede wdzieczny, jesli wskazesz blad/poprawisz

0

Blad mi troche ciezko znalezc, bo nie mam tyle czasu siedziec nad plikiem dlugim na 400 linii, ktory mi sie nie kompiluje pod linuksem, bo uzywa niestandardowego <conio.h> i jest napisany w sposób ogólnie... no nie najlepszy.

Parę uwag:

  1. Skoro piszesz w C++, dlaczego nie używasz std::string lub jakiejkolwiek innej klasy do stringow? Przwdopodobnie gdybyś jej użył, to nie miałbyś takich problemów. Nie wyrabiaj sobie złych nawyków. Funkcje str*** to ostateczność.
  2. Brakuje komentarzy, co robią poszczególne funkcje, natomiast są niepotrzebne komentarze w kodzie, które można wywnioskować z kodu.
  3. Nie sprawdzasz długości danych wejściowych. Przepełnienie bufora jest u Ciebie możliwe w niemalże każdym miejscu (znowu: używaj stringów lub ostatecznie fgets)
  4. Za dużo tego deletowania, a to nic dobrego nie wróży. Generalnie dobrze napisany kod nie powinien zawierać żadnego delete, no chyba że naprawdę wiesz, co robisz. Garbage collectory są po to żeby ich używać (np. Boehm Demers Weiser Garbage Collector, RTGC, More for C++). No ale, jeśli to jest na zaliczenie, to może masz wymóg, że z takich cudeniek nie wolno korzystać.
    // Kurcze, czemu wszyscy tak się boją odśmiecaczy? Gryzą czy co? Nie uczy się tego w szkołach? A później przenoszą się tacy na Javę i wydaje im się jaka to Java genialna w porównaniu z C++.
  5. Samemu budujesz listę, a mógłbyś przecież użyć std::list albo std::vector. Po co implementować coś co zostało już zrobione?
0

Dzieki za te drobne porady. Fakt, ucze sie dopiero, to moj pierwszy powazniejszy projekt z c++. A co do tych garbage collector'ow to w zasadzie nie wiem, czy moge ich uzyc. Wiem tylko, ze nie moge korzystac z komercyjnych bibliotek itp. Projekt uporzadkuje i podziele na pliki tuz przed egzamem;)
Ale i tak dalej nie wiem, co z ta pamiecia przy porownywaniu zawartosci wskaznikow:( Wiem, ze te 'delete' nic zlego nie robia u mnie, bo bez nich tez sie sypie. No ale dzieki!

0

Spróbuj najpierw wyprintfować to co porównujesz strcmp.
Np. jeśli w kodzie miałeś "strcmp(dane, nazwa)" to przed tym napisz:

printf("%x\n", (int)&dane);
printf("%s\n", dane);
printf("ok\n");
printf("%x\n", (int)&nazwa);
printf("%s\n", nazwa);
printf("ok\n");

W ten sposób przynajmniej będziesz wiedział, z którą zmienną jest problem. Jeśli któryś z wypisanych adresów będzie dziwny np. 0, albo jakiś mały (zwykle są >0x80000000), to też oznaczać będzie, że gdzieś ten wskaźnik nieprawidłowo przypisałeś albo w ogóle jakimś cudem nie jest zainicjowany. Ewentualnie polecam też użycie debuggera i podejrzenie, jakie dane siedzą pod tymi adresami, jeśli to printf się posypie.

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