• Domingo 5 de Mayo de 2024, 03:57

Mostrar Mensajes

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


Mensajes - Epa

Páginas: 1 [2] 3 4 ... 10
26
C/C++ / Re: Teclas especial
« en: Domingo 5 de Diciembre de 2010, 21:05 »
11_8_88:

Por ahi comentas que copiaste el curses.h, pero de donde?
Instalaste la libreria?

cualquier cosa proba poner lo siguiente en la consola:

Citar
sudo aptitude install libncurses5 libncurses5-dev

m0skit0:

su no se refiere al more en si, sino a como esta implementado.

aca dejo un codigo que me robe de por ahi hace un tiempo

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <termio.h>
  5. #include <sys/ioctl.h>
  6.  
  7. #define STDINFD  0
  8. #undef getc
  9.  
  10. char getche(void) {
  11.   char c;
  12.   struct termio param_ant, params;
  13.  
  14.   ioctl(STDINFD,TCGETA,&param_ant);
  15.  
  16.   params = param_ant;
  17.   params.c_lflag &= ~(ICANON|ECHO);
  18.   params.c_cc[4] = 1;
  19.  
  20.   ioctl(STDINFD,TCSETA,&params);
  21.  
  22.   fflush(stdin); fflush(stderr); fflush(stdout);
  23.   read(STDINFD,&c,1);
  24.  
  25.   ioctl(STDINFD,TCSETA,&param_ant);
  26.   return c;
  27. }
  28.  
  29.  

Saludos

27
Visual C++ / Re: Error: el puntero toma el valor 0xffffffff de la anda
« en: Sábado 27 de Noviembre de 2010, 17:19 »
jaja, este es uno de esos momentos en que uno se siente el mas b****o del mundo.

Cita de: "m0skit0"
-1 = 0xFFFFFFFF

se me escapo un heaprealloc y dNames y dIds apuntaban al mismo lugar -.-

Gracias por la ayuda  :good:  :good:

y yo que le echaba la culpa a M$  :ph34r:

28
Visual C++ / Re: Error: el puntero toma el valor 0xffffffff de la anda
« en: Sábado 27 de Noviembre de 2010, 16:48 »
Cita de: "Eternal Idol"
Para probarlo sin el codigo completo es muy dificil pero nadie mejor que vos podra depurarlo y ver cual es relmente el problema.

Seguro, pero el problema es que depurandolo instruccion a instruccion, el puntero cambia el valor solo de la nada, yo supongo que es la magia de microsoft, pero no encuentro forma de solucionarlo. La verdad que no dan muchas ganas de tener que reescribir 400 lineas para cambiar la logica.

Algo que me olvide de comentar, que quizas puede tener que ver, es que el modulo tiene su propia heap, creada con HeapCreate y todas las reservas de memoria se hacen con HeapAlloc, puede que eso tenga algo que ver?

Cita de: "m0skit0"
-1 = 0xFFFFFFFF

Los punteros no tienen signo que yo sepa.

Gracias por las respuestas

Saludos


Editoo

Cita de: "m0skit0"
-1 = 0xFFFFFFFF

No habia entendido la idea, ahora reviso si se me escapa el puntero en algun lado.

Gracias

29
Visual C++ / Error: el puntero toma el valor 0xffffffff de la anda
« en: Sábado 27 de Noviembre de 2010, 03:03 »
buenas, tengo un problema algo urgente.
haber si alguien me puede dar una mano, porque la verdad no tengo idea que es lo que pasa.

la cosa es que tengo una estructura

Código: C
  1. struct s{
  2.   char *name;
  3.   int id;
  4.   int c;
  5.   char **dNames;
  6.   int *dIds;
  7. }
  8.  

y creo un vector dinamico con esa estrucura, y lo completo a partir de un archivo xml.

los campos dNames y dIds con vectores dinamicos de los name e ids de otros elementos del mimso vector. y c es la cantidad de elementos de estos.

