Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C] Vettori multidimensionali e vettori di puntatori

    Ciao ragazzi, è da un po' che non scrivo!! Torno qui per chiedervi aiuto per provare a capire meglio l'uso dei puntatori; in particolare, non riesco ancora a capire per bene come usare i vettori di puntatori, sostituendoli all'uso dei vettori bidimensionali per esempio.

    Come al solito, stavo provando a fare qualche esercizio dal libro. In breve il succo è questo: restituire il giorno dell'anno esatto a partire da una data.
    Ecco la versione con vettori bidimensionali
    codice:
    #define MONTH_IN_YEAR 12
    // Creiamo un vettore bidimensionale per gestire i casi in cui l'anno è bisestile; 
    //inoltre creiamo 13 colonne per far cadere gli indici dei mesi proprio tra 1 e 12;
    static char daytab[2][MONTH_IN_YEAR+1] = 
    {
    	{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    	{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    
    
    int day_of_year(int year, int month, int day)
    {
    	int i, leap;
            //controlla se l'anno è bisestile; restituisce 1 se è bisestile, 0 altrimenti
    	leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; 
    	
    	for (i = 1; i < month; i++)
    		day += daytab[leap][i];
    		
    	return day;	
    }
    Altro paio di maniche è utilizzare invece i puntatori al posto di indici e vettori, come mi richiede l'esercizio. In particolare, dovrei modificare l'array bidimensionale daytab per farlo diventare un puntatore.

    Ho provato a crearlo in questo modo
    codice:
    static char *daytab[13] = 
    {
    	{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    	{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    ma ottengo parecchi errori nella compilazione, tutti identici, che a quanto ho capito mi dicono che l'inizializzazione non è andata a buon fine.
    codice:
    e5.9.c:9:2: warning: braces around scalar initializer [enabled by default]
    e5.9.c:9:2: warning: (near initialization for ‘daytab’) [enabled by default]
    Qualcuno saprebbe aiutarmi?
    E inoltre, chi mi può linkare del materiale online dove viene spiegato per bene il discorso sui puntatori?
    Grazie mille in anticipo a tutti

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    E' solo un warning, risolvi così:

    codice:
    static char daytab[2][13] =
    {
    	{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    	{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    Ma il programma funziona?

  3. #3
    Quello che mi hai suggerito tu è il primo metodo che ho usato E in questo modo funziona alla perfezione.
    Il mio esercizio però mi dice di sostituire tutti i vettori e gli indici coi puntatori. E' proprio qui che mi blocco, perchè non so come procedere. E se provo a usare il metodo scritto sopra, mi dà una marea di warning, tutti simili (ho riportato solo il primo).

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    C'è una discussione uguale su stack overflow qua:
    http://stackoverflow.com/questions/6...rs-to-pointers

    In pratica dice di fare:

    codice:
    static char *daytab[13];
    daytab[0]=(char[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    daytab[1]=(char[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  5. #5
    Grazie mille per la segnalazione!!
    A quanto pare non sono l'unico pivello alle prese con questi problemi banali

  6. #6
    Ho provato vari metodi, ma alla fine l'unico buono era quello segnalato dall'utente stesso che aveva posto la domanda
    Ecco quindi quello che ho deciso di fare.
    codice:
    char a[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    char b[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static char *daytab[] = {a, b};
    
    int day_of_year(int year, int month, int day)
    {
    	int leap;
    	leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    	
    	daytab[leap]++;
    	
    	while (month > 1)
    	{
    		day += *daytab[leap];
    		daytab[leap]++;
    		month--;
    	}
    	
    	return day;	
    }
    Il programma funziona bene. Mi chiedevo solo se c'è qualche modo per eliminare completamente ogni sorta di vettore. Aspetto vostri lumi

    PS: se avete del materiale online sui puntatori da linkarmi non esitate a scriverlo

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Guarda, se vuoi eliminare i vettori e usare solo i puntatori potresti allocare memoria e inizializzare gli elemento uno per uno.
    E' il metodo più lungo perchè devi stare ad inizializzarli uno per uno:

    codice:
    static char **daytab;
    daytab=(char**)malloc(2*sizeof(char*));
    daytab[0]=(char*)malloc(13*sizeof(char));
    daytab[1]=(char*)malloc(13*sizeof(char));
    E qui viene la parte noiosa:

    codice:
    daytab[0][0]=0;
    daytab[0][1]=31;
    ...
    daytab[1][0]=0;
    ...
    daytab[1][12]=31;
    C'è da dire però che siccome il secondo array è quasi uguale al primo, eccetto il terzo elemento che è 29 invece di 28, potresti fare:
    codice:
    // dopo aver inizializzato il primo array
    for(int i=0;i<13;i++)
        daytab[1][i]=daytab[0][i];
    daytab[1][2]=29;

  8. #8
    Grazie mille per gli spunti, è sempre bello imparare nuove cose dagli esercizi più banali
    A quanto pare, quindi, non è molto pratica come soluzione.
    Mi confermi quindi che non c'è un modo diretto di inizializzare un puntatore di puntatori?

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Non ci avevo pensato, bastava fare un cast:

    codice:
    static char **daytab;
    daytab=(char**)malloc(2*sizeof(char*));
    daytab[0]=(char*)(char[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    daytab[1]=(char*)(char[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    Non si finisce mai di imparare

  10. #10
    Originariamente inviato da ramy89
    Non ci avevo pensato, bastava fare un cast:

    codice:
    static char **daytab;
    daytab=(char**)malloc(2*sizeof(char*));
    daytab[0]=(char*)(char[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    daytab[1]=(char*)(char[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    Non si finisce mai di imparare
    Verissimo!!

    Ho provato ad usare il tuo codice comunque ed ecco il risultato :S
    codice:
    e5.9.c:38:1: warning: data definition has no type or storage class [enabled by default]
    e5.9.c:38:1: error: conflicting types for ‘daytab’
    e5.9.c:37:15: note: previous declaration of ‘daytab’ was here
    e5.9.c:38:8: warning: initialization makes integer from pointer without a cast [enabled by default]
    e5.9.c:38:1: error: initializer element is not constant
    e5.9.c:39:1: warning: data definition has no type or storage class [enabled by default]
    e5.9.c:39:1: error: conflicting types for ‘daytab’
    e5.9.c:38:1: note: previous definition of ‘daytab’ was here
    e5.9.c:39:1: error: invalid initializer
    e5.9.c:40:1: warning: data definition has no type or storage class [enabled by default]
    e5.9.c:40:1: error: conflicting types for ‘daytab’
    e5.9.c:39:1: note: previous definition of ‘daytab’ was here
    e5.9.c:40:1: error: invalid initializer

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.