Tablica dynamiczna (usuwanie zer)

0
int usunzera(int n, int *A) {
	int k = 0, B[n];
	int *ptr;
	for (int i = 0; i < n; i++) {
		if (A[i] != 0) {
			B[k] = A[i];
			k++;
		}
	}
	delete[] A;
	int *A;
	A = ptr;
	A = new int[k];
	memcpy(A, B, k);
	delete[] B;
	return k;
}

Moje zadanie polega na usunięciu zer z tablicy problem w tym że wyskakuje błąd
22 [Error] declaration of 'int* A' shadows a parameter
Chyba nie ogarniam jeszcze tablic dynamicznych :/

0

Nie możesz dwa razy deklarować jednej zmiennej.

0
int usunzera(int n, int *A) {
	int k = 0, B[n];
	int *ptr;
	for (int i = 0; i < n; i++) {
		if (A[i] != 0) {
			B[k] = A[i];
			k++;
		}
	}
	delete[] A;
	A = ptr;
	A = new int[k];
	memcpy(A, B, k);
	return k;
}

Zmodyfikowałem kod. Teraz program odpala, ale w tablicy A wyskakują jakieś babole zamiast skopiowanej tablicy B.

0

@Yuri20:
Mam tablice A z której chcę usunąć zera. Tworzę sobie pomocniczą tablice B. W której nie ma już zer. Chcę wykasować tablicę A i stworzyć ją ponownie z mniejszą ilością elementów (bez zer) i przekopiować tablicę B do A.
n - długość starej tablicy
k - długość nowej tablicy
A - tablica z zerami
B - tablica bez zer

deklaracja funkcji memcpy.

#include <cstring>

void * memcpy( void * destination, const void * source, size_t num );

</code=cpp>

void* destination - Wskaźnik na pamięć, do której nastąpi kopiowanie.
const void* source - Wskaźnik na pamięć, z której nastąpi kopiowanie.
size_t num - Liczba bajtów do skopiowania.

@zonkoo22:
Chcę po prostu przekopiować tablicę B do A. Bo w B już nie ma zer.
Usuwam A, żeby "zmniejszyć" w niej ilość elementów.

0

Jak sądzisz, gdzie pokazuje wskaźnik A po komendzie

delete[] A;
0
    delete[] A;
    A = ptr;
    A = new int[k];

Środkowe przypisanie bez sensu :P

memcpy(A, B, k);

Popatrz jak działa memcpy: http://en.cppreference.com/w/cpp/string/byte/memcpy
Kopiujesz k bajtów, nie k elementów.

Poprawny kod:

memcpy(A, B, k*sizeof(int));

edit: poprawniejsze rozwiązanie @_13th_Dragon poniżej.

0

Dzięki bardzo błąd tkwił w złym odpaleniu funkcji ;)

1
int usunzera(int n,int *A) // zostawiamy to w tej samej tablice
  {
   int k=0;
   for(int i=0;i<n;++i) if(A[i]) A[k++]=A[i];
   return k;
  }
// można również wywołać dla tablicy zadanej jako stała:
int X[]={1,0,2,0,3,0,4};
int len=usunzera(7,X);
int usunzera(int n,int **A) // zmieniamy tablicę więc musimy nowy adres tablicy jakoś przekazać
  {
   int k=0;
   int *B=*A;
   for(int i=0;i<n;++i) if(B[i]) B[k++]=B[i];
   *A=new int[k];
   memcpy(*A,B,k*sizeof(int));
   delete[] B;
   return k;
  }
// koniecznie trzeba wywoływać dla przydzielonej tablicy:
int X[]={1,0,2,0,3,0,4};
int *Y=new int[7];
memcpy(Y,X,7*sizeof(int));
int len=usunzera(7,&Y);
delete[] Y;

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