funkcja rekurencyjna zwracajaca tablice dynamiczna

Odpowiedz Nowy wątek
2011-06-14 23:23
0

Witam,

Probuje napisac program ktory rekurencyjnie wczyta dane, a nastepnie stworzy z nich tablice dynamiczna.
Tablice te bede wykorzystywal po zakonczeniu fukcji.

W chwili obecnej mam cos takiego:

#include <iostream>
#include <stdlib.h>

using namespace std;

void podaj_liczbe(int &rozmiar, int &licznik, double*& wsk){
    double x;
    cout << "Podaj liczbe, 0 konczy wczytywanie" << endl;
    cin >> x;
    licznik++;
    if ( x == 0) {
    rozmiar = licznik;
    wsk = new double[rozmiar];
    }
    else{
    podaj_liczbe(rozmiar, licznik, wsk);
    }
    wsk[licznik]=x;
    licznik--;

}

void drukuj_tablice(int rozmiar, double wsk[]){
    cout << "\nDrukuje zawartosc tablicy: \n" << endl;
    for (int i = 1; i <= rozmiar; i++)
    cout << " Pozycja: " << i << " \tWartosc: " << wsk[i] << endl;

}

int main()
{
double *wsk;
int rozmiar = 0;
int licznik = 0;
podaj_liczbe (rozmiar, licznik, wsk);
drukuj_tablice(rozmiar, wsk);
} 

Czy poprawnie posluguje sie wskaznikami?
Program sie kompiluje i uruchamia poprawnie, jednak probuje zastosowac ten schemat w wiekszym programie ktory takze sie kompiluje, jednak zawiesza sie po uruchomieniu w Virtualboxie (XP) a dziala poprawnie we wlasciwym systemie (tez XP).
Nie wiem gdzie tkwi blad, chce wykluczyc bledy w skladni przepuszczane przez kompilator. (Codeblocks GCC)
Prosze o pomoc.

Pozostało 580 znaków

2011-06-14 23:37
0
  • Słabo z formatowaniem
  • Masz memlaka
  • Użyj cstdlib zamiast stdlib.h
  • W ten sposób kasujesz sobie starą tablicę i musiał byś od nowa ją zapełniać. Użyj std::vestor o ile musi to być tablica bo w tym przypadku najlepsza była by lista.

Pozostało 580 znaków

2011-06-14 23:48
0

formatowanie - tak, wiem
memlaka - czyli? ze nie usuwam tablicy na koniec? to wiem
Użyj cstdlib - ok
musi byc tablica dynamiczna, nie lista ani nic innego. "kasuje stara tablice"? - nie rozumiem ? tablica ma powstac tylko raz w calym programie.

Pozostało 580 znaków

2011-06-15 03:35
0

Tablice w C++ indeksowane są od zera, nie od jedynki.

Pozostało 580 znaków

2011-06-15 07:38
0
 double*& wsk

Dawno nie programowałem w C++, ale wydaje mi się, że ta referencja('&') jest zbędna .

edytowany 1x, ostatnio: Sarrus, 2011-06-15 07:39

Pozostało 580 znaków

2011-06-15 08:21
0

@Sarrus nie jest zbędna bo potrzebujemy zmienić wartość na jaką wskazuje wskaźnik.
@hrupek zobacz jak to idzie: http://ideone.com/QAVVs widzisz, że są inne adresy? A dodatkowo new ustawia wartość wszystkich elementów na 0 czyli w tablicy masz same 0 i ostatni element jest równy podanej wartości.

Pozostało 580 znaków

2011-06-15 16:40
0

@winerfresh

Nie do konca rozumiem twoj przyklad. Kompiluje mi sie to w Codeblocks, ale dlaczego mozesz ponownie definiowac tab bez bledu ?
Rozne adresy poniewaz jest 9 tablic dynamicznych wskazywanych przez tab, czy to wyciek pamieci i zajmowane jest kolejne miejsce bez kasowania?

Poza tym chcialbym wrocic do mojego przykladu. Zwroc uwage na tytul/poczatek watku, moze mylnie rozumiane jest wstawienie funkcji drukuj...
Potrzebuje wczytywac rekurencyjnie nieznana ilosc danych, po otrzymaniu zera utworzyc tablice dynamiczna i cofajac sie w rekursji tablice te zapelnic.
Na koniec chce by istniala poza funkcja wczytujaca.

Czy poprawnie posluguje sie tu wskaznikami (zakladajac ze na sam koniec skasuje tablice) ?
A moze kojarzycie jakis adres w sieci gdzie jest cos takiego opisane ? moze byc po EN, ja jakos nie moge nic znalezc :(

edytowany 2x, ostatnio: hrupek, 2011-06-15 16:40

Pozostało 580 znaków

2011-06-15 17:45
0

Chodzi o to, że jak chcesz mieć nową większą tablicę to musisz zrobić tak:

double* tmp = tab;
tab = new double[new_size];
memcpy(tab, tmp, oldsize*sizeof(double));
delete [] tmp;
... pod warunkiem że new_size>=oldsize - _13th_Dragon 2011-06-15 18:02

Pozostało 580 znaków

2011-06-15 19:38
0

ok, ale w moim przypadku tablica powstanie tylko raz.

Wiec nadal pozostaje aktualny problem z mojego poprzedniego postu.

Pozostało 580 znaków

2011-06-15 20:36
0
winerfresh napisał(a)

@hrupek zobacz jak to idzie: http://ideone.com/QAVVs widzisz, że są inne adresy? A dodatkowo new ustawia wartość wszystkich elementów na 0 czyli w tablicy masz same 0 i ostatni element jest równy podanej wartości.

Tablica jest tworzona tylko raz, gdy x ma wartość 0, później program wraca i wykonuje kod za blokiem if..else

@hrupek bardzo niebezpieczny jest kod bo wychodzisz za tablicę. Indeksy tablicy w C++ są od 0 do rozmiar-1.
U Ciebie dla x = 0


    rozmiar = licznik;
    wsk = new double[rozmiar];
    wsk[licznik]=x;
    licznik--;
}

Zauważ, że

rozmiar = licznik

więc wsk[rozmiar] = x

 Piszesz za tablicą - raz program może działać, a innym razem nie. Zależy jakich jeszcze danych używasz. Powinieneś raczej używać <code class="cpp">wsk[licznik-1] = x

lub przenieść wyżej dekrementację licznika, a w funkcji drukowania tablicy for powinien wyglądać tak:

for (int i = 0; i < rozmiar; i++)

To chyba tyle
Pozdrawiam.

edytowany 4x, ostatnio: Sarrus, 2011-06-15 20:47

Pozostało 580 znaków

2011-06-15 21:25
0

@Sarrus
Tak, oczywiscie masz racje, to jest duzy blad. Mialem do tego wrocic, ale nie zdawalem sobie sprawy, ze wychodze poza tablice.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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