• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Dynamicznie alkowane tablice

Object Storage Arubacloud
0 głosów
215 wizyt
pytanie zadane 16 października 2017 w C i C++ przez LightInWindow Użytkownik (720 p.)
zamknięte 17 października 2017 przez LightInWindow

Cześć.

Mam utowrzoną nową dynamicznie alokowaną tablicę i chciałbym do niej przepisać wartości(do innego miejsca w pamięci) a następnie usuną starą, ale gdy uruchamiam coś takiego to nie działa tak jak powinno tzn alkouje miejsce na nową tablicę ale wartości zamiast przypisania to jakieś śmieci.

void changeSizeOfVector(int *tabValue, int *tabOffsets, int &oldSize, int newSize) {;
	int *newTabOfValues = new int[newSize];
	int *newTabOfOffsets = new int[newSize];

	int temp=0;
	if (oldSize > newSize)
		temp = newSize;
	if (oldSize < newSize)
		temp = oldSize;

		for (int i = 0; i < temp; i++) {
			newTabOfValues[i] = tabValue[i];
			newTabOfOffsets[i] = tabOffsets[i];
		}

		delete[] tabValue;
		delete[] tabOffsets;

		tabValue = new int[newSize];
		tabOffsets = new int[newSize];

		beg1 = tabValue;
		beg2 = tabOffsets;
		
		for (int i = 0; i < temp; i++) {
			tabValue[i] = newTabOfValues[i];
			tabOffsets[i] = newTabOfOffsets[i];
			}

	oldSize = temp;
	delete[] newTabOfValues;
	delete[] newTabOfOffsets;
}

 

komentarz zamknięcia: Problem rozwiązany.

1 odpowiedź

0 głosów
odpowiedź 16 października 2017 przez Dexterim Dyskutant (8,370 p.)

Zaalokowales miejsce na tablice ale nie masz gwarancji że są w niej same zera np. majac sytaucje ze newSize jest wiesze od oldSize to przypisujesz stare wartosci do oldSize a killka zostaje nadal zaśmieconych.

Dodaj do alokowania pamięci {0} na koniec to Ci wypelni samymi zerami lub skorzystaj z jakiegos kontenera.

Co robia zmenne?

beg1 = tabValue;
beg2 = tabOffsets;

 

Jaki jest sens przypisywania oldSize do oldSize?

komentarz 16 października 2017 przez LightInWindow Użytkownik (720 p.)

Na tak, ale to nie ma znaczenia co tam jest bo i tak potem to usuwam delete[] tabValue

Jeżeli wywołam tą funkcję to dostaje same śmieciowe wartość bez żadnych normalnych.

Zmienne nic nie robią po prostu zapomnialem skasowac

Wywołanie + alokacja :

	int SIZE = 10;

	int * tabOfValues = new int[SIZE];
	int * tabOfOffsets = new int[SIZE];
	for (int i = 0; i < SIZE; i++)
	{
		tabOfValues[i] = i;
		tabOfOffsets[i] = i;
	}

	changeSizeOfVector(tabOfValues, tabOfOffsets,SIZE,8);
	
	for (int i = 0; i < SIZE; i++)
		cout << tabOfValues[i] << " : " << tabOfOffsets[i] << endl;

 

komentarz 16 października 2017 przez Dexterim Dyskutant (8,370 p.)
Jeśli to jest cały kod który wrzuciles to jeśli zmiejszasz tablice to wyniki wychodzą normalne bynajmniej u mnie.
komentarz 16 października 2017 przez LightInWindow Użytkownik (720 p.)
edycja 16 października 2017 przez LightInWindow

Tutaj masz cały kod, skompiluj to :

void changeSizeOfVector(int *tabValue, int *tabOffsets, int &oldSize, int newSize) {;
	int *newTabOfValues = new int[newSize];
	int *newTabOfOffsets = new int[newSize];

	int temp=0;
	if (oldSize > newSize)
		temp = newSize;
	if (oldSize < newSize)
		temp = oldSize;

		for (int i = 0; i < temp; i++) {
			newTabOfValues[i] = tabValue[i];
			newTabOfOffsets[i] = tabOffsets[i];
		}

		delete[] tabValue;
		delete[] tabOffsets;

		tabValue = new int[newSize];
		tabOffsets = new int[newSize];
		
		for (int i = 0; i < temp; i++) {
			tabValue[i] = newTabOfValues[i];
			tabOffsets[i] = newTabOfOffsets[i];

		}

	oldSize = newSize;
	delete[] newTabOfValues;
	delete[] newTabOfOffsets;
}

