Problema confronto DATE

di il
9 risposte

Problema confronto DATE

Buonasera,

ho implementato la seguente funzione che mi permette di estratte da una data di tipo string nel seguente formato : “gg/mm/aaaa” i relativi valori numerici di gg,mm ed aaaa i quali poi vado a confrontare per effettuare un confronto tra due date.

int differenza_DateChar(char *data_1, char *data_2) {

    char data_Temp1[11], data_Temp2[11];

    strcpy(data_Temp1, data_1);
    strcpy(data_Temp2, data_2);
    
    int data_1Convertita[3], data_2Convertita[3]; // due vettori da 3 elementi : gg,mm,aaaa

    char *tok_1 = strtok(data_Temp1, "/");
    
	int i = 0;
    
    for (i = 0; i < 3; i++) {
        data_1Convertita[i] = atoi(tok_1);
        tok_1 = strtok(NULL, "/");
    }

    char *tok_2 = strtok(data_Temp2, "/");
    
    for (i = 0; i < 3; i++) {
        data_2Convertita[i] = atoi(tok_2);
        tok_2 = strtok(NULL, "/");
    }
	
    return differenza_Date(data_1Convertita[0], data_1Convertita[1], data_1Convertita[2], data_2Convertita[0],
                          data_2Convertita[1], data_2Convertita[2]);
}

Il problema è che se inserisco, ad esempio, le seguenti date : 

22/7/2023 e 24/6/2025

nel momento in cui vado a controllare il valore, ad esempio, nella posizione 0 di data_1Convertita[0] non ottengo 22 ma un numero casuale. Stessa cosa vale per l estrazione di mm ed aaaa delle due date.

Formalmente penso di aver scritto bene, sapete darmi un suggerimento di qualche rettifica da fare?

Grazie mille

