Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] tablica obiektów z tablicami wskaźników

19 Sie 2011 00:51 3006 24
  • Poziom 30  
    Witam,
    Mam taki problem:

    Mam sobie klasę car, w której jest 50-elementowa tablica wskaźników na obiekty innej klasy.

    Jak poprawnie utworzyć w programie tablicę obiektów typu car, aby te wskaźniki (te stablicowane w obiektach klasy car w tablicy) się nie sypały? Bo zauważyłem, że czasami są zupełnie bzdurne i psują mi cały program.

    Aktualnie ratuję się takim działającym rozwiązaniem:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Które niestety nie jest idealne bo co jak przyjdzie mi zwiększyć rozmiar tablicy do 1000 elementów?

    Próbowałem już zabaw z new'em ale na próżno.
  • Poziom 32  
    Nie sypały? Z opisu problemu wynika tyle, że popełniłeś jakiś poważny błąd lub błędy w kodzie. Najprościej będzie, jak po prostu wkleisz cały kod programu oraz podasz, w którym miejscu problem się pojawia.
  • Poziom 30  
    Program ma 1300+ linii i 14 plików więc może być z tym ciężko.
    Ogólnie chodzi o to, że w tablicy wskaźników w obiektach klasy car niektóre wskaźniki jakby zamiast NULL-a miały jakieś randomowe wartości. Tak, jakby coś na nie nachodziło. Ma to związek z tą tablicą car'ów gdyż inne ewentualności wykluczyłem.
  • Poziom 32  
    To wklej chociaż tą część, gdzie operujesz na tych wskaźnikach i występuje problem (może być przykładowa) oraz tą, gdzie tworzysz tablicę.

    Specjalistą od tego języka nie jestem, ale w różnych językach i ich implementacjach nie ma gwarancji, że np. zadeklarowana zmienna jest wyjściowo zerowana, mogą tam się pojawić śmieci, które wcześniej zajmowały daną przestrzeń w pamięci.
  • Poziom 30  
    Tablica globalna:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    fragment konstruktora car:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Tu wyrzuca błąd:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    metoda good() w klasie package:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Treść błędu:
    Code:
    Unhandled exception at 0x00412045 in program.exe: 0xC0000005: Access violation reading location 0x0000000f.
  • Pomocny post
    Poziom 17  
    Elektronik9 napisał:

    Tu wyrzuca błąd:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Treść błędu:
    Code:
    Unhandled exception at 0x00412045 in program.exe: 0xC0000005: Access violation reading location 0x0000000f.


    Jakie masz wartości zmiennych indeksujących carNumber i i w momencie wywalenia się programu? Może one wykraczają poza swój zakres w tym momencie?
  • Poziom 10  
    W VisualStudio jest bardzo dobry debugger. Powiedz mi jak wygląda package u Ciebie. Po drugie jest coś takiego w języku C++ jak wyjątki, które powinieneś w swoim kodzie zaimplementować.
  • Poziom 32  
    Wyjątki jak najbardziej, ale w tym konkretnym przypadku nie mają najmniejszego sensu, trzeba by po pierwsze otoczyć prawie cały kod wielkim blokiem try-catch, a po drugie to błąd programistyczny, więc wyjątek nie uratowałby poprawności wykonania programu.
  • Poziom 10  
    "trzeba by po pierwsze otoczyć prawie cały kod wielkim blokiem try-catch" to jest najmniejszy problem. Zgadza się, że jest to nieobsługiwany wyjątek.Proponuje Debugger. Jeśli nie uporałeś się to podrzuć mi kod to ci pomoge.
  • Poziom 30  
    directx11 napisał:
    Jakie masz wartości zmiennych indeksujących carNumber i i w momencie wywalenia się programu? Może one wykraczają poza swój zakres w tym momencie?

    Wygląda na to, że miałeś rację.
    Po wstępnych oględzinach dzisiaj stwierdziłem, że czytałem element tablicy -1, tj.
    cars[carNumber] gdzie carNumber = -1;
    Dzięki! Aż mi wstyd, że tego wcześniej nie sprawdziłem tak trywialnej rzeczy.

    Ale proszę nie zamykać jeszcze tego wątku, być może błąd jeszcze powróci.
  • Poziom 10  
    No i widzisz jednak można by użyć wyjątku. W javie mamy java.lang.ArrayIndexOutOfBoundsException nie wiem jak w C++. Ale kto myśli o tak trywialnym błędzie jaki może się zdarzyć.
  • Poziom 30  
    No niestety javy nie znam i zostanę przy C++. Poza tym Java zamula. ;P
  • Poziom 10  
    HEHE. Coś za coś. Java jednak jest przyjaźniejsza nawet pod względem składniowym. Dla mnie dużo lepsza. C++ i te jego wskaźniki .... :(
  • Poziom 38  
    Wskaźniki są proste jak się je rozumie, a nie używa na ślepo i "być może zadziała". Poza tym, co natywnie to natywnie :)
  • Poziom 10  
    Wiadomo, że proste. Przesiądź się na Javę lub C# zobaczysz wygodę.
  • Poziom 30  
    Mój profesor od informatyki zwykł mawiać "Ze wskaźnikami jest jak z seksem wśród nastolatków: wszyscy o nich mówią, ale nikt ich nie używa". :)

    Coś w tym jest, ale po lekturze Grębosza wskaźniki nie takie straszne. :)
  • Poziom 10  
    Dają duże możliwości ale są też dużym niebezpieczeństwem. To wiesz jak seks bez zabezpieczenia.. :D
  • Poziom 30  
    kadoel napisał:
    Wiadomo, że proste. Przesiądź się na Javę lub C# zobaczysz wygodę.

    Lol, nieprzenośny kod, zamulające programy, brak wskaźników? To nie dla mnie. ;)
    Wolę C++, pełną władzę nad komputerem, szybkie i przenośne programy. ;)
  • Poziom 10  
    Nieprzenośny kod ? Rozwiń ten wątek. Bo chyba nie masz dużego pojęcia co to jest JVM. Brak wskaźników w JAVIE to zaleta (W C# istnieją po wyłączeniu GarbageCollectora ). Pamięcią zarządza wirtualna maszyna. Po drugie C++ charakteryzuje się nie przenośnością kodu.

    http://docs.google.com/viewer?a=v&q=cache:OMD...Ez-QVi&sig=AHIEtbRbQqMKgVQM4Ui91G_jGyKY2XbV1w

    Dodano po 3 [minuty]:

    W C++ masz większy kłopot niż w JAVA/C# z wyciekami pamięci. Doucz się bo chyba studiujesz lub studiowałeś na jakiejś mało renomowanej uczelni. Żegnam koniec offtopu. Bez odpowiedzi.

    Moderowany przez arnoldziq:

    3.1.9. (4, 10.8, 10.4) Zabronione jest rozpowszechnianie treści ironizujących, prześmiewczych lub złośliwych, stanowiących przejaw braku szacunku do innych Użytkowników lub osób trzecich.

  • Poziom 30  
    C++ nieprzenośny? Haha, no ale Ty opierasz się na materiałach z KUL'u, pozazdrościć źródła.

    Co do mojej uczelni to o nią się nie martw, jest w ścisłej czołówce polskich politechnik.

    via Wikipedia (na szybko):
    Cytat:
    Charakteryzuje się wysoką wydajnością kodu wynikowego, bezpośrednim dostępem do zasobów sprzętowych i funkcji systemowych, łatwością tworzenia i korzystania z bibliotek (napisanych w C++, C lub innych językach), niezależnością od konkretnej platformy sprzętowej lub systemowej (co gwarantuje wysoką przenośność kodów źródłowych) oraz niewielkim środowiskiem uruchomieniowym. Podstawowym obszarem jego zastosowań są aplikacje i systemy operacyjne.

    Moderowany przez arnoldziq:


    3.1.9. (4, 10.8, 10.4) Zabronione jest rozpowszechnianie treści ironizujących, prześmiewczych lub złośliwych, stanowiących przejaw braku szacunku do innych Użytkowników lub osób trzecich.

  • Poziom 10  
    Elektronik9 napisał:
    C++ nieprzenośny? Haha, no ale Ty opierasz się na materiałach z KUL'u, pozazdrościć źródła.

    Co do mojej uczelni to o nią się nie martw, jest w ścisłej czołówce polskich politechnik.

    via Wikipedia (na szybko):
    Cytat:
    Charakteryzuje się wysoką wydajnością kodu wynikowego, bezpośrednim dostępem do zasobów sprzętowych i funkcji systemowych, łatwością tworzenia i korzystania z bibliotek (napisanych w C++, C lub innych językach), niezależnością od konkretnej platformy sprzętowej lub systemowej (co gwarantuje wysoką przenośność kodów źródłowych) oraz niewielkim środowiskiem uruchomieniowym. Podstawowym obszarem jego zastosowań są aplikacje i systemy operacyjne.





    Masz argumenty jak humanista. Co studiujesz? Wytłumacz mi coś o przenośności kodu w C++.

    Java była reklamowana hasłem "napisz raz uruchom wszędzie". Jest to główna cecha rozpoznawcza języka która stała się też celem niewybrednych dowcipów1. Rzeczywistą zaletą jest rozgraniczenie elementów platformy systemowej i elementów dostępnych w języku bez konieczności wywołań systemowych. W toku prac nad językiem zauważono, że można stworzyć zbiór elementów API, które mogą być napisane w Javie bez wykorzystania wywołań systemowych. Ograniczyło to ilość kodu, który trzeba implementować w zależności od platformy. Teoretycznie prosta implementacja JVM powinna wymagać tylko systemowej I/O (system plików, sieć, klawiatura, mysz itp.). W praktyce implementowane są też niektóre operacje takie jak np. Math.sqrt.


    Zachowujesz się jak stereotypowy informatyk. Zakompleksiony siedzący w koszuli flanelowej. Pewnie jesteś grzecznym chłoptasiem. Naucz się czegoś chłopaku potem pisz. Nie rób offtopu.

    Moderowany przez arnoldziq:

    3.1.9. (4, 10.8, 10.4) Zabronione jest rozpowszechnianie treści ironizujących, prześmiewczych lub złośliwych, stanowiących przejaw braku szacunku do innych Użytkowników lub osób trzecich.



    Dodano po 3 [minuty]:


    maszyna wirtualna, której funkcje są zaimplementowane niezależnie dla każdego OSu
    bardzo wolna, o ile nie wykorzystuje się instrukcji udostępnianych przez konkretny OS lub
    procesor a wtedy strata przenośności
    minus trzeba zainstalować MW javy, więc nasz program ma wymagania co do bibliotek
    nieobecnych w systemie.
    Czasem programy zachowują się inaczej na różnych wersjach MW lub wymagają
    dodatkowych bibliotek
    Może kiedyś będzie szybka, na razie za uniwersalność płacimy spadkiem wydajności

    Moderowany przez arnoldziq:

    3.1.13. (10.9, 15) Zabronione jest publikowanie wpisów naruszających zasady pisowni języka polskiego, niedbałych i niezrozumiałych.



    Jest mimo to całkiem dobrym pomysłem

    Dodano po 2 [minuty]:

    Nie rozróżniasz tego, że java jest zajebiście przenośna a C++ mniej bo zależy czy jego biblioteka jest napisana dla różnych platform. Jeśli nie to gówno przeniesiesz !
    Moderowany przez arnoldziq:

    3.1.9. (4, 10.8, 10.4) Zabronione jest rozpowszechnianie treści ironizujących, prześmiewczych lub złośliwych, stanowiących przejaw braku szacunku do innych Użytkowników lub osób trzecich.
    I tą wypowiedzą, zasłużył kolega na ostrzeżenie.

  • Poziom 32  
    Flamewar się rodzi. Każdy z tych języków jest dobry w swoich zastosowaniach, to jak porównywanie terenówki do Smarta.

    Fanatykom konkretnych języków programowania, systemów operacyjnych, marek sprzętu, czy czegokolwiek innego polecam zachowanie swojego zdania dla siebie dla dobra publicznego, bo się tylko ośmieszacie.
  • Poziom 10  
    Nie chciałem nikogo obrażać. Kolega się poskarżył. Jeśli mnie usuniecie to sobie założę nowe konto - żaden problem. Dyskusja była niepotrzebna. Ale czasami jak ktoś pisze częściowo nieprawdziwe informacje to trzeba mu to uświadomić. Są większe i poważniejsze problemy niż jakaś rozmowa na forum o programowaniu.
  • Poziom 14  
    Do autora: uzyj "std::vector" do tej tablicy. Wtedy odpada ci kilka problemow gdy bedziesz owa tablice modyfikowal.

    Vector jest obecnie czescia glownej biblioteki C++, i ludzie powinni ja uzywac, bo naprawde ulatwia wiele rzeczy. A wskazniki powinny zawsze byc uzywane poprzez osobna klase ktora weryfikuje czy dane na ktore wskazuje pointer sa dostepne i jesli nie sa to grzeczne zglasza wyjatek(catch).
  • Poziom 30  
    Problem rozwiązany, dzięki za pomoc.