Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Dynamiczna alokacja pamięci i tablica wskaźników na tablice

Ostatnio zmodyfikowano 2013-01-15 14:59
Autor Wiadomość
Luk_Jab
Temat założony przez niniejszego użytkownika
[c++] Dynamiczna alokacja pamięci i tablica wskaźników na tablice
» 2013-01-15 11:48:03
Witam, w temacie programowania jestem początkujący. Mam do wykonania zadanie, którego częścią jest podawanie kolejnych łańcuchów znaków. Łańcuchy są podawane aż do podania łańcucha pustego, stąd nie wiem ile ich ostatecznie będzie(poza ograniczeniem górnym do maksymalnie 40 łańcuchów). Łańcuchy te mam przechowywać w postaci tabeli wskaźników na nie. Jako że póki co nie zajmowałem się stringami, postanowiłem łańcuchy zapisywać jako tablice typu char. Mój niedoszły kod wygląda tak:

C/C++
#include <iostream>

using namespace std;

int main()
{
    char ** tab_wsk[ 40 ] = { 0 };
    char tmp_lancuch[ 40 ] = "Lanchuch";
    while( tmp_lancuch[ 0 ] ) // Warunkiem zakonczenia podawania łancuchow jest podanie lancucha pustego
    {
        int n = 0;
        cout << "Podaj lancuch znakow: " << endl;
        cin.getline( tmp_lancuch, 40 );
        char * lancuch = new char[ strlen( tmp_lancuch ) ];
       
        tab_wsk[ n ] = & lancuch; //Tutaj chce w tablicy wskaznikow zapisywac na kolejnych pozycjach adresy kolejnych lancuchow
        cout << "Twoj wskaznik : " <<( int ) & lancuch << endl; //kontrolnie wyswietlam wartosc wskaznika
        n++;
       
    }
   
   
   
   
    fflush( stdin );
    cin.get();
    return 0;
}

Wszystko działa ale jest jeden poważny problem - kompilator przy każdym nowym rozpoczęciu pętli alokuje ten sam obszar pamięci dla kolejnych ciągów. W jaki sposób mogę napisać ten algorytm żeby każdy kolejny łańcuch alokował się w nowym miejscu pamięci, tak aby korzystając później z adresów zawartych w tabeli robić kolejne operacje na łańcuchach?

Uprzedzając - wymagania są takie aby utworzyć tą tablicę wskaźników i operować na niej. Ciągi mógłbym zapisywać jako stringi, ale to chyba nie ma związku z moim problemem. Proszę o pomoc.
P-74012
unimator
» 2013-01-15 14:51:42
Pierwszy sposób to użycie list (jedno lub dwukierunkowych).
Drugi sposób, wygodniejszy ale i teoretycznie bardziej zasobożerny* to użycie tablicy wskaźników, mniej więcej tak jak Ty to zrobiłeś.
Trzeci sposób to użycie tablic, których rozmiar w czasie działania programu mógłby się zmieniać. Opisane to masz np. w tym poradniku: http://xion.org.pl/files/texts/mgt/pdf/1_8.pdf na stronie 302 i dalej.
Jako iż jest to zadanie to prawdopodobnie ma na celu sprawdzenie, czy potrafisz stworzyć taki mechanizm. Jednak w praktyce, kiedy wiesz, że np. elementów tablicy będzie na przykład maksymalnie 100 to o wiele lepiej jest stworzyć tablicę 100 wskaźników i ewentualnie używać ich mniej, niż używać sposobu 1 i 3 bo są one znacznie wolniejsze (pierwszy w używaniu, trzeci podczas ewentualnej modyfikacji elementów).


*praktycznie jednak dla 40 zmiennych wskaźnikowych (o takim samym rozmiarze jak int) trudno tu mówić o jakimś marnotrawstwie bo przy dzisiejszych rozmiarach pamięci 4*40 = 160 bajtów to niewiele (jeden taki łańcuch może przecież zajmować więcej).
P-74024
Luk_Jab
Temat założony przez niniejszego użytkownika
» 2013-01-15 14:59:35
Właśnie próbowałem zrobić coś z listami, ale ostatecznie podszedłem do problemu od nowa, z zupełnie nowym podejściem. Przeprosiłem się ze stringami i utworzyłem 2 tablice statyczne, dla stringów i dla ich wskaźników, obie o rozmiarze 40. Następnie przy podawaniu stringów liczyłem ile ich jest, i w całkowicie osobnej pętli 'przepisałem' do drugiej tablicy adresy z pierwszej. Omen neomen - DZIAŁA :)
 Dziękuje za odpowiedź.
P-74026
« 1 »
  Strona 1 z 1