Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Tablice dynamiczne w C++. Dlaczego w innej funkcji dane nie są widoczne?

arnidzionk 26 Jan 2011 05:37 2417 12
  • #1
    arnidzionk
    Level 13  
    Mam taki problem. W jednej funkcji zaakolowuje tablice dynamiczna Wygląda to tak:

    Code: cpp
    Log in, to see the code


    zastanawiam się, dlaczego w innej funkcji dane te są już nie widoczne, a cała pamieć zapełniona zerami. Oba wskaźniki są zadeklarowane jako globalne.

    Proszę, zgodnie z regulaminem pkt 11.1, o usunięcie słów PROBLEM lub/i POMOC z tytułu. Prośba dotyczy także wszelkich wariacji typu: kłopot, pomocy, problemy itd.
    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • #2
    directx11
    Level 17  
    Za mało informacji podałeś, być może coś Ci się sypie przy funkcji atof(), sprawdź na prostej zmiennej czy Ci poprawnie konwertuje stringa. Pokaż najprostszy możliwy program, przy którym masz błędne dane.
  • #3
    arnidzionk
    Level 13  
    Problem polega na tym, że w jednym pliku wpisuje do tej tablicy dynamicznej dane, ale gdy chce odczytać je w innym to pojawiają się tam zera. Deklaracja extern nic nie daje w tym miejscu.(innym pliku) Warto dodać, że dane faktycznie zostają tam wpisane.

    Dodano po 1 [godziny] 9 [minuty]:

    Już sobie poradziłem, niechcący alokowałem dwukrotnie tą samą tablice.
  • #4
    wojmysz
    Level 10  
    Od kilku godzin siedzę na róznych forach i nigdzie nie znalazłem rzeczowej informacji na temat powiększania tablic dynamicznych. Niby sprawa jest prosta, ale przy powięszaniu tablicy dynamicznej (w końcu do tego służy) tracę całą dotychczasową ich zawartość. Może ja coś źle robię, a może tak musi być, ale nigdize na ten temat nie znazłem informacji
  • #5
    analfabet
    Level 13  
    Może tak być, że robisz coś źle :P

    Za mało konkretów (najlepiej kod).
  • #6
    krru
    Level 33  
    wojmysz wrote:
    Od kilku godzin siedzę na róznych forach i nigdzie nie znalazłem rzeczowej informacji na temat powiększania tablic dynamicznych. Niby sprawa jest prosta, ale przy powięszaniu tablicy dynamicznej (w końcu do tego służy) tracę całą


    Tablice dynamiczne, wbrew nazwie, nie służa do dynamicznej zmiany wielkości, tylko do ustalania wielkości w czasu pracy a nie w czasie kompilacji.

    wojmysz wrote:

    dotychczasową ich zawartość. Może ja coś źle robię, a może tak musi być, ale nigdize na ten temat nie znazłem informacji


    Masz dwa, a nawet trzy wyjścia, 2 pierwsze w C/C++, trzecie tylko C++:
    1. Tak jak robisz: allokować nową tablice, większa, a potem przepisać całą dotychczasową zawartość i usunąć starą tablicę. UWAGA: wszystkie stare wskaźniki są już nieważne.
    2. Użyć realloc - biblioteka skopiuje i usunie za ciebie, reszta tak samo. Zaleta jest taka, że realloc może czasami zostawić nowy blok pod tym samym adresem i wtedy nie musi kopiować, ale to czysty przypadek i nie wolno na takie zachowanie liczyć.
    3. Użyć STL np. vector<>.
  • #7
    wojmysz
    Level 10  
    Dopiero raczkuję w programowaniu w C++ dlatego zwracam się do bardziej doświdczonych niz ja. Przeglądam dziesiatki serwisów i czasami jestem bezradny wobec jakiegos problemu. Mam tablicę dynamiczną dwuwymiarową. Wpisuję do niej liczby losowe. Później powiększam liczbę jej wierszy o 1 i w ten nowy wiersz chcę ponownie wpisać jakieś liczby.
    Code: cpp
    Log in, to see the code

    Niestety cały czas mi coś wywala podczas próby powiększania liczby wierszy.

    Proszę pamiętać o używaniu znaczników syntax. Opcja Listing kodu. Proszę poprawić. - arnoldziq
  • #8
    krru
    Level 33  
    Albo używa się C-towych funkcji malloc, calloc, realloc, free itp, albo new/delete. Nie wolno tego mieszać.
    Używając new/delete niestety pozostaje jedynie utworzenie owej tablicy i skopiowanie.

    W podanym przykładzie masz 2 błędy - nie kopiujesz to nowej tablicy tab i próbujesz reallocować tab a chyba chciałeś tab[i].
    No i jeszcze coś - ostatni wiersz musisz zaalokować od zera, choć wydaje mi się, że realloc można wywołać z argumentem NULL - wtedy działa jak malloc.


    Jeśli już działasz w C++ zdecydowanie proponuje vector, aczkolwiek to już szablony.
  • #9
    wojmysz
    Level 10  
    A teraz kolejny problem. Wszystkie funkcje tworzące tablice dynamiczne postanowiłem wrzucić do innego pliku. Wszystko działa dobrze, jeżeli tworzę tablicę dynamiczną liczb typu float. Natomiast program zwraca błąd, kiedy tworzę dynamiczna tablicę typu string. Domyślam się, że brakuje mi jakiejś biblioteki, ale nie wiem jakiej.
  • #10
    beluosus
    Level 25  
    Może <string>? Bez kodu, ani logu kompilatora nie wywróżę.
  • #11
    wojmysz
    Level 10  
    Utworzyłem dwa dodatkowe pliki:
    1. tablica_dyn.cpp
    2. tablica_dyn.hpp
    W pliku tablica_dyn.cpp umiesciłem funkcję, której zadaniem jest utworzenie talicy dynamicznej oraz wpisanie do niej danych. Jeżeli tablica jest typu float wszystko działa bez zarzutu. Jeżeli przerobię ją na typu string cały czas wyrzuca mi błąd. Domyślam się, że chyba brakuje mi jakiejś biblioteki, ale jakiej, tego nie wiem.
    Listing w pliku main.cpp
    Code: cpp
    Log in, to see the code


    Listing w pliku tablica_dyn.cpp

    Code: cpp
    Log in, to see the code

    Code: cpp
    Log in, to see the code
  • #12
    wojmysz
    Level 10  
    Acha, dla pliku
    Code: cpp
    Log in, to see the code
    zapomniałem dodać
    Code: cpp
    Log in, to see the code
    Ale nawet z tym projekt mi nie działą i nadal nie wiem czemu
  • #13
    wojmysz
    Level 10  
    Dodałem #include <string> dodałem #using namespace std; i nic, za każdym razem ten sam błąd.