Inizializzazione di una matrice con puntatori

di il
5 risposte

Inizializzazione di una matrice con puntatori

Salve a tutti,
sto provando a realizzare il Game of Life in C e sto riscontrando alcuni problemi nel realizzare una funzione che inizializzi (in modo random e con valori booleani) una matrice.

#define RIGHE 15
#define COLONNE 15

int matrice[RIGHE][COLONNE];
int *mat=&matrice[0][0];

/*Definizione delle funzioni*/
void inzializza(int *m)
   {   int n;
       int i,j;
        srand(time(NULL));
       for(i=0;i<RIGHE;i++)
        for(j=0;j<COLONNE;j++)
            {   n=rand() %101;
                if (n<=50) *m=0;
                else *m=1;
                m++;
            }}

void main()
{
char c;

/*Inizializzazione (random) dello scenario iniziale */
 printf("Premere invio per iniziare:");
 scanf("%c",&c);
 if(c=='\0') inizializza(*mat);
 else  while(c!='\0')
        {printf("\nInserimento non valido riprovare ");
         fflush(stdin);
         scanf("%c",&c);
          if(c=='\0') inizializza(*mat);
        }
}
Questa è la porzione di codice interessata.
A prescindere dal fatto che non sono certo della correttezza delle istruzioni nella funzione, non capisco perchè durante la compilazione mi esca "undefined reference to 'inizializza'" alla riga in cui chiamo la funzione.
Spero possiate aiutarmi.
Grazie in anticipo.

