Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek 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

Elektronik9 19 Sie 2011 00:51 2934 24
  • #1 19 Sie 2011 00:51
    Elektronik9
    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.

    0 24
  • #2 19 Sie 2011 01:17
    McMonster
    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.

    0
  • #3 19 Sie 2011 01:37
    Elektronik9
    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.

    0
  • #4 19 Sie 2011 01:53
    McMonster
    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.

    0
  • #5 19 Sie 2011 02:03
    Elektronik9
    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.

    0
  • Pomocny post
    #6 19 Sie 2011 11:48
    directx11
    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?

    0
  • #7 19 Sie 2011 11:57
    kadoel
    Poziom 9  

    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ć.

    0
  • #8 19 Sie 2011 12:52
    McMonster
    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.

    0
  • #9 19 Sie 2011 13:28
    kadoel
    Poziom 9  

    "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.

    0
  • #10 19 Sie 2011 20:33
    Elektronik9
    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.

    0
  • #11 19 Sie 2011 21:46
    kadoel
    Poziom 9  

    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ć.

    0
  • #12 19 Sie 2011 21:53
    Elektronik9
    Poziom 30  

    No niestety javy nie znam i zostanę przy C++. Poza tym Java zamula. ;P

    0
  • #13 19 Sie 2011 21:55
    kadoel
    Poziom 9  

    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 .... :(

    0
  • #14 19 Sie 2011 22:08
    gaskoin
    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 :)

    0
  • #15 19 Sie 2011 22:22
    kadoel
    Poziom 9  

    Wiadomo, że proste. Przesiądź się na Javę lub C# zobaczysz wygodę.

    0
  • #16 19 Sie 2011 22:22
    Elektronik9
    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. :)

    0
  • #17 19 Sie 2011 22:24
    kadoel
    Poziom 9  

    Dają duże możliwości ale są też dużym niebezpieczeństwem. To wiesz jak seks bez zabezpieczenia.. :D

    0
  • #18 19 Sie 2011 22:24
    Elektronik9
    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. ;)

    0
  • #19 19 Sie 2011 22:36
    kadoel
    Poziom 9  

    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.

    0
  • #20 19 Sie 2011 22:40
    Elektronik9
    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.

    0
  • #21 19 Sie 2011 22:50
    kadoel
    Poziom 9  

    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.

    0
  • #22 19 Sie 2011 23:13
    McMonster
    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.

    0
  • #23 20 Sie 2011 20:09
    kadoel
    Poziom 9  

    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.

    0
  • #24 09 Wrz 2011 07:17
    hans512
    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).

    0
  • #25 09 Wrz 2011 07:22
    Elektronik9
    Poziom 30  

    Problem rozwiązany, dzięki za pomoc.

    0