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 - do-while

#661
¡Buenas!

¿Has probado a inicalizar la variable sumatoria a cero antes de entrar en el for?

¡Saludos!
#662
Cita de: wolfbcn en 21 Julio 2012, 14:04 PM
El PP pide responsabilidades

El principal partido de la oposición criticó ayer los hechos y preguntó quién pagará esta multa y cuántos pagos pendientes podrían realizarse con esta cantidad.

¿Despues de hundir la comunidad valenciana, aun tienen los santos coj**es de pedir responsabilidades?

Cita de: wolfbcn en 21 Julio 2012, 14:04 PM
Caso paradójico

No deja de ser sorprendente que un ejecutivo que ha apoyado la Ley Sinde-Wert contra la piratería sea responsable del pirateo de programas informáticos con el objetivo de ahorrar unos cuantos miles de euros. No hay que olvidar que hay otros gobiernos socialistas que han decidido utilizar software libre para prescindir del software de pago de Microsoft.

Si ya sabemos de que pie cojean estos...

¡Saludos!
#663
Programación C/C++ / Re: Librerias en linux?
19 Julio 2012, 17:29 PM
¡Buenas!

En cplusplus, tienes informacion sobre la libreria estandar de C y C++. Para cualquier duda consultala. Resulta muy util.

¡Saludos!
#664
¡Buenas!

Ya te han dado varias soluciones, voy a intentar darte una explicacion de porque no funcionaba tu codigo.

No se si sabes lo que es la pila de un programa. Es una parte de la memoria en la que se van acumulando datos de llamadas a funciones, alli se ponen, entre otras cosas, los parametros que pasas a las funciones y el valor de retorno. Una vez que se sale de la funcion, se "recupera" la memoria que se ha utilizado, incluida la que utilizan las variables locales, por lo tanto, como ya han dicho en alguno de las respuestas, los valores que contienen se pueden perder. Esto quiere decir que si devuelves un puntero a una variable que se encuentre dentro de una funcion, lo que estas devolviendo, en principio, es un puntero a alguna parte de la pila, que esta modificandose de forma continua. De ahi la "basura" que encuentras.

Tienes varias formas de solucionar el problema (que yo sepa 4 evidentes... ¿Alguien da mas?), dos muy parecidas, una de ellas ya te la han dado.

Puedes asignar memoria a un puntero local, esto no se perdera, ya que estaras devolviendo un valor a una posicion de memoria no de la pila, sino del heap.

Otra opcion es pasar a la funcion una cadena desde la funcion llamadora.

Si en principio no sabes cuanto va a ocupar el vector (porque por ejemplo ese dato lo obtienes dentro de la funcion) tambien puedes pasar en la lista de parametros un puntero a un puntero y actuar como en el primer caso, asignando la memoria de forma dinamica.

Y para terminar, puedes declarar la variable dentro de la propia funcion como static, de esta forma, cuando salgas de la funcion te aseguraras de que mantiene la informacion, pero esta cambiara de una llamada a otra, por lo que despues de cada llamada tendras que guardar o procesar inmediatamente el dato para que en posteriores llamadas no pierdas informacion que te pueda interesar.

¡Saludos!
#665
¡Buenas!

Solo le he echado un vistazo por encima, pero en los if, en lugar de hacer una comparacion estas haciendo una asignacion. Para comparar tienes que usar el doble igual:

if(algo == loquesea)
    ...


¡Saludos!
#666
¡Buenas!

No se que es lo que quieres hacer exactamente (la explicacion no es que haya quedado demasiado clara), pero si lo que quieres es repartir el contenido de un fichero, tendras que utilizar dos ficheros, uno para leer y otro para escribir.

¡Saludos!
#667
Programación C/C++ / Re: Ayuda con cadenas.
17 Julio 2012, 18:18 PM
Si vas a criticar algo, lee lo que se postea primero y luego comentas, ¿ok?

Bien, estaba nervioso porque no entrabas en razon y he utilizado palabras que no deberia. Lo siento. Con este codigo puedes comprobar que no estas en lo cierto:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
   char cadena[] = "    Necesito repasar matematicas basicas";
   char *token,*resto,lector;

   token = strtok(cadena," ");

   printf("token: %s\ncadena + strlen(token) + 1: %s\ncadena + strlen(cadena) + 1: %s\n",
           token, cadena + strlen(token) + 1, cadena + strlen(cadena) + 1);

   while((lector = getchar()) != '\n' && lector != EOF);

   return 0;
}


