|
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
« 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: 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 #include <stdio.h> #include <unistd.h> #include <termio.h> #include <sys/ioctl.h> #define STDINFD 0 #undef getc char getche(void) { char c; struct termio param_ant, params; ioctl(STDINFD,TCGETA,¶m_ant); params = param_ant; params.c_lflag &= ~(ICANON|ECHO); params.c_cc[4] = 1; ioctl(STDINFD,TCSETA,¶ms); read(STDINFD,&c,1); ioctl(STDINFD,TCSETA,¶m_ant); return c; }
Saludos
27
« 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. -1 = 0xFFFFFFFF se me escapo un heaprealloc y dNames y dIds apuntaban al mismo lugar -.- Gracias por la ayuda y yo que le echaba la culpa a M$
28
« en: Sábado 27 de Noviembre de 2010, 16:48 »
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? -1 = 0xFFFFFFFF Los punteros no tienen signo que yo sepa. Gracias por las respuestas Saludos Editoo -1 = 0xFFFFFFFF No habia entendido la idea, ahora reviso si se me escapa el puntero en algun lado. Gracias
29
« 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 struct s{ char *name; int id; int c; char **dNames; int *dIds; }
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: for(int i = 0; i < _tc; i++) { for(int j = 0; j < tasks[i].c; j++) { tasks[i].dIds[j] = -1; for(int k = 0; (k < _tc) && (tasks[i].dIds[j] == -1); k++) { if(!strcmp(tasks[i].dNames[j], tasks[k].id)) tasks[i].dIds[j] = tasks[k].id; } } }
_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
« en: Miércoles 24 de Noviembre de 2010, 18:03 »
la cosa es algo asi  int funcion() { char c; c = getche(); if(c == '.') return 0; funcion(); return 0; }
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
« 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
« 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
« 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
« en: Miércoles 24 de Noviembre de 2010, 17:33 »
Buenas proba cambiar el bucle por esto: while(fgets(linea , 255, f ) != NULL ) { while( (ptr = strtok( NULL , s2 )) != NULL ) }
Saludos
35
« 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
« 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. #define LEN 6 int i; char hexw[13] = "FF07A33700B9"; unsigned int h; unsigned char hexn[LEN]; for(i = 0; i < LEN; i++) { sscanf((hexw + 2*i), "%2X", &h); hexn[i] = h; }
Saludos
37
« 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
« en: Viernes 5 de Noviembre de 2010, 06:51 »
Buenas, si tenes un unico token de letras, podes hacer lo siguiente: switch(z){ case '(': token=parA; break; case ',': token=coma; break; case ')': token=parC; break; default: if(('a' <= z) && (z <= 'z') token=letra; break; };
Saludos
39
« 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. #include <iostream> using namespace std; void funcion1(char* &car) { car++; } void funcion2(char* car) { car++; } int main() { char cadena[] = "ab", *c; c = cadena; //c apunta a cadena[0] o sea *c == 'a'; cout << *c << endl; funcion1(c); cout << *c << endl; c = cadena; //c apunta a cadena[0] o sea *c == 'a'; cout << *c << endl; funcion2(c); cout << *c << endl; return 0; }
Saludos
40
« 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: void *writetoserver(void *arg) { char msg[50]; do { write (sockfd , msg , strlen(msg ) + 1); }while(strcmp(msg ,"exit")!= 0) }
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
« 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
« 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
« en: Martes 19 de Octubre de 2010, 22:27 »
jaja, me imagine la memoria explotando al destruirse la variable  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 #include <stdio.h> int* funcion1(); void funcion2(); int main() { int* p; p = funcion1(); printf("%dn", *p); funcion2(); printf("%dn", *p); return 0; } int* funcion1() { int a = 7; return &a; } void funcion2() { int a = 1234; }
Seguramente te tire un warning en return &a; de funcion1, y la verdad que es algo bastante feo  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
44
« 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
« 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
« 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 class MiClase { public: MiClase(){}; //constructor ~MiClase(){}; //destructor int leerdato(); void escribirdato(int d); int potencia(unsigned int exponente); private: int dato; };
y en el .c void MiClase::escribirdato(int d) { dato = d; } int MiClase::leerdato() { return dato; } int MiClase::potencia(unsigned int exponente) { int i, n = 1; for(i = 1; i <= exponente; i++) n *= dato; return n; }
Espero que ahora se entienda mejor. Saludos
48
« 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
« en: Martes 28 de Septiembre de 2010, 04:06 »
Buenas. No, nada de eso, mis sockets son normalitos  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
« 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
|
|
|