Usuwanie danego wiersza z tablicy dwuwymiarowej.

0

Hey. Mam problem z usunięciem wiersza w tablicy dwuwymiarowej zadeklarowanej dynamicznie.

 

void DeleteRow(int *N, int* M, int** a, int n)
{
	(*N)--;
	for(int i = n; i < *N; i++)
	{
		*(M + i) = *(M + i + 1);
	}
	M = (int*)realloc(M, *N * sizeof(int));
	for(int i = n; i < *N; i++)
	{
		*(a + i) = (int*)realloc(*(a + i), *(M + i) * sizeof(int));
		for (int j = 0; j < *(M + i); j++)
		{
			*(*(a + i) + j) = *(*(a + i + 1) + j);
		}
	}
	a = (int**)realloc(a, *N * sizeof(int));
}

int main()
{

	int N, *M, **a; // N - liczba wierszy, M - tablica dlugosci wierszy, a - tablica dwuwymiarowa
	scanf("%d", &N);
	M = (int*)malloc(N * sizeof(int));
	a = (int**)malloc(N * sizeof(int));
	LoadArray(N, M, a);
    int n;
    scanf("%d", &n);
    DeleteRow(&N, M, a, n);

    //...

    return 0;
}

Ktos mi powie co jest zle?

0

debugger i sam(a) mozesz sprawdzic co jest zle ;)

0
  1. Po co tyle wywołań realloc? Wystarczy przepisać wskaźnik.
  2. Ostatni realloc powinien mieć N*sizeof(**int ***)
  3. Pierwszy malloc, przed wywołaniem funkcji, powinien mieć N*sizeof(**int ***)
  4. MAm nadzieję, ze dobrze zaalokowałeś poszczególne wiersze ...
  5. Sklecone na szybko, ostrzegam, nie sprawdzałem:
void DeleteRow(int *N, int* M, int ***a, int n)
{
	if (n < 0 || n >= *N)
		return;
	(*N)--;

	for (int i = n; i < *N; ++i)
	{
		M[i] = M[i + 1];
	}
	M = (int *)realloc(M, (*N) * sizeof(int));

	free((*a)[n]);
	
	for (int i = n; i < *N; ++i)
	{
		(*a)[i] = (*a)[i+1];
	}
	*a = (int **)realloc(*a, (*N) * sizeof(int *));
}
1

A, jeszcze jedno, źle przekazujesz a. Po wyjściu z funkcji a wskazuje na starą pamięć. int **a jest wskaźnikiem na tablicę tablic intów. Potrzebujesz kolejnego wskaźnika żeby móc go podmienić, bo ostatni realloc alokuje Ci nową tablicę wskaźników, ale zapisuejsz go do zmiennej a (trzymającej adres nowej pamięci), której widoczność jest ograniczona do zasięgu tej funkcji.

0

Działa :) Super, dzięki wielkie za pomoc ;)

źle zaalokowane a w mainie..

a = (int**)malloc(N * sizeof(int*));

zamiast:

a = (int**)malloc(N * sizeof(int));

zapomniałem o wskaźniku...

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