Por lo menos tomate la molestia de comprobar si lo que dices es cierto o no.

¡Saludos!

PD: Esto si que es un error que he cometido yo. No he comprobado si realmente queda cadena o no despues de la primera llamada a strtok. Vosotros al utilizar strtok de nuevo, podeis saberlo mirando si el puntero devuelto es NULL o no. Aqui va el nuevo codigo y los resultados de los tiempos.


#include <stdio.h>
#include <string.h>
#include <time.h>

#define ITER 134217728

int main ()
{
  char str[] ="Hola como estas ?";
  char str2[] = "Hola como estas ?";
  char * pch;
  char * valor1;
  char * valor2;
  int i,inicio,longitud;

    inicio = time(NULL);

    for(i = 0 ; i < ITER ; i++)
    {
        strcpy(str,str2);

        pch = strtok (str," "); // Empiezo a buscar la 1 coincidencia del espacio en blanco
        while (pch != NULL)
        {
            valor1 = (pch); // Aqui se almacena la 1 palabra de la frase separa por el espacio en blanco
            pch = strtok (NULL, ""); // Aqui ya no le pongo el espacio en blanco porque deseo el resto de la frase completa
            valor2 = (pch); // Almaceno el resto de la frase en la variable
            break; // Interrumpo el bucle pues como dije solo queria obtener la 1 palabra con el espacio como delimitador
        }
    }

    printf("Metodo 1: %d segundos.\n",time(NULL) - inicio);

    inicio = time(NULL);

    for(i = 0 ; i < ITER ; i++)
    {
        strcpy(str,str2);

        longitud = strlen(str);

        pch = strtok(str," ");

        if(pch)
            if(strlen(str) != longitud)
                valor2 = &str[strlen(str) + 1];
    }

    printf("Metodo 2: %d segundos.\n",time(NULL) - inicio);

    inicio = time(NULL);

    for(i = 0 ; i < ITER ; i++)
    {
        strcpy(str,str2);

        pch = strtok(str," ");

        if (pch)
            valor2 = strtok(NULL, "");
    }

    printf("Metodo 3: %d segundos.\n",time(NULL) - inicio);

    return 0;
}


El tiempo del segundo metodo a subido algo...


Metodo 1: 19 segundos.
Metodo 2: 13 segundos.
Metodo 3: 19 segundos.

Process returned 0 (0x0)   execution time : 51.184 s
Press any key to continue.
#668
Programación C/C++ / Re: Ayuda con cadenas.
17 Julio 2012, 13:30 PM
Cita de: BlackZeroX (Astaroth) en 17 Julio 2012, 05:15 AM

   ptr2 = ptr1 ? (char*)(cadena + strlen(ptr1) + 1):


Esto tampoco es correcto. A parte de que User ha dicho que todavia no ha estudiado la aritmetica de punteros, desplazar cadena stlen(ptr1) posiciones no te asegura pasar a la siguiente posicion despues del primer token (¿lees los post anteriores o solo les echas un vistazo por encima y luego posteas sin saber lo que se ha dicho anteriormente?)

Si cadena = "---hu-ha"; la primera llamada a strtok dejara las variables asi:

ptr1 = strtok(cadena,"-");

ptr1 = "hu";
cadena = "---hu'\0'ha"

Asi que cadena + strlen(ptr1) + 1 apuntara otra vez a "hu'\0'ha". En algun post anterior, ya he comentado que tiene que volver a utilizarse la misma cadena que se le ha pasado a strtok. Si miras como ha quedado cadena despues de la primera llamada a strtok veras el porque.

¡Saludos!
#669
Programación C/C++ / Re: Ayuda con cadenas.
17 Julio 2012, 04:38 AM
¡Buenas!

La cuestion es que si un codigo se ejecuta en menos tiempo que otro, significa que el coste (en tiempo) de las operaciones que realiza es menor. Por otra parte hay algo que me extraña y es que luego he hecho la prueba con el codigo de BlackZeroX:

for(i = 0 ; i < ITER ; i++)
{
   strcpy(CADENA, str2);

   ptr1 = strtok((char*)CADENA, ESPACIO);
   if (ptr1)
       ptr2 = strtok(NULL, END);
}


