Problema confronto DATE

di Frans_94 il
9 risposte

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

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

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

  • 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.

  • 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. 

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

  • 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.

  • Tu non leggi le risposte che ti vengono date.

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

  • 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;   
    }
  • 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)

  • Ecco… ci spieghi perché qui

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

    visualizzi l'indirizzo di d? 

Devi accedere o registrarti per scrivere nel forum
9 risposte