dynamiczna alokacja tablicy w c++

0

Witam, chcę napisać funkcję w c++ która przyjmuje jako parametr pewien ciąg danych, ilość elementów tego ciągu oraz indeks elementu który ma być wykreślony z ciągu. Robię to na tej zasadzie że w funkcji tworzę sobie 2 ciąg któremu funkcją mallock alokuję odpowiednio mniej miejsca niż pierwotnemu ciągowi i dodaje do niego wszystkie elementy oprócz tego elementu który ma być wykreślony. Potem trzeba jakoś przypisać do pierwotnego ciągu wartości z nowego ciągu i tu pojawiają się problemy.
robię to tak:

free(ciag);
ciag = (int*) malloc(iloscElementowCiagu * sizeof(int));
for(int i=0; i<iloscElementowCiagu; i++)
{
	*(ciag + i) = *(nowy_ciag+i);
}
free(nowy_ciag);
 

Czyli po prostu zwalniam pamięć ze starego ciągu a potem na nowo alokuję dla niego pamięć i przepisuję każdy element z nowego ciągu do starego ciągu, na koniec zwalniam pamięć z nowego ciągu. Niestety gdy spróbuję poza funkcją odczytać wartości z ciągu to wychodzą ogromne liczby ze znakiem minus. Tak wygląda sygnatura metody:

void usunLiczbezCiagu(int* ciag, int liczbaElementow, int indeks) 

Dodam że jednym z wymogów jest to że nie mogę skorzystać z z operatorów new[] ani delete[], wszystko muszę robić przy użyciu starych funkcje z języka C, jakieś podpowiedz? Z góry dziękuję.

1

Jeśli to C++ to do dynamicznej alokacji pamięci używaj operatora new ,ponieważ on zrobi to znacznie lepiej tzn. Wywoła się prawidłowy konstruktor definiowanego obiektu(jeśli zalokowaliśmy pamięć na obiekt zdefiniowany przez użytkownika) w przypadku malloc tak nie będzie dlatego zaleca się używanie new. Oczywiście w twoim przypadku nie ma to znaczenia bo typ int nie ma przecież konstruktora, ale jak byś chciał zaalokować pamięć na obiekt jakiejś klasy ma to znaczenie dlatego chcę żebyś o tym pamiętał.

0

A po kiego masz przydzielać nowy obszar, działaj na starym.

void usunLiczbezCiagu(int* ciag, int liczbaElementow, int indeks)
   {
    for(int i=indeks+1;i<liczbaElementow;++i) ciag[i-1]=ciag[i];
   }

wywołanie:

int tb[]={1,2,3,4,5,6,7,8,9};
int N=9;
usunLiczbezCiagu(tb,N--,2);
usunLiczbezCiagu(tb,N--,4);
usunLiczbezCiagu(tb,N--,6);
0

A tak z ciekawości się przyłączę i zapytam:
Jak alokujemy tablicę np. tak:

double* wsk1 = new double[10]; //tworzymy tablicę 10-elementową
for(i=0;i<10;i++)
wsk1[i] = i; //przypisujemy jej wartości

To jak chcę skrócić ową tablicę np. do 7 elementów to mogę zrobić tak?:

double* wsk2 = wsk1; //zapisujemy kopię wskaźnika
wsk1 = wsk1+7; //przesuwamy wskaźnik o 7 miejsc
delete[] wsk1; //kasujemy tablicę od 7 miejsca <--- czy tak można?
wsk1 = wsk2; //cofamy się do początku tablicy (od 7 miejsca nie ma już tablicy - ale chyba powinna być od 0-6)?
0

Nie możesz. Musisz stworzyć nową tablicę i przepisać do niej 7 pierwszych elementów oraz usunąć starą.

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