Leudassdf Posted May 25, 2015 Report Share Posted May 25, 2015 Boas pessoal, Eu fiz uma função para comparar duas datas do tipo char *; No entanto aquilo que eu fiz foi "partir" o array de carateres por "-" para obter o dia,mes e o ano. EX:"05-02-2015" dia=5, mes=2, ano=2015 O principal problema da minha funcao é que tenho que estar sempre a partir as datas, a a fazer atois para converter para inteiro. Isto torna-se um pouco eficiente uma vez que o eu tenho que chamar esta funcao milhares de vezes. Será que alguém me conseguiria orientar de forma a fazer uma funcao mais eficiente? As minhas funções sao estas: typedef STRING char * STRING *Partir_String(char *matricula, int n_campos_max, int *n_campos_lidos, char *separadores) { *n_campos_lidos = 0; STRING *Res = (STRING *)malloc(n_campos_max*sizeof(STRING)); char *pch = strtok(matricula, separadores); int cont = 0; while (pch != NULL) { Res[cont] = (char *)malloc((strlen(pch) + 1)*sizeof(char)); strcpy(Res[cont++], pch); pch = strtok(NULL, separadores); } *n_campos_lidos = cont; return Res; return NULL; } void auxMaiorData(STRING *LINHA,int n) { for (int i = 0; i < n; i++) free(LINHA[i]); free(LINHA); } short MaiorData(char *d1, char *d2) { char data1[12], data2[12]; strcpy(data1, d1); strcpy(data2, d2); unsigned int dia1, dia2, mes1, mes2, ano1, ano2; int ncamposlidosDiaMes = 0; STRING *LINHA = NULL; LINHA = Partir_String(data1, 3, &ncamposlidosDiaMes, "-/\\n"); if (!(ncamposlidosDiaMes == 3)) return-1; dia1 = atoi(LINHA[0]); mes1 = atoi(LINHA[1]); ano1 = atoi(LINHA[2]); auxMaiorData(LINHA,ncamposlidosDiaMes); //faz os frees LINHA = Read_Split_Line_Geral(data2 ,3, &ncamposlidosDiaMes, "-/\\n"); if (!(ncamposlidosDiaMes == 3)) return-1; dia2 = atoi(LINHA[0]); mes2 = atoi(LINHA[1]); ano2 = atoi(LINHA[2]); auxMaiorData(LINHA, ncamposlidosDiaMes); //faz os frees bool condicoesData1MenorData2 = ano1 < ano2 || (ano1 == ano2 && mes1 < mes2) || (ano1 == ano2 && mes1 == mes2&&dia1 < dia2); bool condicoesData1IgualData2 = ano1 == ano2 && mes1 == mes2 && dia1 == dia2; if (condicoesData1IgualData2) return 0; else if (condicoesData1MenorData2) return 2; else return 1; //-1 se houver erro //deve retornar 1 se d1 for a maior //deve retornar 0 se forem iguais //deve retornar 2 d2 for maior que d1 } Peço desculpa pelo codigo não estar identado mas não consigo fazer os Tabs não sei porque. Cumprimentos, Leandro Link to comment Share on other sites More sharing options...
Solution HappyHippyHippo Posted May 25, 2015 Solution Report Share Posted May 25, 2015 (edited) int comp_datas(char* data1, char* data2) { long long ndata1, ndata2; int year, month, day; // if (sscanf(data1, "&d-&d-&d", &year, &month, &day) != 3) if (sscanf(data1, "%d-%d-%d", &year, &month, &day) != 3) return -1; ndata1 = year * 10000 + month * 100 + day; // if (sscanf(data2, "&d-&d-&d", &year, &month, &day) != 3) if (sscanf(data2, "%d-%d-%d", &year, &month, &day) != 3) return -1; ndata2 = year * 10000 + month * 100 + day; return ndata1 - ndata2; } int main() { char** list = {"2015-12-12", "2015-10-10", "2015-11-11"}; int i; qsort(comp_datas, 3, sizeof(char*), comp_datas); for (i = 0; i < 3; ++i) printf("data : %s\n", list[i]); return 0; } edit : corrigido o escape caracter do sscanf Edited May 26, 2015 by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted May 26, 2015 Author Report Share Posted May 26, 2015 Obrigado. Penso apenas que te enganas-te ao colocar "&d-&d-&d" no sscanf.... Gostaria ainda que se possivel me explicasses que fórmula é essa e que valores pode tomar. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted May 26, 2015 Report Share Posted May 26, 2015 Obrigado. Penso apenas que te enganas-te ao colocar "&d-&d-&d" no sscanf.... estavam errados para o meu exemplo mas, como podes ver, já tinha corrigido antes de o dizeres Gostaria ainda que se possivel me explicasses que fórmula é essa e que valores pode tomar. que fórmula ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted May 26, 2015 Author Report Share Posted May 26, 2015 Em 5/26/2015 às 12:12, HappyHippyHippo disse: estavam errados para o meu exemplo mas, como podes ver, já tinha corrigido antes de o dizeres. Não percebi. Nao deveria ser %d-%d-%d? que fórmula ? ndata2 = year * 10000 + month * 100 + day; Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted May 26, 2015 Report Share Posted May 26, 2015 Não percebi. Nao deveria ser %d-%d-%d? sim, já corrigi ndata2 = year * 10000 + month * 100 + day; o que achas que está a fazer ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted May 26, 2015 Author Report Share Posted May 26, 2015 o que achas que está a fazer ? Sinceramente não sei. Nao percebo porqu estamos a multiplicar o ano por 10000 e o mes por 100 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted May 26, 2015 Report Share Posted May 26, 2015 para separar as ordens de grandeza dos anos, meses e dias para que estas não interfiram na avaliação das datas IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted May 26, 2015 Author Report Share Posted May 26, 2015 para separar as ordens de grandeza dos anos, meses e dias para que estas não interfiram na avaliação das datas já percebi. Obrigado Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now