al cargar los datos solo cargo los campos id, name y dNames.
y la idea es completar el vector de enteros segun el id del name que le corresponde segun la posicion en el vector.

un caso concreto que estoy porbando es el siguiente:

hay 4 elementos en el vector con los siguientes valores
1
name = "name1"
id = 0
dNames = NULL
c = 0

2
name = "name2"
id = 1
dNames = {"name1"}
c = 1

3
name = "name3"
id = 2
dNames = {"name1"}
c = 1

4
name = "name4"
id = 3
dNames = {"name2", "name3"}
c = 2

y la idea es completar los dIds con los siguientes valores:

1
dIds = NULL
2
dIds = {0}
3
dIds = {0}
4
dIds = { 1, 2}

para lo que estoy usando el siguiente algoritmo:

Código: C++
  1.  
  2. for(int i = 0; i < _tc; i++)
  3. {
  4.    for(int j = 0; j < tasks[i].c; j++)
  5.    {
  6.       tasks[i].dIds[j] = -1;
  7.       for(int k = 0; (k < _tc) && (tasks[i].dIds[j] == -1); k++)
  8.       {
  9.          if(!strcmp(tasks[i].dNames[j], tasks[k].id))
  10.             tasks[i].dIds[j] = tasks[k].id;
  11.       }
  12.    }
  13. }
  14.  
  15.  
_tc es el tamaño del vector, 4 en este caso


El problema surge cuando i toma el valor 3, o sea el cuarto elemento al hacer el strcmp sale un error de una dll de ms.
Y al debugearlo me sale que el valor de tasks[3].dNames[0] es 0xffffffff

Lo mas extraño es que antes de entrar en los bucles imprimo tasks[3].dNames[0] y me sale "name2" que es lo que corresponde.

Alguien tiene una idea de que es lo que esta pasando?

Agradeceria cualquier aporte por minimo que sea.

Y si alguien quere perder 5 minutos para probar si le pasa lo mismo estaria eternamente agradecido.

Saludos

30
C/C++ / Re: funcion recursiva
« en: Miércoles 24 de Noviembre de 2010, 18:03 »
la cosa es algo asi :P

Código: C
  1. int funcion()
  2. {
  3. char c;
  4.  
  5. c = getche();
  6.  
  7. if(c == '.')
  8.  return 0;
  9. funcion();
  10. printf("%c", c);
  11. return 0;
  12. }
  13.  

Citar
Personalmente, no usaría conio.h, pero eso ya es decisión de cada uno.

Totalmente de acuerdo, sin embargo, hacerlo sin esa funcion seria bastante tedioso, ya que habria que leer desde el buffer de stdio. Ya que (que yo sepa) no hay ninguna funcion standard que lea el caracter antes de que se apriente enter.

31
C/C++ / Re: como optimizar el método burbuja
« en: Miércoles 24 de Noviembre de 2010, 17:52 »
si buscas en google seguro sale.

Una forma es agregar ua flag, por ejemplo
int modificado = 0;

a la condicion del for de mas afuera le agregas esa flag, y al principio de cada bucle la seteas en 0
despues, en la parte donde intercambias valores, la seteas en 1

Eso hace que si en el ultimo recorrido no se hizo ningun intercambio se salga del bucle, ya que si no se hiso ningun intercambio el vector ya esta ordenado.

Saludos

32
C/C++ / Re: [DUDA] Variable en open() de ofstream;
« en: Miércoles 24 de Noviembre de 2010, 17:50 »
Buenas.

En C++ un literal cadena ( "algo entre comillas dobles") devuelve un puntero
por lo que al hacer estas haciendo una suma de puntero, algo que no esta permitido y en caso de que lo estubiese, el resultado no seria el que eesperas.

"archivos/" + tituloScript + ".txt"

si existe una sobrecarga de open que hacepte una obejto string, podrias ahcer:

string path("archivos/");

path += tituloScript;

path += ".txt";

miScript.open(path);

