Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Ghalad

#1
Hola,

Estoy realizando parte de una aplicacion que se encarga de calcular, pasadas 2 fechas completas, el periodo transcurrid en horas.
Estoy utilizando la libreria joda-time, para calcular horas totales, el problema lo tengo cuando en el calculo se debe contemplar el horario laboral de 9 a 18, sabados, domingos y feriados.


El algoritmo que hice primero evalua si las fechas suministradas son del mismo dia, en tal caso se deberia contabilizar las horas que estan dentro de las 9 y las 18, menos la hora de almuerzo.

Si las fechas suministradas difieren (siempre la segunda fecha es posterior) primero suma la diferencia entre la fecha inicial y una fecha del mismo dia pero con horario de 18:00:00, e incrementa 1 dia a esa fecha inicial.
Luego evalua si la fecha inicial es del mismo dia que la final, si no lo es, sumo 8 horas. Si son del mismo dia suma la diferencia entre la fecha final y una fecha del mismo dia pero con horario de 9:00:00.

En teoria deberia funcionar, de hecho la segunda parte funciona bien, el problema esta cuando lasfechas inicial y fin son del mismo dia, y la verdad no quiero seguir agregando condiciones porque es una cagada....

si ayuda en algo pego codigo:

Código (java) [Seleccionar]


private final int ENTRADA = 9;
private final int SALIDA = 18;
private final int ALMUERZO_INICIO = 13;
private final int ALMUERZO_FIN = 14;


private Date fechaInicio;
private Date fechaFin;



public int tiempoRealEnHoras(){
int horas = 0;
GregorianCalendar inicio = new GregorianCalendar();
inicio.setTime(this.fechaInicio);
GregorianCalendar fin = new GregorianCalendar();
fin.setTime(this.fechaFin);

if(this.mismoDia(inicio, fin)){
horas += this.sumarHorasDelDia(inicio, fin);
}else{
horas += this.sumarHoras(this.SALIDA, inicio);
inicio.add(GregorianCalendar.DAY_OF_MONTH, 1);

while(!this.mismoDia(inicio, fin)){
if(this.diaHabil(inicio) && this.diaFeriado(inicio))
horas += 8;
inicio.add(GregorianCalendar.DAY_OF_MONTH, 1);
}

horas += this.sumarHoras(this.ENTRADA, fin);
}
return horas;
}

private int sumarHoras(int hora, GregorianCalendar cal){
int horasParciales = 0;

if(this.diaHabil(cal) && this.diaFeriado(cal)){
Date dt = cal.getTime();
dt.setHours(hora);
dt.setMinutes(0);
dt.setSeconds(0);

if(hora == this.ENTRADA) //calculo de horas finales ( de 9hs a Xhs)
if(cal.get(GregorianCalendar.HOUR_OF_DAY) > this.ENTRADA)
if(cal.get(GregorianCalendar.HOUR_OF_DAY) >= this.ALMUERZO_FIN)
horasParciales += Hours.hoursBetween(new DateTime(dt), new DateTime(cal.getTime())).getHours() - 1;
else
horasParciales += Hours.hoursBetween(new DateTime(dt), new DateTime(cal.getTime())).getHours();
else //calculo de horas iniciales ( de Xhs a 18hs)
if(cal.get(GregorianCalendar.HOUR_OF_DAY) < this.SALIDA)
if(cal.get(GregorianCalendar.HOUR_OF_DAY) <= this.ALMUERZO_INICIO)
horasParciales += Hours.hoursBetween(new DateTime(cal.getTime()), new DateTime(dt)).getHours() - 1;
else
horasParciales += Hours.hoursBetween(new DateTime(cal.getTime()), new DateTime(dt)).getHours();
}
return horasParciales > 8? 8 : horasParciales;
}