9 Risposte

  • Re: Problema confronto DATE

    Se aggiungi una printf di tok_1 nel ciclo, cosa visualizzi?

    P.S. perché hai postato 3 volte lo stesso thread??

  • Re: Problema confronto DATE

    Visualizzo quello che desidero, ovvero il giorno di tipo char. Quando uso atoi invece mi riporta un numero diverso con diverse cifre decimali.

    Ad esempio con questa data : 1/1/2023 ottengo i seguenti numeri che dovrebbero rappresentare il gg, mm e aaaa, ovvero : 

    11402240 11402244 1140248

    Da notare che è come se mi sommasse ogni volta 4.

  • Re: Problema confronto DATE

    Non hai mostrato la funzione differenza_Date e neanche il main.

    Quei valori che hai mostrato sono indirizzi di memoria e vanno di 4 in 4 perché puntatori a valori a 32 bit. Quindi visualizzi l'indirizzo della variabile e non il suo contenuto.

    Ma non sappiamo come hai visualizzato quei valori perchè manca il codice che ti ho indicato prima. 

  • Re: Problema confronto DATE

    Hai già due puntatori data_1 e data_2 pronti all'uso: perché non provi a risolvere la conversione direttamente usando i while?

  • Re: Problema confronto DATE

    22/12/2022 - oregon ha scritto:


    Se aggiungi una printf di tok_1 nel ciclo, cosa visualizzi?

    P.S. perché hai postato 3 volte lo stesso thread??

    Se faccio una printf ti tok_1 visualizzo il numero che desidero e non il suo indirizzo di memoria.

    22/12/2022 - Weierstrass ha scritto:


    Hai già due puntatori data_1 e data_2 pronti all'uso: perché non provi a risolvere la conversione direttamente usando i while?

    mi sembrava piu leggibile con il for, ma non credo si risolva mettendo un while, il problema è quello che dice oregon sicuramente.

    Ps. Ho messo diversi thred perchè riferito a problemi diversi, prossima volta ne faccio uno unico, scusatemi.

    Infatti se scrivo questo:

    int gg = 0;
    	
        char *tok_1 = strtok(data_Temp1, "/");
        gg = atoi(tok_1);
        
        printf("Giorno : %d", gg);
        pausa();

    ovvero se estraggo solo la prima parte della stringa e stampo gg (e non &gg) ottengo quello che desidero. Vorrei capire come sistemare il codice al fine di salvare il contenuto corretto.

  • Re: Problema confronto DATE

    Tu non leggi le risposte che ti vengono date.

    Ci vuoi dire come visualizzi i valori sbagliati? Ci mostri il codice che manca?

  • Re: Problema confronto DATE

    Intendevo che fai un sacco di operazioni inutili, potevi fare semplicemente qualcosa del genere:

    int differenza_DateChar(char *data_1, char *data_2) {
        int i, data_1Convertita[3] = {0}, data_2Convertita[3] = {0};
        
        for(i = 0; i < 3 && *data_1; data_1++)
            if(*data_1 >= '0' && *data_1 <= '9'){
                data_1Convertita[i] *= 10;
                data_1Convertita[i] += *data_1 - '0';            
            }
            else
                i++;
                
        for(i = 0; i < 3 && *data_2; data_2++)
            if(*data_2 >= '0' && *data_2 <= '9'){
                data_2Convertita[i] *= 10;
                data_2Convertita[i] += *data_2 - '0';            
            }
            else
                i++;
    
        for(i = 2; i >= 0; i--)            
            if(data_1Convertita[i] > data_2Convertita[i])
                return  1;
            else if(data_1Convertita[i] < data_2Convertita[i])
                return -1;
    
        return 0;   
    }
  • Re: Problema confronto DATE

    Allora la funzione in questione è chiamata nella seguente parte di programma :

    curr_S = *testa_S;
           	
           	if (*testa_S == NULL) {
    		nuovo_Nodo -> id = 0;           
    		} else { //filE NON VUOTO : controllare ID		
            nuovo_Nodo -> id = ultimoID +1;
        	}
                
    	
    	/* SALVATAGGIO nuove SPETTACOLO nel file ed in lista */  
    	if(curr_S == NULL){ // lista vuota 
    		*testa_S = nuovo_Nodo;
    		// curr_S = *testa_S;
    	} else {	
    		
    		// Variabili appoggio per confronto di ORE e DATE per salvare gli spettacoli in ordine
    		int d = 1;
    		int q = 0;
    		
    		// Confronto con primo elemento della lista
    		d = differenza_DateChar(nuovo_Nodo -> data, curr_S -> data);
    		// q = differenza_OreChar(nuovo_Nodo -> ora, curr_S -> ora);
    		
    		printf("d = %d",&d);
    		pausa();
    		
    		while(curr_S != NULL && d!= 1) {
    		
    			d = differenza_DateChar(nuovo_Nodo -> data, curr_S -> data);
    			q = differenza_OreChar(nuovo_Nodo -> ora, curr_S -> ora);
    		
    			prec_S = curr_S;
    			curr_S = curr_S -> next_Spettacolo;
    		}     

     Invece la funzione differenza_Date (effettua un confronto tra due date passate per riferimento):

    int differenza_Date(int giorno_1, int mese_1, int anno_1, int giorno_2, int mese_2, int anno_2) {
    
        int differenza = 0;
    
        if (anno_1 < anno_2 || (anno_1 == anno_2 && mese_1 < mese_2) || (anno_1 == anno_2 && mese_1 == mese_2 && giorno_1 < giorno_2)) {
            differenza = 1;
        } else if (anno_1 != anno_2 || mese_1 != mese_2 || giorno_1 != giorno_2) {
            differenza = -1;
        }
    
        return differenza;
    }

     Il problema però sorge sin da subito nella prima conversione da char (data in formato stringa) ad int (vettore 3 posti contenente gg,mm e aaaa)

  • Re: Problema confronto DATE

    Ecco… ci spieghi perché qui

    printf("d = %d",&d);

    visualizzi l'indirizzo di d? 

Devi accedere o registrarti per scrivere nel forum
9 risposte