sino tendrias que crear un vector de char y meter el path completo, y pasarle ese paramtero a open:

char path[50] = "archivos/";

strcat(path, tituloScript);

strcat(path, ".txt");

miScript.open(path);

Saludos

33
C/C++ / Re: funcion recursiva
« en: Miércoles 24 de Noviembre de 2010, 17:38 »
Buenas.

Si no me equivoco la funcion getche() es de conio. Y no lee del buffer de entrada sino del teclado.

La idea es hace una funcion que capture un caracter con getche(), si este es '.' entonces retorna, sino se llama a si misma, imprime el caracter y retorna.

De esa forma cuando se ingrese el . se va a ir saliendo de las funciones e imprimiendo los caracteres en el orden inverso al que se ingresaron.

En el main simplemente tendrias que llamar a esa funcion.

Eso es lo que entendi por lo menos, espero que sirva.

Saludos

34
C/C++ / Re: Problema parseo cadena de caracteres
« en: Miércoles 24 de Noviembre de 2010, 17:33 »
Buenas

proba cambiar el bucle por esto:


Código: C
  1. while(fgets(linea, 255, f) != NULL)
  2. {
  3. ptr = strtok( linea, s2 );
  4.  
  5. printf( "%sn", ptr );
  6.  
  7. while( (ptr = strtok( NULL, s2 )) != NULL )
  8. printf( "%sn", ptr );
  9. }
  10.  
Saludos

35
C/C++ / Re: ¿Parar ejecución o capturar el error?
« en: Viernes 19 de Noviembre de 2010, 17:45 »
Coincido con m0skit0.

A mi parecer una libreria nunca deberia abortar.

Lo ideal es usar un gestor de errores.

Si el programador no controla los errores, entonces es problema de el, no de la libreria.

Saludos

36
C/C++ / Re: hexadecimal en con 0x
« en: Viernes 12 de Noviembre de 2010, 21:19 »
Buenas.

En otro dia me pegue una mirada al foro, pero sin tiempo de responder.
Y aunque moskito ya te dio una solucion, te dejo otra por si sirve.

Lo pongo directamente con un ejemplo para que se entienda.

Código: C++
  1.  
  2. #define LEN 6
  3.  
  4. int i;
  5. char hexw[13] = "FF07A33700B9";
  6. unsigned int h;
  7. unsigned char hexn[LEN];
  8.  
  9. for(i = 0; i < LEN; i++)
  10. {
  11.     sscanf((hexw + 2*i), "%2X", &h);
  12.     hexn[i] = h;
  13. }
  14.  
  15.  

Saludos

37
C/C++ / Re: Duda con argumento en una funcion
« en: Lunes 8 de Noviembre de 2010, 03:21 »
Buenas.

Quizas el ejemplo del char no es el mejor.

La idea de eso es pasar un puntero por referencia.

Imaginate que tenes dos funciones como:
1- <tipo> funcion1(tipo_estructura &inst);
2- <tipo> funcion2(tipo_estructura* &inst);

en el primer caso, la variable inst va a ser de tipo tipo_estructura.
y a partir de esa variable vas a poder modificar los datos del objeto que pasaste como parametro. pero inst siempre va a apuntar a la misma direcciond ememoria.

en cambio con la segunda, la variable inst es un puntero a tipo tipo_estructura.
por lo que vas a poder modificar la direcion a donde apunta y los datos de esa direccion.

una utilidad de eso seria por ejemplo una funcion que pueda requerir realocar memoria.
el realloc, recibe como parametro el puntero original, pero segun la distribucion de memoria reservada en el heap puede que no devuelva el mismo puntero. entonces si no se le pasa el puntero no habria forma de ver reflejado ese cambio en la variable que se paso como argumento por lo que ser tendria una referencia invalidad y se perderian los datos.

espero que se entienda un poco mas la idea

saludos