y me sigue saliendo que le cuesta tanto como al tuyo, por lo que resulta que es mas rapido valor2 = &str[strlen(str) + 1];  que ptr2 = strtok(NULL, END);. Y esto es lo que me resulta extraño, ya que con su codigo solamente se hace una llamada a funcion y una asignacion, por lo que la cuestion tiene que ser que strtok es mas lento que realizar todas las operaciones de &str[strlen(str) + 1]... :o

Que me lo expliquen... Si alguien de ingenieria inversa le puede hechar un vistazo a los binarios y aclararnoslo...

¡Saludos!

Acabo de dejar el codigo en el que he incluido el metodo de BlackZeroX por si quereis comprobar los tiempos.

¡Saludos!

Corrigiendo: Acabo de comprobar que si en una primera llamada no encuentra los delimitadores, devuelve la cadena completa, y si en alguna de las siguientes llamadas no encuentra delimitadores, tambien devuelve el resto de la cadena. Al parecer los unicos casos en los que strtok devuelve NULL es si se vuelve a llamar a la funcion cuando no se han encontrado delimitadores o si en algun momento solo quedan delimitadores en la cadena.

Pero si, el else estaba de mas, ya que si falla if(ptr1), es porque ptr1 ya es NULL, por lo que asignaerle NULL en el else es redundante.
#670
Programación C/C++ / Re: Ayuda con cadenas.
17 Julio 2012, 01:57 AM
Cita de: BlackZeroX (Astaroth) en 17 Julio 2012, 01:47 AM
Es mas optimo el que uso @User no da tantos giros innecesarios...

Dulces Lunas!¡.

??????

En lugar de tres asignaciones, una llamada a funcion (que posiblemente acceda mediante un bucle a las posiciones de la cadena para rastrear delimitadores) y una salida forzada de un bucle, estoy realizando una llamada a funcion, un desplazamiento de un puntero (y solo uno), el operador de direccion y una asignacion...

De todas maneras, voy a meter los dos codigos en bucles de 1000 repeticiones (o mas, para que tarde lo suyo) y a ver cual de los dos termina antes... Ahora pongo el codigo que utilizare y los resultados.

MODIFICADO:

El codigo:
#include <stdio.h>
#include <string.h>
#include <time.h>

#define ITER 134217728

int main ()
{
  char str[] ="Hola c";
  char str2[] = "Hola c"; /* para sobreescribir str en cada iteracion */
  char * pch;
  char * valor1;
  char * valor2;
  int i,inicio;

    inicio = time(NULL);

    for(i = 0 ; i < ITER ; i++)
    {
        strcpy(str,str2);

        pch = strtok (str," "); // Empiezo a buscar la 1 coincidencia del espacio en blanco
        while (pch != NULL)
        {
            valor1 = (pch); // Aqui se almacena la 1 palabra de la frase separa por el espacio en blanco
            pch = strtok (NULL, ""); // Aqui ya no le pongo el espacio en blanco porque deseo el resto de la frase completa
            valor2 = (pch); // Almaceno el resto de la frase en la variable
            break; // Interrumpo el bucle pues como dije solo queria obtener la 1 palabra con el espacio como delimitador
        }
    }

    printf("Metodo 1: %d segundos.\n",time(NULL) - inicio);

    inicio = time(NULL);

    for(i = 0 ; i < ITER ; i++)
    {
        strcpy(str,str2);

        pch = strtok(str," ");

        if(pch)
            valor2 = &str[strlen(str) + 1];
    }

    printf("Metodo 2: %d segundos.\n",time(NULL) - inicio);

    inicio = time(NULL);

    for(i = 0 ; i < ITER ; i++)
    {
        strcpy(str,str2);

        pch = strtok(str," ");

        if (pch)
            valor2 = strtok(NULL, "");
    }

    printf("Metodo 3: %d segundos.\n",time(NULL) - inicio);

    return 0;
}


Y los resultados:

Metodo 1: 19 segundos.
Metodo 2: 10 segundos.

Process returned 0 (0x0)   execution time : 29.150 s
Press any key to continue.


Compilado con gcc y ejecutado en un Dual-Core T4300 a 2.1 Ghz

Ejecutandolo varias veces el metodo de User ronda los 18 - 19 segundos y el mio esta entre los 10 y los 11 (en la maquina que he dejado indicada)

¡Saludos!