Cześć, mam problem z działaniem na tablicy statycznej dwuwymiarowej w funkcji.
W poniższym kodzie próbuje zrozumieć działanie funkcji i wskaźników, docelowo mam napisany inny kod ale cały w main i chcę go poprawić. Zależy mi na umieszczeniu wzoru w funkcji, wzór ten wykorzystuje dwie tablice dynamiczne, tablice statyczną i kilka zmiennych. Wynikiem są zmienione wartości tylko w jednej tablicy dynamicznej. Nic nie zwracam bo wyniki z tej tablicy są potrzebne w dalszych obliczeniach.
Rozumiem jak wrzucić do funkcji zmienną jako kopie, zmienną jako wskaźnik, tablice dynamiczną dwuwymiarową jako wskaźnik, ale nie wiem jak umieścić i korzystać z:
- tablicy statycznej dwuwymiarowej jako kopia
- tablicy statycznej dwuwymiarowej jako wskaźnik
- tablicy dynamicznej dwuwymiarowej jako kopia
Jako kopia rozumiem działanie na kopiach wartości, czyli po za funkcją nic się nie zmienia, natomiast jako wskaźnik rozumiem działanie na adresach wartości, czyli po wyjściu z funkcji i nie zwracaniu niczego zmiany są widoczne bo bazuje na adresach.
W poniższym kodzie mogę działać na tablicy dynamicznej, jednak nie wiem jak zaimplementować tablicę statyczną w funkcji. Ma ktoś czas pomóc?
Jestem samoukiem więc wszelkie uwagi odnośnie sposobu pisania kodu są bardzo mile widziane, dopiero zaczynam więc warto porzucić złe nawyki.
#include <stdio.h>
#include <stdlib.h>
void test_dynamiczna(int *p, int **tablica_dyn);
void test_statyczna(int *p, int **tablica_stat);
int main(){
int p = 5; // do mnożenia
int w1 = 3; // liczba wierszy
int k = 2; // liczba kolumn
int i, j; // do for
int o = 1; // do zapisywania
// Alokacja pamięci
int **tablica_dyn;
tablica_dyn = (int **)malloc(w1 * sizeof(int *));
for (i = 0; i < w1; i++){
tablica_dyn[i] = (int *)malloc(k * sizeof(int));
}
// Zapisanie wartości do tablica_dyn
for (i = 0; i < w1; i++){
for (j = 0; j < k; j++){
tablica_dyn[i][j] = o;
o++;
}
}
// Zapisanie wartości do tablica_stat
int tablica_stat[3][2] = {
{1 ,2},
{3, 4},
{5, 6}
};
// Wyświetlenie tablica_dyn przed zmianą
for (i = 0; i < w1; i++){
for (j = 0; j < k; j++){
printf("%d ", tablica_dyn[i][j]);
}
printf("\n");
}
printf("\n");
// Wyświetlenie tablica_stat przed zmianą
for (i = 0; i < w1; i++){
for (j = 0; j < k; j++){
printf("%d ", tablica_stat[i][j]);
}
printf("\n");
}
printf("\n\n");
test_dynamiczna(&p, tablica_dyn);
test_statyczna(&p, tablica_stat);
// Wyświetlenie tablica_dyn po zmianach
for (i = 0; i < w1; i++){
for (j = 0; j < k; j++){
printf("%d ", tablica_dyn[i][j]);
}
printf("\n");
}
printf("\n");
// Wyświetlenie tablica_stat po zmianach
for (i = 0; i < w1; i++){
for (j = 0; j < k; j++){
printf("%d ", tablica_stat[i][j]);
}
printf("\n");
}
// Zwalnianie pamięci
for (i = 0; i < w1; i++){
free(tablica_dyn[i]);
}
free(tablica_dyn);
tablica_dyn = NULL;
return 0;
}
void test_dynamiczna(int *p, int **tablica_dyn){
tablica_dyn[1][1] *= *p;
}
void test_statyczna(int *p, int **tablica_stat){
tablica_stat[1][1] *= *p;
}