38
C/C++ / Re: Ruego su apollo con este codigo
« en: Viernes 5 de Noviembre de 2010, 06:51 »
Buenas, si tenes un unico token de letras, podes hacer lo siguiente:


Código: C
  1.  
  2. switch(z){
  3.   case '(':
  4.     token=parA;
  5.     break;
  6.   case ',':
  7.     token=coma;
  8.     break;
  9.   case ')':
  10.     token=parC;
  11.     break;
  12.   default:
  13.     if(('a' <= z) && (z <= 'z')
  14.       token=letra;
  15.     break;
  16. };
  17.  
  18.  

Saludos

39
C/C++ / Re: Duda con argumento en una funcion
« en: Viernes 5 de Noviembre de 2010, 06:36 »
Buenas.

En ese caso se esta pasando el puntero por referencia.
O sea que si modificas el puntero dentro de esa funcion el cambio se va a ver reflejado en la variable que le pasaste.

Te dejo un codigo para que lo pruebes, asi se entiende mejor.

Código: C++
  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. void funcion1(char* &car)
  7. {
  8.    car++;
  9. }
  10.  
  11. void funcion2(char* car)
  12. {
  13.    car++;
  14. }
  15.  
  16. int main()
  17. {
  18.    char cadena[] = "ab", *c;
  19.  
  20.    c = cadena; //c apunta a cadena[0] o sea *c == 'a';
  21.    cout << *c << endl;
  22.    funcion1(c);
  23.    cout << *c << endl;
  24.  
  25.    c = cadena; //c apunta a cadena[0] o sea *c == 'a';
  26.    cout << *c << endl;
  27.    funcion2(c);
  28.    cout << *c << endl;
  29.  
  30.    return 0;
  31. }
  32.  
  33.  

Saludos

40
C/C++ / Re: problema con servidor chat en c y sockets
« en: Viernes 5 de Noviembre de 2010, 04:51 »
Buenas.

Para empesar, trata de usar etiquetas de codigo, asi es mas facil leer. En la lista deplegable que dice "Code" elegi "C" y pone el codigo entre las etiquetas que se agregan.

Hay varios errores en el codigo.

las 3 variables que usar como buffers: nickname, msg e in, las declaras como char*, pero en ningun momento reservas memorias para guardar datos.
Tendrias que hacer un malloc para cada una, odeclararla como vectores: nickname[20], msg[50], in[50] por ejemplo.

scanf("%s",&nickname);

al darle el formato "%s" a la cadena, la funcion espera un char*, pero le estas pasando un char**. el compilador te tendria que dar un warning en esa linea.
lo correcto es: scanf("%s",nickname);

el tercer parametro de las funciones write y read e la longitud del buffer. En el caso de read, el tamaño maximo, y en el caso de write la cantidad de datos a mandar.
por ejemplo

char buff[40];
read(fdSock, buff, 40);

write(fdSock, "holan", 5);

en cuanto a la funcion, deberias hacer algo como:

Código: C
  1.  
  2. void *writetoserver(void *arg)
  3. {
  4.   char msg[50];
  5.  
  6.   do
  7.   {
  8.     memset((char*)msg, '', 50);
  9.     printf("Escribe tu mensaje");
  10.     fgets(msg, 49, stdin);
  11.     write(sockfd, msg, strlen(msg) + 1);
  12.   }while(strcmp(msg,"exit")!= 0)
  13. }
  14.  
  15.  

y algo similar para el read.

ademas fijate que estar creando dos veces el mismo hilo. y te falta el #include <pthread.h>


igualmente, si estas escribiendo un mensaje y llega un mensaje del server, se van a mesclar en la pantalla.

Saludos

41
C/C++ / Re: Que significa esto?...
« en: Domingo 24 de Octubre de 2010, 08:43 »
buenas

como supongo que sabras, en una sentencia de control if() se evalua la expresion entre parenesis, si el resultado de la expresion es distinta de 0 se ejecuta la sentencia (simple o compuesta) que esta a continuacion, y si es 0, se salta al final de esa.

el operador ! es el operador de negacion (NOT)
si el operando es distinto de 0 entonces ! devuelve 0, y en caso de ser 0 devuelve algo distinto de 0

hacer (!vol) es equivalente a hacer (vol == 0)

o sea que
if(!vol) vol = 50;
seria, si vol es 0 entonces vol = 50.

como el programa comprueba la cantidad de parametros, esa sentencia supongo que esta por si se pasa un valor no numerico como segundo parametro.

saludos

42
C/C++ / Re: Problema - Ejercicio en C
« en: Domingo 24 de Octubre de 2010, 08:29 »
Buenas.

Fijate que te dicen que en cada bucle i empieza en 2, y al comienzo de cada bucle le estas asignando el valor 0.
no es necesario tener dos variables: n1 y suma, con una alcanza. pero tendrias que hacer suma = suma + i, ya que lo que necesitas es una sumatoria, y no el elemento de una serie.
al usar suma como acumulador tendrias que asignalre 0 antes de cada bucle, para que no te sume el resultado de la ultima sumatoria.

proba hacer esas modificaciones, haber si entendes el algoritmo.
calquier cosa podes hacer una tabla para los valores de j,i y suma para controlar.

saludos

43
C/C++ / Re: La variable local no se destruye?
« en: Martes 19 de Octubre de 2010, 22:27 »
jaja, me imagine la memoria explotando al destruirse la variable :P

la cosa es que generalmente se le llama destruir una variable a que la memoria(registro o lo que sea) en la que esta guardada deja de estar reservada en el bloque en donde fue definida. Pero eso no implica que se pierdan los valores, mientras que no vuelvas a usar esa memoria (y le escribas algo) ese valor se va a mantener hasta que se apague la pc.

para que se entienda mejor te dejo un ejemplo:
compilalo y mira que es lo que pasa  :ph34r:
Código: C++
  1.  
  2. #include <stdio.h>
  3.  
  4. int* funcion1();
  5. void funcion2();
  6.  
  7. int main()
  8. {
  9.  
  10.   int* p;
  11.  
  12.   p = funcion1();
  13.  
  14.   printf("%dn", *p);
  15.  
  16.   funcion2();
  17.  
  18.   printf("%dn", *p);
  19.  
  20.   return 0;
  21. }
  22.  
  23. int* funcion1()
  24. {
  25.  int a = 7;
  26.  return &a;
  27. }
  28.  
  29. void funcion2()
  30. {
  31.  int a = 1234;
  32. }
  33.  
  34.  

Seguramente te tire un warning en return &a; de funcion1, y la verdad que es algo bastante feo :P pero a modo ilustrativo viene bien

Saludos

Edito:

Ni mire el ejemplo de eternal idol, pero segun lei en lo que escribio mientras yo posteaba tiene el mismo comportamiento que el codigo que deje  :brickwall:

44
C/C++ / Re: Cerrar y reabrir un socket
« en: Lunes 18 de Octubre de 2010, 14:27 »
Es genial, esos de micro$oft te dan una solucion con un nuevo problema.

La verdad que no se una solucionar el bloqueo, pero podrias crear un hilo para llamar a la funcion, cosa que se bloquee ese hilo y el programa siga corriendo.

No creo que sea lo ideal, pero puede que funcione.

Saludos

45
C/C++ / Re: Duda, Existe? programacion hibrida en visual c++
« en: Lunes 18 de Octubre de 2010, 14:21 »
Buenas.

Lo tenes que hacer en C++ o C#?

ne tengo mucha idea de apis graficas de windows, pero no me suena que funcione en c++.
las variables int en c++ no son aobjetos, por lo que no tienen metodos.

a.ToString();

eso deberia tirar error.

Ademas mov en assembler es para copiar valores, para sumar es add.

Si lo tenes que hacer en c++ quizas seria mejor que lo hagas para consola.

Saludos

46
C/C++ / Re: como organizar el code en Dev-Cpp
« en: Viernes 8 de Octubre de 2010, 16:10 »
Buenas, cuando uno dice definir una clase, no se refiere a la clase en si, sino a los metodos de la clase.

Cuando uno declara una clase, suele poner solo los prototipos de los metodos (a menos que quiera funciones inline, eso en el tutorial de conclase esta explicado), y despues las define en otro lado, aunque no es necesario que sea en un fichero aparte, es recomendable para que sea mas facil de leer.
La idea es la misma que cuando se hace un programa estructurado:

1-declaracion de funciones.
2-funcion main
3-definicion de funciones

Con la diferencia que las declaraciones se hacen dentro de la claseal y nombre de la funcion en la definicion (si se hace fuera de la clase) se le antepone el nombre de la clase seguido del operador de ambito ::

<tipo retorno> <nombreclase>::<nombre metodo>([lista parametros])
{
<cuerpo metodo>
}

te pongo un ejemplo sencillo haber si se entiende.

en el .h pones
Código: C++
  1.  
  2.  
  3. class MiClase
  4. {
  5.   public:
  6.     MiClase(){}; //constructor
  7.     ~MiClase(){}; //destructor
  8.     int leerdato();
  9.     void escribirdato(int d);
  10.     int potencia(unsigned int exponente);
  11.  
  12.   private:
  13.     int dato;
  14. };
  15.  
  16.  

y en el .c
Código: C++
  1.  
  2.  
  3. void MiClase::escribirdato(int d)
  4. {
  5.   dato = d;
  6. }
  7.  
  8. int MiClase::leerdato()
  9. {
  10.   return dato;
  11. }
  12.  
  13. int MiClase::potencia(unsigned int exponente)
  14. {
  15.   int i, n = 1;
  16.  
  17.   for(i = 1; i <= exponente; i++)
  18.     n *= dato;
  19.  
  20.   return n;
  21. }
  22.  
  23.  

Espero que ahora se entienda mejor.

Saludos

47
C/C++ / Re: Programa con GUI
« en: Viernes 8 de Octubre de 2010, 15:04 »
Buenas.

Creo que con threads lo podrias solucionar.

Aca esta bastante bien explicado como se usan. (esta en ingles)
http://www.cs.cf.ac.uk/Dave/C/node29.html#SECTION002940000000000000000

Sino aca tenes una explciacion algo mas vaga en español (mira Hilos)

http://www.chuidiang.com/clinux/procesos/procesoshilos.php

Y quizas tambien te pueda interesar buscar algo sobre semaforos, que sirven para sincronizar.

Saludos

48
C/C++ / Re: COLA CIRCULAR
« en: Martes 28 de Septiembre de 2010, 04:30 »
Buenas.

Usa etiquetas de codigo, la verdad que no dan ganas de leer ese codigo.

Antes de ponerte a hacer lsitas circulares (diria que las colas circulares no exiten, ya que hay habria coneptos que se contradicen), investiga de punteros.
Las listas circulares son estructuras DINAMICAS de datos.

Saludos

49
C/C++ / Re: sockets posix, send y recv devuelven -1
« en: Martes 28 de Septiembre de 2010, 04:06 »
Buenas.

No, nada de eso, mis sockets son normalitos :P

Son bloqueantes, anda todo perfecto, salvo el valor de retorno.
Como dije en el post anterior, me fijo el valor de errno despues del llamado a funcion y este es 0, eso es lo que me resulta mas extraño.

Saludos.

50
C/C++ / Re: Cerrar y reabrir un socket
« en: Martes 28 de Septiembre de 2010, 03:51 »
buenas.

Cuando cerras un socket no se puede volver a abrir en seguida de nuevo, segun dicen por razones de seguridad.

Proba usar esto en lugar del shutdown:

DisconnectEx(this->ID, NULL, TF_REUSE_SOCKET, 0);

Saludos

Páginas: 1 [2] 3 4 ... 10