5 Risposte

  • Re: Inizializzazione di una matrice con puntatori

    A mio avviso c'era nel codice piu' di qualche errore....
    1)L'errore di undefined reference e' relativo al fatto che alla funzione avevi dato il nome di inzializza e non inizializza....
    2)Dichiari un puntatore int* e lo inizializzi correttamente alla prima cella della matrice ma quando effettui la chiamata alla funzione inizializza nel main devi passare sono mat e non *mat in quanto l'operatore unario * e' un operatore di dereferenziazione e consente di accedere al contenuto dell'elemento e tu invece devi passare un indirizzo ad un'area di memoria che e' appunto mat
    3)Cerca di usare maggiore pulizia nel codice, usa le tabulazioni per le indentazioni e le graffe al termine della linea di codice e non all'inizio (ma e' solo un consiglio personale)
    4)Enter (carrige return) e' rappresentato dal carattere \n e non \0 che e' il carattere di terminazione per le stringhe

    Il codice gira e da un rapido sguardo sembra essere ok.... Realizza una funzione di stampa della matrice per il debug del codice....

    #include <stdio.h>
    #include <stdlib.h>
    
    #define RIGHE 15
    #define COLONNE 15
    
    int matrice[RIGHE][COLONNE];
    int *mat=&matrice[0][0];
    
    void inizializza(int*);
    
    /*Definizione delle funzioni*/
    void inizializza(int *m){   
    	int n, i, j;
            srand(time(NULL));
           	
    	for(i=0;i<RIGHE;i++)
           		for(j=0;j<COLONNE;j++){   
    		n=rand() %101;
                    if (n<=50) *m=0;
                    else *m=1;
                    m++;
    		}
    }
    
    void main(){
    
    	char c;
    
    	/*Inizializzazione (random) dello scenario iniziale */
    	printf("Premere invio per iniziare:");
     	scanf("%c",&c);
     	if(c=='\n') inizializza(mat);
     	else 
    		while(c!='\n'){
    			printf("\nInserimento non valido riprovare ");
             		fflush(stdin);
             		scanf("%c",&c);
              		if(c=='\n') inizializza(mat);
            	}
    
    	exit(EXIT_SUCCESS);
    }
    
  • Re: Inizializzazione di una matrice con puntatori

    Grazie mille per le indicazioni!Soprattutto la questione dell'asterisco prima non mi era chiara...
    Non vorrei approfittarmi della disponibilità ma sto riscontrando un altro problema nella randomizzazione della matrice. Ho provato a fare un controllo con le printf per vedere se la matrice inizializzata venisse effettivamente con valori di 1 e 0 ma quando eseguo il codice ottengo una matrice con tutti 0.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define RIGHE 15
    #define COLONNE 15
    
    int matrice[RIGHE][COLONNE];
    int *mat=&matrice[0][0];
    
    
    void inizializza(int* m)
       {   int n;
           srand(time(NULL));
           while(m<(RIGHE*COLONNE))
            {n=rand() %101;
             if (n<=50) *m=1;
             else *m=0;
             m++;
            }
       }
    
    
    
       void main()
    { char c;
    int j,k;
        /*Inizializzazione (random) dello scenario iniziale */
     printf("Premere invio per iniziare:");
     scanf("%c",&c);
     if(c=='\n') inizializza(mat);
     else  while(c!='\n')
            {printf("\nInserimento non valido riprovare ");
             fflush(stdin);
             scanf("%c",&c);
              if(c=='\n') inizializza(mat);
            }
    
     fflush(stdin);
    
    
     for(j=0;j<RIGHE;j++)
     {for(k=0;k<COLONNE;k++)
        {printf("%4d",matrice[j][k]);}
      printf("\n");
                                                    }
    
    }
    
    Non capisco a cosa sia legato quest'altro problema...
  • Re: Inizializzazione di una matrice con puntatori

    Non riesco a capire dove sia il problema.... ho appena compilato il codice di prima e ho aggiunto come hai fatto tu un doppio ciclo for per la stampa degli elementi e vengono casualmente settati a 0 e 1....
    Ti rimetto il codice con la stampa....
    Un altro consiglio che sento di darti e di evitare il flush dello stdin quando non necessario.... nel caso tra la fine del while e il doppio ciclo for per la stampa (nel main), li' quel fflush e' inutile in quanto lo stdin e' inutilizzato e non ti serve pulirlo.... Comunque non e' una cosa importante ai fini del problema che riscontri....

    #include <stdio.h>
    #include <stdlib.h>
    
    #define RIGHE 15
    #define COLONNE 15
    
    int matrice[RIGHE][COLONNE];
    int *mat=&matrice[0][0];
    
    void inizializza(int*);
    
    /*Definizione delle funzioni*/
    void inizializza(int *m){   
    	int n, i, j;
            srand(time(NULL));
           	
    	for(i=0;i<RIGHE;i++)
           		for(j=0;j<COLONNE;j++){   
    		n=rand() %101;
                    if (n<=50) *m=0;
                    else *m=1;
                    m++;
    		}
    }
    
    void main(){
    
    	char c;
    	int i,j = 0;
    
    	/*Inizializzazione (random) dello scenario iniziale */
    	printf("Premere invio per iniziare:");
     	scanf("%c",&c);
     	if(c=='\n') inizializza(mat);
     	else 
    		while(c!='\n'){
    			printf("\nInserimento non valido riprovare ");
             		fflush(stdin);
             		scanf("%c",&c);
              		if(c=='\n') inizializza(mat);
            	}
    
    	for(i=0; i<RIGHE; i++){
    		for(j=0; j<COLONNE; j++){
    			printf("%-4d",matrice[i][j]);
    		}
    	}
    
    	exit(EXIT_SUCCESS);
    }
    
  • Re: Inizializzazione di una matrice con puntatori

    Io continuo ad avere lo stesso problema durante l'esecuzione (ho provato a copiare-incollare esattamente il codice che hai messo tu)
    Metto il link della stampa a video che ottengo quando eseguo:
    Potrebbe essere un problema del compilatore?
  • Re: Inizializzazione di una matrice con puntatori



    Questo il mio risultato... Prova ad inserire una printf per farti stampare i valori di rand() per vedere cosa restituisce....
    Io compilo con gcc sotto linux credo tu utilizzi un ide sotto windows che non conosco...
Devi accedere o registrarti per scrivere nel forum
5 risposte