int main()
{
	int SIZE = 10;

	int * tabOfValues = new int[SIZE];
	int * tabOfOffsets = new int[SIZE];
	for (int i = 0; i < SIZE; i++)
	{
		tabOfValues[i] = i;
		tabOfOffsets[i] = i;
	}

	changeSizeOfVector(tabOfValues, tabOfOffsets,SIZE,8);
	
	for (int i = 0; i < SIZE; i++)
		cout << tabOfValues[i] << " : " << tabOfOffsets[i] << endl;

	cout << tabOfValues[9] << " : " << tabOfOffsets[9] << endl;
	
	return 0;
}

 

komentarz 16 października 2017 przez Dexterim Dyskutant (8,370 p.)
#include<iostream>

using namespace std;

void changeSizeOfVector(int *tabValue, int *tabOffsets, int &oldSize, int newSize) {
    int *newTabOfValues = new int [newSize]{0};
    int *newTabOfOffsets = new int [newSize]{0};
 
        for (int i = 0; i < oldSize; i++) {
            newTabOfValues[i] = tabValue[i];
            newTabOfOffsets[i] = tabOffsets[i];
        }
 
        delete [] tabValue;
        delete [] tabOffsets;
 
        tabValue = new int [newSize]{0};
        tabOffsets = new int [newSize]{0};
 
        
         
        for (int i = 0; i < newSize; i++) {
            tabValue[i] = newTabOfValues[i];
            tabOffsets[i] = newTabOfOffsets[i];
        }
 
	oldSize = newSize;
	delete [] newTabOfValues;
	delete [] newTabOfOffsets;
}
int main(){
	
	int SIZE = 10;
 
	int * tabOfValues = new int [SIZE];
	int * tabOfOffsets = new int [SIZE];
	for (int i = 0; i < SIZE; i++)
	{
	    tabOfValues[i] = i;
	    tabOfOffsets[i] = i;
	}
	 
	changeSizeOfVector(tabOfValues, tabOfOffsets,SIZE,11);
	 
	for (int i = 0; i < SIZE; i++)
	    cout << tabOfValues[i] << " : " << tabOfOffsets[i] << endl;
		
	 delete [] tabOfValues;
	 delete [] tabOfOffsets;
}

Masz przykład troszke przerobiony. 

komentarz 16 października 2017 przez LightInWindow Użytkownik (720 p.)
Wywala mi dziwne błędy
komentarz 16 października 2017 przez Dexterim Dyskutant (8,370 p.)

tzn. jakie? 

komentarz 16 października 2017 przez LightInWindow Użytkownik (720 p.)
To zależy od kompilatora, w Code Blocks wszystko działa ok tylko musiałem usunąć {0}, a w MVS 2015 nie działa wogóle, wywala dziwne błędy typu app.exe has triggered a breakpoint, po czym się zawiesza.
2
komentarz 17 października 2017 przez j23 Mędrzec (194,920 p.)

Ta changeSizeOfVector jest bez sensu. Popraw ją na:

void changeSizeOfVector(int* &tabValue, int* &tabOffsets, size_t oldSize, size_t newSize) 
{
    int *newTabOfValues = new int [newSize]{0};
    int *newTabOfOffsets = new int [newSize]{0};
  
    size_t toCopy = std::min(oldSize, newSize);

    for (size_t i = 0; i < toCopy; ++i) {
        newTabOfValues[i] = tabValue[i];
        newTabOfOffsets[i] = tabOffsets[i];
    }

    delete [] tabValue;
    delete [] tabOffsets;

    tabValue = newTabOfValues;
    tabOffsets = newTabOfOffsets;
}

 

1
komentarz 17 października 2017 przez Dexterim Dyskutant (8,370 p.)

W Twoim rozważaniu LightInWindow jak i moim pomineliśmy fakt, że przy pomocy takiej deklaracji funkcji 

void changeSizeOfVector(int *tabValue, int *tabOffsets, int &oldSize, int newSize)

nie można zmienić wskaźnika. Wiec rozwiązaniem tego jest referencja użyta wyżej przez kolege lub **/

komentarz 17 października 2017 przez LightInWindow Użytkownik (720 p.)
Dzięki za pomoc, ułatwiło mi to zrozumienie ! :)

Podobne pytania

0 głosów
3 odpowiedzi 665 wizyt
0 głosów
1 odpowiedź 167 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez pozdro600 Początkujący (260 p.)
0 głosów
1 odpowiedź 577 wizyt
pytanie zadane 29 lutego 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)

92,539 zapytań

141,382 odpowiedzi

319,479 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...