[C] funkcje, macierze, wskażniki

0
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

/*
Napisz funkcje które tworzą macierz o wymiarze nxn wypełnioną wartościami i. Funkcja 'createNewMatrix' jako argument przyjmuje wskaźnik do tablicy dwuwymiarowej.

Program ma następnie wypisać zawartość zwróconej tablicy.
 */

int** createMatrix(int n, int i);
void createNewMatrix(int*** tab, int n, int i);

int main(int argc, char *argv[]) {

	int m;
	int k;
	int n;
	int i;

	printf("Jak dużą tablicę utworzyć? ");
	scanf("%d", &n);
	printf("Podaj jakimi liczbami wypełnić obie tablice: ");
	scanf("%d", &i);
	printf("\n");

	int **tab;
	tab=createMatrix(n,i);

	for(m=0;m<n;m++) {
		for(k=0;k<n;k++) printf("%d  ",tab[m][k]);
		printf("\n");
	}

	printf("\n");

	int **tab2;
	createNewMatrix(&tab2,n,i);

	for(m=0;m<n;m++) {
		for(k=0;k<n;k++) printf("%d  ",tab2[m][k]);
		printf("\n");
	}

	return 0;

}

int** createMatrix(int n, int i) {

	int m;
	int k;

	int **tab = (int**)malloc(n*sizeof(int*));

	for(m=0;m<n;m++) tab[m]=(int*)malloc(n*sizeof(int));

	for(m=0;m<n;m++) {
		for(k=0;k<n;k++) tab[m][k]=i;
	}

	return tab;	

}

void createNewMatrix(int*** tab, int n, int i) {

	int m;
	int k;

	*tab=(int**)malloc(n*sizeof(int*));

	for(m=0;m<n;m++) {
		(*tab)[m]=(int*)malloc(n*sizeof(int));
	}

	for(m=0;m<n;m++) {
		for(k=0;k<n;k++) (*tab)[m][k]=i;
	}

}

druga funkcja przyjmuje wskaznik do tablicy dwuwymiarowej jako argument, ale czy daloby sie to zrobic, aby ta funkcja przyjmowala po prostu tablice dwuwymiarowa?

Jaki sens przysylac wskaznik do tablicy, nie mozna po prostu tablicy?

0

Jeśli chodzi Ci o kopię tablicy, to oczywiście dałoby radę, ale kopiowanie tablicy ma pewne wady:

  • o wiele dłużej by to trwało w przypadku dużych tablic
  • jej kopia zmodyfikowana w Twojej funkcji nie byłaby zmodyfikowana "na zewnątrz"

a przekazanie wskaźnika załatwia te problemy ;)

0

zgadza się, ale mi chodzi bardziej, czy w wywolaniu tej drugiej funkcji musza byc "3 gwiazdki" ?

zamiast void createNewMatrix(int*** tab, int n, int i)

void createNewMatrix(int** tab, int n, int i)

i teraz: createNewMatrix(tab, n, i)

teraz tez przekazuje adres tablicy...

mozna w ten sposob to zrobic?

0

Albo musisz tam mieć:

void createNewMatrix(int*** tab, int n, int i)

i wywoływać

createNewMatrix(&tab, n, i)

Albo mieć

void createNewMatrix(int**& tab, int n, int i)

i możesz wywoływać

createNewMatrix(tab, n, i)

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