Przenoszenie wartosci ze starej tablicy do nowej

0

Witam!
Dlaczego podczas próby przeniesienia wartości z jednej tablicy do drugiej otrzymuje randomowe inty zamiast tego, co było w starej tablicy:

void addValue(int value, int offset, int size,int *val, int *off, int& tabLength, int& tabContains, int defVal) {
            :
            :
            :
            :
					int tabBoost = 5;
					tabLength+=tabBoost;
					int *newVal = new int[tabLength];
					int* newOff = new int[tabLength];
					int i = 0;
					for(; i<tabLength-tabBoost; i++)
					{
						newVal[i] = val[i];
						newOff[i] = off[i];
					}
					newVal[i + 1] = value;  
					newOff[i + 1] = offset;
					tabContains++;
					delete[] val;
					delete[] off;
					val = newVal;
					off = newOff;
					cout << "realokuje tablice(++) i dodaje wartosc " << value << "na offset: " << offset;

            :
            :
            :

Tutaj poprawnie pokazuje wartosci tablicy, ktore umieszczalem

0. 1
1. 2
3. 4
4. 5
5. 6
7. 8
8. 9
9. 10
10. 11
11. 12

A tutaj po relokacji otrzymuje coś takiego:

-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
-572662307. -572662307
2. -572662307
83886085. 67108868
56797. 56797
5342432. 5342272

ilość miejsc nowej tablicy sie zgadza, ale wartości to jak widać.

Metoda printująca w skrócie:

void print(int size, int tabLength, int *off, int *val, int defVal) {
	for (int i = 0; i < tabLength; i++) {
		cout << off[i]<<". " << val[i] << endl;
	}

0

Pomijając już użycie new/delete i wynajdowanie koła na nowo, zamiast użyć std::vector, problemem jest to, że przekazujesz wskaźniki przez wartość. Proponuję wykonać eksperyment myślowy: Co wypisze poniższy kod?

void foo(int* ptr)
{
    ptr = new int;
}

auto main() -> int
{
    int* x = nullptr;
    foo(x);
    cout << x << endl;
}
0

Niestety vektora nie mogę użyć, musi być w tablicach dynamicznie alokowanych. Nie wiem, co oznacza "auto main() ->", bo z cpp się bawię w sumie od piątku. Dostaję takie dziwne inty, bo zmieniałem wartości na kopiach wskaźników zamiast na oryginałach? Tak na początku myślałem, ale nie wiem czemu od razu nie dostawałem dziwnych liczb zamiast tego, co wprowadzałem więc odrzuciłem tą możliwość i więcej pomysłów nie mam.

1

Tak, nadpisujesz kopie wskaźników. Przekazuj referencję do wskaźnika lub wskaźnik na wskaźnik jeśli chcesz propagować modyfikację wskaźnika.

Dlaczego nie możesz użyć wektora?

auto main() -> int to to samo co int main().

0

Muszę zrobić program, który umożliwia różne akcje na wektorach rzadkich, czyli w skrócie zadanie polega na tym, ze jak wektor się składa ze stu piątek i np. wartości trzy to zamiast wszystko zapisywać w jakiejś strukturze danych muszę jedynie zapisać wartości (i ich offsety) różne od wartości domyślnych wektora w tym wypadku piątek i właśnie te wartości, które muszę zapisać mają być w tablicach alokowanych dynamicznie.

0

A dlaczego nie mogą być w wektorach? Wektory też alokują pamięć dynamicznie, ale odpadają wszelkie problemy z ręcznym zarządzeniem pamięcią.

0

W poleceniu jest "tablicach" więc zakładam, że prowadzący nie będzie uznawał użycia wektorów, które ułatwiają sprawę. Chyba, że w terminologii cpp wektory = tablice i zamiast to dokładnie sprawdzić nie potrzebnie sobie roboty dokładam.

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