Dynamiczne tablice

0

Witam, mam do napisania program, który będzie pobierał od użytkownika n liczb, dopóki nie poda on liczby równej lub mniejszej 0 (liczby te nie wliczają się do końcowego wyniku), a potem je wyświetli. Coś tu nie działa jak powinno i sam nie wiem dlaczego.

    int ile = 0;
    int podana = 1;
    int * tablica = 0;
    int * help = 0;

    while(podana > 0)
    {
        cin >> podana;
        if(podana > 0 && ile == 0){
            tablica = new int[ile];
            tablica[ile] = podana;
        }else if(podana > 0 && ile > 0){
            int * help = new int[ile];
                memcpy(help,tablica,sizeof(tablica));
            delete []tablica;
            int * tablica = new int[ile];
                memcpy(tablica,help,sizeof(help));
                tablica[ile] = podana;
            delete []help;
        }else{
            break;
        }
        ile++;
    }
   cout << endl;

    for(int x = 0; x < ile; x++)
        cout << tablica[x] << endl;

delete []tablica;
0
int *grow(int *tab,int size,int newsize)
  {
   int *tmp=new int[newsize];
   memcpy(tmp,tab,size*sizeof(int));
   delete[] tab;
   return tmp;
  }

...
    size_t count=0,capsity=16;
    int *tab=new int[capsity];
    for(int value;(cin>>value)&&(value>=0);tab[count++]=value) if(count>=capsity) tab=grow(tab,count,capsity<<=1);
    tab=grow(tab,count,count);
...

A jeszcze lepiej:

vector<int> tab;
for(int value;(cin>>value)&&(value>=0);tab.push_back(value)) {}
0

Napisałem coś prostszego dzięki Twojej funkcji i trochę mnie dziwi kod w jednym miejscu. Dlaczego podając stary rozmiar tablicy równy nowemu to wszystko działa ? Chodzi o

tablica = copy(tablica,ile,ile)

Przecież stary rozmiar tablicy to ile-1 (ale w takim razie przy 0 byłoby -1 :/).

int *copy(int *tab, int size, int newsize){
    int *tmp = new int[newsize];
    memcpy(tmp,tab,size*sizeof(int));
    delete []tab;
    return tmp;
}

int main()
{
    int podana = 1;
    int ile = 0;
    int * tablica = 0;

    while(podana > 0){
        cin >> podana;
             if(podana > 0){
                tablica = copy(tablica,ile,ile);
                tablica[ile] = podana;
             }else{
                break;
             }

            ile++;
    }

    for(int x = 0; x < ile; x++){
        cout << tablica[x] << endl;
    }
0

Na końcu tab=grow(tab,count,count); to już ostateczne dopasowanie, można pominąć.
To co podałeś nie będzie działać jak chcesz prościej to:

for(int value;(cin>>value)&&(value>=0);tab[count++]=value) tab=grow(tab,count,count+1);
0

Dziwne, bo u mnie działa doskonale. Tylko zgubiłem klamerke na końcu.

0

A musisz używać tablic dynamicznych? Czy możesz np. std::vector? :)

0

Dzięki za pomoc, użyłem ostatecznie wektorów.

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