private int sumarHorasDelDia(GregorianCalendar inicio, GregorianCalendar fin){
int horasParciales = 0;

if(this.diaHabil(inicio) && this.diaFeriado(inicio)){
if(inicio.get(GregorianCalendar.HOUR_OF_DAY) < this.ENTRADA || inicio.get(GregorianCalendar.HOUR_OF_DAY) > this.SALIDA){
int diferenciaHoras = Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours();
inicio.set(GregorianCalendar.HOUR_OF_DAY, this.ENTRADA);
fin.set(GregorianCalendar.HOUR_OF_DAY, this.ENTRADA + diferenciaHoras);
}

if(inicio.get(GregorianCalendar.HOUR_OF_DAY) <= this.ALMUERZO_INICIO && fin.get(GregorianCalendar.HOUR_OF_DAY) >= this.ALMUERZO_FIN)
horasParciales += Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours() - 1;
else
horasParciales += Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours();
}
return horasParciales > 8? 8 : horasParciales;
}


Se parece mas a codig C que a java pero bueno...me piden eso y tiene que ser muy preciso. Si se les cae alguna idea, bien barbaro jaaja.

Gracias.
#2
Programación General / Problemas con eclipse
5 Noviembre 2010, 19:59 PM
Estoy programando aplicaciones para Android con eclipse y me acabo de dar cuenta que cada vez que ejecuto mi aplicacion, aumenta el consumo de memoria del eclipse, tanto que se pone toda la maquina lenta y necesita usar memoria virtual. Dudo mucho que sea mi aplicacion la que genere este problema porque....es el Hello World de android jajaj asi que si alguno le paso? o sabe como solucionarlo, joya.
#3
Hola estoy haciendo un jueguito con SDL y C++ con el IDE VS2008 y me arme una clase Game que tiene los metodos init(), loopGame() y end(). supuestamente en el main se ejecutan los 3, cuando el loop termina se ejecuta end() y despues de eso el respectivo return del main. Bueno nose que pasa pero cuando apreto ESC o el boton de salir, de mi pantalla de SDL, se cierra la ventana pero el procesos sigue corriendo, a que se puede deber esto??

Si, en el main, pongo exit(1) en vez de return 1, la ejecucion termina joya.

Lh: No hagas doble post, utiliza el botón modificar.

ya lo resolvi, en vez de poner atexit(SDL_Quit); solamente ponia SDL_Quit;
Ahora tengo otra pregunta: cuales son las desventajas de manejar los errores con IFs, osea a cada funcion que quiero usar chekeo el valor que retorna.
#4
Te tengo otra pregunta, mi programa recive de un servidor una estructura compuesta por 4 char* de longitud (los primeros 3) menor a 512 bytes y la 4ta de tamaño variable entre 1 y nose.... 9999999..muchos bytes, depende de la persona que haya cargado la informacion en esa estructura, no importa. Y como ultima transferencia recibe un ".". El hecho es que mi programa hace un recv, un malloc y un strcpy para el 1er, 2do y 3er campo. Para el 4to hago algo asi:

Código (cpp) [Seleccionar]

memset(buffer, 0 ,512);
i = recv(buffer);
buffer[i]='\0';
while(strcmp(buffer, "."))
{
    estructura.m_cuerpo = (char*)realloc(estructura.m_cuerpo,  SIZEOF(CHAR)*STRLEN(BUFFER) +1);
    if(strlen(estructura.m_cuerpo) > 0)strcat(estructura.m_cuerpo, buffer);
    else strcpy(estructura.m_cuerpo, buffer);
    memset(buffer, 0, 512);
    i =recv(buffer);
    buffer[i]='\0';
}


Lo que estoy preguntando es, de que forma puedo hacer ese WHILE para que vaya agrandando la variable hasta que reciba del socket un ".". Y esta mal el tamaño del realloc, lo se jajaj.
Todo esto forma parte de un sistema que estoy haciendo para un trabajo practico, es un servidor de noticias que utiliza el protocolo nntp (un toke simplificado) esos 4 campos serian los campos de un articulo de noticias ID, groupname, head y body. Los primeros 3 basta con 512 bytes (1 lectura de socket) y el body puede llegar a ser mas grande, el tema es como agrando correctamente el body de mi estructura?
#5
Si, el codigo tiene que ser enteramente en C ansi pero me es mas facil para mostrarselo a ustedes en c++.
#6
ahi le reste 1, funciona bien pero esta bien hecho el codigo? no estoy desperdiciando memoria en algun lado?
#7
ahhh yo crei que vos le pasabas cuanto querias agrandar el bloque de memoria, entonces lo correcto seria algo asi:
Código (cpp) [Seleccionar]

