Malina94 Temat założony przez niniejszego użytkownika |
Kopiowanie danych do większej tablicy dynamicznej » 2014-11-30 15:06:21 Witam! Co jest nie tak w poniższym kodzie? Przy pierwszym przepisaniu pojawiają się krzaki. Późniejsze dopisanie przebiega już dobrze. #include <iostream>
using namespace std;
struct abcd { char x; };
void powieksz( int licznik, abcd * historia, int a );
int main() { int a = 5; abcd * historia = new abcd[ a ]; int licznik = 0; char liczba; while( 1 ) { cin >> liczba; historia[ licznik ].x = liczba; licznik++; powieksz( licznik, historia, a ); cout << "ZAWARTOSC:" << endl; for( int i = 0; i < licznik; i++ ) { cout << historia[ i ].x << " "; } cout << endl; } }
void powieksz( int licznik, abcd * historia, int a ) { int b; if( licznik == a ) { b = a * 2; abcd * temp = new abcd[ b ]; for( int i = 0; i < a; i++ ) { temp[ i ].x = historia[ i ].x; } delete[] historia; a = b; abcd * historia = new abcd[ a ]; for( int i = 0; i < a; i++ ) { historia[ i ].x = temp[ i ].x; } delete[] temp; } }
|
|
darko202 |
» 2014-11-30 21:15:48 void powieksz( int licznik, abcd * historia, int a );
int main() { int a = 5; .... powieksz( licznik, historia, a ); cout << a; ... } }
void powieksz( int licznik, abcd * historia, int a ) { int b; ... a = b; .... }
nie mam kompilatora aby puścić Twój kod, ale popatrz to co zostawiłem wyżej wydaje mi się że zmienna tak przekazana jest kopiowana i wykonujesz zmiany na kopii, a nie orginalnej zmienne nie ulega zmianie - dodaj po wywołanu metody powiększ cout << a; 2 //to tworze tablice tymczasowa o podwojonej ilosci komorek //przepisuje zawartosc mojej tablicy do tymczasowej //kasuje tablice -- to wystarczyłoby bo co jest istotnego dla tablicy tymczasowej -> wskaźnik na elemet pierwszy historia = temp; // załatwia to co robisz później //zmieniam rozmiar zmiennej //tworze moja tablice o nowym rozmiarze //przepisuje moje dane //kasuje tymczasowa tablice nie rozumiem co oznacza sypie mi krzaki, ale przeważnie oznacz że wyswietla jakieś miejsce w pamieci. |
|
Maciek |
» 2014-11-30 21:18:38 Z ciekawości zapytam - czy nie możesz wykorzystać jakiegoś kontenera z biblioteki STL ?? |
|
Malina94 Temat założony przez niniejszego użytkownika |
» 2014-11-30 21:40:06 Zmieniłam trochę i teraz do funkcji podaję wskaźnik na 'a'. Jeśli chodzi o krzaki, to dostaję coś takiego: http://screenshooter.net/5472572/isrfyol
Maciek - nie mogę. STL mam całkowicie zabronione. |
|
Malina94 Temat założony przez niniejszego użytkownika |
» 2014-11-30 21:43:20 Spróbowałam tak: void powieksz( int licznik, abcd * historia, int * wsk_a ) { int b; if( licznik == * wsk_a ) { b =( * wsk_a ) * 2; abcd * temp = new abcd[ b ]; for( int i = 0; i < * wsk_a; i++ ) { temp[ i ].x = historia[ i ].x; } for( int i = 0; i < * wsk_a; i++ ) { historia[ i ].x = temp[ i ].x; } } }
Teraz działa :) Dziękuję za pomoc. |
|
darko202 |
» 2014-12-01 08:20:51 Niestety nadal ma 2 błędy 1. tzw. wycieki pamięci jeśli zarezerwujesz pamięć przy pomocy new powinieneś to zwolnić delete delete zwalnia pamięć a nie usuwa samą zmienną
2. nieefektywny algorytm rezerwując pamięć na nową tablicę otrzymujemy ciągły obszar dlatego po przekopiowaniu wartości do nowej tablicy wystarczy zmienić wskaźnik na pierwszy element tablicy - reszta to zbędne kroki
przy dużej wielkości tablicy Twój program wykona odpowiednio dużą ilość niepotrzebnych operacji.
|
|
Malina94 Temat założony przez niniejszego użytkownika |
» 2014-12-01 12:36:22 Czyli pamięć której tablicy powinnam kasować za pomocą delete? Tymczasowej? A wskaźnik na pierwszy element, to chodzi o ten zapis, co ktoś wyżej napisał: historia = temp; ? Niby coś takiego też działa: void powieksz( int licznik, abcd * historia, int * wsk_a ) { int b; if( licznik == * wsk_a ) { b =( * wsk_a ) * 3; abcd * temp = new abcd[ b ]; for( int i = 0; i < * wsk_a; i++ ) { temp[ i ].x = historia[ i ].x; } historia = temp; delete[] temp; } }
Ale przy wpisaniu większej ilości danych i przy próbie wyłączenia konsoli, ta się wiesza. |
|
darko202 |
» 2014-12-01 14:08:11 po przepisaniu wartości do tablicy pomocniczej kasujesz zarezerwowaną pamięć tablicy podstawowej przypisujesz zmiennej tablica podstawowa adres tablicy pomocniczej podobnie jak w http://cpp0x.pl/forum/temat/?id=17763 void dodaj( A *& tab, int & x ) { A * tmp = new A[ x + 1 ]; for( int i = 0; i <( x ); i++ ) tmp[ i ] = tab[ i ]; delete[] tab; tmp[ x ]; tab = tmp; x++; }
|
|
« 1 » 2 |