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

ANSI C - zamiana wartości dwóch tablic dynamicznych poprzez zmianę położeń wartości wskaźników

42 Warsaw Coding Academy
0 głosów
218 wizyt
pytanie zadane 19 marca 2020 w C i C++ przez ullortnaci Nowicjusz (220 p.)

Witam, tak jak w tytule - jak zmienić wartość dwóch tablic dynamicznych przez zmianę położeń wartości wskaźników? Chodzi o dwuwymiarową tablicę dynamiczną.

Mam coś takiego:

	char** tablica = calloc(m, sizeof(char*));
	for (int i = 0; i < m; ++i)
	{
		tablica[i] =calloc(n,sizeof(char));
	}

I jak teraz zamienić przykładowo t[1] z t[0] wartościami wskaźników?

2 odpowiedzi

0 głosów
odpowiedź 19 marca 2020 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Chodzi Ci o zamianę wierszy w takiej macierzy?

// w zmiennych y1 i y2 znajdują się indeksy wierszy, które chcemy zamienić miejscami
for (int x = 0; x < n; ++x) {
    int temp = tablica[y1][x];
    tablica[y1][x] = tablica[y2][x];
    tablica[y2][x] = temp;
}

 

0 głosów
odpowiedź 19 marca 2020 przez mokrowski Mędrzec (158,440 p.)

To są wskaźniki, więc wystarczy je tylko przestawić.

Tak edukacyjnie napisane...

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

void swap_char_ptrs(char ** ptr1, char ** ptr2) {
    char * tmp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = tmp;
}

char ** create_table(const size_t m, const size_t n) {
    char ** table = calloc(m, sizeof(*table));
    for(size_t row = 0; row < m; ++row)
    {
        table[row] = calloc(n, sizeof(**table));
    }
    return table;
}

void dispose_table(char ** table, const size_t m) {
    for(size_t row = 0; row < m; ++row) {
        free(table[row]);
    }
    free(table);
}

void fill_table(char ** table, size_t m, size_t n) {
    char element = 'a';
    for(size_t row = 0; row < m; ++row) {
        for(size_t col = 0; col < n; ++col) {
            table[row][col] = element++;
        }
    }
}

void show_table(char ** table, size_t m, size_t n) {
    for(size_t row = 0; row < m; ++row) {
        for(size_t col = 0; col < n; ++col) {
            printf("%c\t", table[row][col]);
        }
        putchar('\n');
    }
}

void swap_row(char ** table, const size_t row1, const size_t row2) {
    swap_char_ptrs(&(table[row1]), &(table[row2]));
}

int main(void) {
    static const size_t m = 4;
    static const size_t n = 3;

    char** table = create_table(m, n);
    fill_table(table, m, n);
    show_table(table, m, n);

    putchar('\n');
    swap_row(table, 1, 3);
    show_table(table, m, n);

    dispose_table(table, m);

    return 0;
}

BTW. Bez względu na to co mówi prowadzący, to najgłupszy z możliwych sposobów deklarowania i obsługi tablicy 2D.

Podobne pytania

0 głosów
3 odpowiedzi 414 wizyt
+1 głos
1 odpowiedź 359 wizyt
pytanie zadane 18 września 2017 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
1 odpowiedź 134 wizyt
pytanie zadane 28 marca 2020 w C i C++ przez Quanti994 Początkujący (340 p.)

93,377 zapytań

142,379 odpowiedzi

322,528 komentarzy

62,726 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...