char** obtenerLista(int *contador)
{
      int cont = 0;
      char buf[50], **lista = NULL;
     
      for(int i = 0; i < 10; i++)
      {
              printf("Ingresa cadena: ");
              fgets(buf, 50, stdin);
              buf[strlen(buf)-1] = '\0';
             
              if(strlen(buf) > 0){
                  ++cont;
                  lista = (char**)realloc(lista, sizeof(char*)*cont);
                  if(lista == NULL) abort();
                  lista[cont]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
                  if(lista[cont]==NULL) abort();
                  strcpy(lista[cont], buf);
              }
      }
      *contador = cont;
      return lista;
}


De esta forma estaria diciendo que el puntero se agrande sizeof(char*) cada vez que quiero agregar un nuevo string?

Código (cpp) [Seleccionar]

char** obtenerLista(int *contador)
{
       int cont = 0;
       char buf[50], **lista = NULL;
       
       for(int i = 0; i < 10; i++)
       {
               printf("Ingresa cadena: ");
               fgets(buf, 50, stdin);
               buf[strlen(buf)-1] = '\0';
               
               if(strlen(buf) > 0){
                   ++cont;
                   lista = (char**)realloc(lista, sizeof(char*)*cont);
                   if(lista == NULL) abort();
                   lista[cont-1]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
                   if(lista[cont-1]==NULL) abort();
                   strcpy(lista[cont-1], buf);
               }
       }
       *contador = cont;
       return lista;
}

con este codigo me funciones de 10! pero es correcto o e n que la estoy pifiando?
#8
es que no hay que hacer calculos, es sencillo a vos te van a venir en varios strings, nose cuantos y lo que quiero hacer es: si me viene un string, reservo memoria para el puntero al string y reservo memoria para el string en si. Entonces no entiendo cual es el problema.

Código (cpp) [Seleccionar]
  lista = (char**)realloc(lista, sizeof(char*));
se supone que con eso cada vez que lo invoque genero una posicion mas de la lista de punteros


que tengo que hacer para que funcioneeeeeeeeee????? jajajja
#9
claro porque la idea es que, si hay una nue3va cadena a agregar se reserve memoria para un nuevo puntero a string y despues se reserve memoria para ese string. Segun entendi si el puntero no tienen memoria asiganada el realloc funciona como un malloc. Y que decis que lo tengo que inicializar con NULL a lista?
#10
estoy haciendo una prueba y calculo que esta vez hice bien el tema de la lista pero hay algo que me esta fallando en el programa y no me doy cuenta que es, porque al finalizar me salta un mensaje del visual studio preguntando si quiero debuggearlo. A ver que me decin ustedes.
Código (cpp) [Seleccionar]
char** obtenerLista(int *contador)
{
      int cont = 0;
      char buf[50], **lista;
     
      for(int i = 0; i < 10; i++)
      {
              printf("Ingresa cadena: ");
              fgets(buf, 50, stdin);
              buf[strlen(buf)-1] = '\0';
             
              if(strlen(buf) > 0){
                  lista = (char**)realloc(lista, sizeof(char*));
                  lista[cont]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
                  strcpy(lista[cont], buf);
                   ++cont;
              }
      }
      *contador = cont;
      return lista;
}


Código (cpp) [Seleccionar]
int main(){
char **lista;
   int contador;

   lista = obtenerLista(&contador);
   
   for(int i =0; i < contador; i++){
       printf("grupo %d: %s\n", i, lista[i]);
       }
       
       
       
   for(int i=0; i<contador; i++){
           free(lista[i]);
           }
   free(lista);
   
   system("pause");
   return 0;
}