[c]passare matrice a funzione

frab1
ciao sto scrivendo un programma che dati il numero di giudici N e il numero di concorrenti K, scriva una matrice nella quale trovo i giudizi dati da ogni giudice ad ogni concorrente...tali giudizi devono essere un numero casuale da 0 a 5..
ho 2 dubbi:
-sul passaggio della matrice alla funzione
-come generare un numero da 0 a 5 con la rand

ho scritto il seguente codice:
#include <time.h>
#include <stdio.h>

#define GIUDIZIO 5

void crea_matrice(int *concorso,int N,int K);

int main(void)
{
	srand(time(NULL));	
	int N=0,K=0;
	printf("Inserire il Numero N di giudici presenti in commissione, e il numero K di candidati:\n");
	scanf("%d %d",&N,&K);
	int concorso[N][K];
	crea_matrice(concorso,N,K);
}

void crea_matrice(int *concorso,int N,int K)
{
	int i=0,j=0;
	for(i=0;i<N;i++){
		for(j=0;j<K;j++){
			concorso[i][j]=rand()%GIUDIZIO;
		}
	}		
}

qualcuno riesce a darmi qualche consiglio?
Grazie! :cry:

Risposte
apatriarca
Se devi generare un numero da 0 a 5 devi usare rand() % 6. Non si può passare array di dimensione maggiore a uno ad una funzione (a meno di conoscerne la dimensione durante la compilazione). In generale si usa quindi un array di dimensione uno e si utilizza qualcosa come i*N + j (dove i va da 0 a K-1 e j va da 0 a N-1) per accedere ai singoli valori.

frab1
purtroppo non riesco a capire...significa che devo passargli un vettore? Ma poi come la scrivo la matrice? Non è possibile passarle in puntatore al primo elemento della matrice e le dimensioni che vengono definite come macro con le define?

apatriarca
Se definisci le definizioni con dei define (o usando valori costanti) puoi passargli la matrice. Tutto dipende da quali sono i tuoi obiettivi. A cosa ti serve insomma.. Passare un singolo vettore è comunque meno scomodo di quanto possa sembrare.

frab1
si infatti ho osservato che:
1)se setto le dimensioni con le define tutto è come per i vettori;
2)se invece conosco il numero di colonne posso agire come sopra e lasciare le [] vuote(righe) nel protipo e nella definizione;
3)se invece chiedo le dimensioni all'utente, c'è modo di far si che le dimensioni immesse siano considerabili come delle macro, e che quindi ci si possa comportare come nel caso 1?

nel caso in cui voglia usare il singolo vettore, a grandi linee che codice va scritto?

Grazie Apatriarca :-)

apatriarca
Quando tu utilizzi un array bidimensionale, il compilatore converte l'espressione che scrivi in quella che ti ho scritto sopra. Come vedi solo una delle due dimensioni è necessaria per scrivere tale formula e quella dimensione è quella che il compilatore richiede. Non puoi inserire solo l'altra dimensione. Ma la distinzione tra righe e colonne e semplicemente una convenzione e puoi sempre scambiare i ruoli se ti fa comodo (o semplicemente scambiare righe e colonne nella tua "immagine mentale" della tabella).

frab1
quindi gli passo qualcosa di questo tipo?
void crea_matrice(matrice[N]);

nel caso in cui N e K non siano note?

se invece chiedo le dimensioni all'utente, c'è modo di far si che le dimensioni immesse siano considerabili come delle macro, e che quindi ci si possa comportare come nel caso facile?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.