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 - Xandrete

#191
¡Hola, jef@!

Me encanta tu problema. Es interesante. No difícil, pero sí interesante.

Un consejo, de cara al futuro, utiliza las etiquetas dedicadas a introducir código, [ code=LENGUAJEDEPROGRAMACION ][ /code ], el código será mucho más legible desde el foro. También sería útil decir en qué falla. ¿No compila? ¿El resultado no es correcto? De todas formas, tu forma de explicar el problema ha sido suficientemente clara como para poder ayudar. Asumo que programas en un entorno Linux (por la inclusión de unistd, más que nada :)).

Tu forma de plantearte la solución es la correcta. De todas formas, la concurrencia del programa es "débil", porque el padre ha de esperar mientras el hijo hace faena. Y lo que si que no entiendo es que por lo que dices, tu programa no tiene entrada de datos por parte del usuario, así que no sé por que motivo haces scanf en varios puntos de tu código. Tampoco sé por qué usas dos pipes, si la comunicación es unilateral (el hijo comunica datos al padre, pero no al revés).

Continúo. Si no vas a leer el estado de finalización de un hijo, puedes hacer wait(NULL) (es preferible a declarar una variable que no vas a utilizar). El formato de salida que utilizas tampoco es el que indicas (HIJO: fibonacci % N =%M\n)...

Ahora me voy a cenar. En un rato vengo y me pongo con esto otra vez :)


EI: juntando mensajes.

Ya estoy aquí.

Uno de tus fallo es que no inicializas bien los arrays. Utilizas la función scanf, pero eso es para entrar datos del usuario. Si quieres que la posición x de un array tenga el valor y, haces array[ x ] = y. Además, tan pronto como sepas que no vas a usar un canal CIÉRRALO. ¿Sabes lo que es un abrazo mortal? No, no es un achuchón de estos que hacen que se te salten los ojos. Se le llama abrazo mortal a la situación en que un proceso A espera a que finalice otro proceso B, y el proceso B a su vez espera que finalice A. Evidentemente, de esta manera no acabarán nunca. Bueno, pues si no cierras canales, te expones a que suceda algo así. Es por eso que conviene abrir el menor número de pipes posible (y en este caso, te aseguro que sólo hace falta una, sólo se necesitan 2 cuando se requiere comunicación bilateral).

Por otro lado, le pasas mal el tercer parámetro tanto al write como al read. Ten en cuenta que el tercer parámetro es el número de bytes a escribir/leer. Aunque depende de la máquina, un int suele tener ser de 4 bytes (pero depende del procesador, de la implementación del compilador...). Para asegurarte el tiro y ganar en portabilidad, en vez de utilizar el valor 4 para enteros usa sizeof(int). Sizeof() es un operador que te devuelve el número de bytes que conforman cierto objeto o tipo de dato. Además, para ahorrar llamadas al sistema, puedes escribir en la pipe dos enteros de una tacada haciendo write(fdpipe[1],&tabla[8],2*sizeof(int)). De esta manera, escribes en la pipe tanto el valor de la posición 8 de tabla como de la posición 9.

Y aquí van dos errores más. Tanto en write como en read se utilizan punteros. Tu usas tabla[9] y tabla[10], y esto está mal (tabla[9] es un entero, y tú lo que tienes que hacer es pasarle el puntero a ese entero). La función read/write tratará de desreferenciar lo que le hayas pasado como parámetro, y si le pasas tabla[9] (que por poner algo, digamos que vale 10), intentará escribir/leer en/de la posición 10 de memoria. El segundo error es que no has tenido en cuenta que los índices de los vectores empiezan en el 0 a la hora de intentar pasarle al padre el noveno y décimo números de Fibonacci. Si quieres poner 10 números de Fibonacci en una tabla, el primero estará en la posición 0 y el décimo en la posición 9. Así, si quieres pasarle los números de Fibonacci 9 y 10 tienes que pasarle tabla[8] y tabla[9].

Bueno, te paso el código que he hecho yo para este problema, por si quieres tener algún ejemplo.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

void addTenFib(int* vector, int start) {
int i;
if (start == 0) {
vector[0] = vector[1] = 1;
i = 2;
}
else i = start;
while (i < start + 10) {
vector[i] = vector[i-1] + vector[i - 2];
++i;
}
}

int main () {
int tabla[20];
int fdpipe[2];
int i;
pipe(fdpipe);
if (fork() == 0) {
close(fdpipe[0]);
addTenFib(tabla,0);
for (i = 0; i < 10; ++i)
printf("HIJO: fibonacci %d: %d\n",i+1,tabla[i]);
write(fdpipe[1],tabla,10*sizeof(int));
exit(0);
}
close(fdpipe[1]);
wait(NULL);
read(fdpipe[0],tabla,10*sizeof(int));
close(fdpipe[0]);
addTenFib(tabla,10);
for (i = 10; i < 20; ++i)
printf("PADRE: fibonacci %d: %d\n",i+1,tabla[i]);
return 0;
}


Le he pasado toda la tabla al padre, aunque no hiciera falta. Así puedes comprobar que no hace falta una decena de pipes y una decena de líneas para pasar 10 valores. Se puede hacer así de fácil.

No he hecho comprobación de errores (por ejemplo, no he tenido en cuenta que el fork puede fallar y que el read puede leer menos bytes de los que le índico). Para ello se puede incluir errno (para, en caso de error, informar al usuario acerca del error exacto) e incluir unas cuantas líneas con mandangas para asegurarnos de que el programa no continúa si algo falla.

En fin, espero haberte ayudado y que hayas entendido todo lo que te he explicado.

¡Saludos!

EDITO: Casi se me olvida. ¿Por qué defines una macro si despues no la usas? Me refiero a #define N=10 (que por cierto, se debería escribir #define N 10, en la definición de macros no va el signo igual).
#192
Entonces coincido plenamente  ;)
#193
Hombre, también podría tener usos positivos. Por ejemplo, se podría acceder al vehículo de un sospechoso que se ha dado a la fuga e inhabilitarlo sin necesidad de peligrosas persecuciones. También se podría evitar el exceso de velocidad en las carreteras. Claro, que entonces no faltarían en este foro mensajes como este:

CitarAsunto: Plisss alludemme URJENTEEE

kro hakear el koxe de un tio k kreo k se hacuesta con mi nobia para pegarle un susto. AI ALGUN PROGRAMA K TE LO HAKEE???!!!

JRASIAS DE HANTEBRASO

;D ;D ;D

P.S. Por cierto, llámame desconfiado si quieres, pero ¿es tuyo el texto? ¿No tienes ninguna fuente que citar  ;D?
#194
Dudas Generales / Re: Calculo Porcentaje
14 Enero 2012, 20:13 PM
eπi+1=0  :D
#195
Programación C/C++ / Re: Ayuda con notepad
14 Enero 2012, 20:09 PM
Antes de nada, he de pedirte disculpas. El instalador pesa medio mega, sí, pero necesita descargar varias cosas de internet (¡la suite de compiladores completa pesa más de 100 megas ya instalada! craso error el mío, ya me parecía muy poco medio mega...). Pero bueno, aun así no creo que encuentres muchos compiladores más ligeros.

Respecto a los errores... me parecen demasiados. Y también me parece mala señal que no fuera bien con la suite completa. Si te va mal, avisa.

Te paso la URL del sitio oficial de MinGW (en inglés) por si pudieras encontrar allí algo que te ayude: http://www.mingw.org/. Si no, ya nos contarás.
#196
Foro Libre / Re: -Videos youtube- elhacker.net
14 Enero 2012, 19:49 PM
Que no falten vídeos de APM  ;D ;D ;D

[youtube=425,350]http://www.youtube.com/watch?v=nJpI5FWxp6s[/youtube]

[youtube=425,350]http://www.youtube.com/watch?v=v9XKBJk2heM[/youtube]
#197
Oh, y otra cosa. No tiene nada que ver con programación en C/C++ pero tengo que decirlo >.<

"Utilice" va con c, no con z. ¡No te lo tomes a mal, por favor! A mí me gustaría que me corrigieran si me equivoco  ;)

¡Saludos!
#198
Perfectamente, lo primero se puede hacer como te dice rir3760. Si quieres programar una función tú mismo, a modo de ejercicio, puedes hacer algo así:

Código (cpp) [Seleccionar]
int cmp(int* vec1, int* vec2, int N) {
int i;
int b = 1;
i = 0;
while (i < N && b) {
b = vec1[i]==vec2[i];
++i;
}
return b;
}


Y utilizarla donde convenga. Por ejemplo, if (cmp(num,vec,4) Loquesea();

La ventaja de memcmp es que es más genérica y sirve para cualquier tipo de datos.

Lo segundo se podría hacer, aunque no creo que de manera portable. Básicamente el problema se puede reducir a saber si un archivo existe o no. Está la librería errno.h, de la biblioteca estándar. Esta librería define un entero, errno, que toma distintos valores en función de los errores que tengan las llamadas al sistema (en caso de que no haya error, el comportamiento no está definido). El problema es que en Linux y en Windows no se definen los mismos errores en el errno, ni para las mismas situaciones (el estándar requiere sólo 3 códigos de error básicos). Bajo Linux, el código del error genérico "Not such file or directory" es el 2, aunque puedes usar la macro ENOENT también.

Se puede usar una función como ésta si usas Linux.

Código (cpp) [Seleccionar]
int existsFile(char* filename) {
FILE* f = NULL;
f = fopen(filename,"r");
if (f == NULL && errno == ENOENT)
return 0;
else {
fclose(f);
return 1;
}
}


Con eso puedes comprobar si un archivo existe o no (aségurate de que filename tenga un carácter '\0' al final!!). Si estás en Windows, habría que mirar qué número de errores utiliza y cómo y cuándo los modifica. Si no hay ningún código apropiado en el errno, se debería usar otra librería de este SO.

Me cuesta entender tu última duda. ¿Podrías poner un código de ejemplo que lo ilustre?

¡Saludos!
#199
¡Gracias por responder, jefe!

Cita de: skapunky en 13 Enero 2012, 21:27 PM
Todo lo que se trata de malware es con objetivo claro de aprendizaje y estudio, antes la gente preguntava como juntar el server del poison para juankear ordenadores de terceros. Se decidió eliminar esta parte no ética.

Bien decidido. Te puedo asegurar que conmigo no tendrás ese problema. ;)

¡Saludos!

EDITADO: Por cierto, no quiero que te lo tomes a mal, lo digo de buen rollo: "preguntaba" va con b, no con v. A lo mejor me arriesgo un poco diciéndote esto, pero te aseguro que no quiero crear tensión ni nada >.<
#200
Programación C/C++ / Re: Ayuda con notepad
14 Enero 2012, 17:58 PM
¡Hola!

Cita de: H1tchclock en 14 Enero 2012, 16:22 PM
Muchas gracias @xANDRETE... Muy esclarecedor tu respuesta... Pero, para un novato como yo, con una conexion de "banda estrecha 1G", mi conexiones muy lenta...
Cual seria el compilador mas liviano para descargar: CYGWIN ó MinGw.
Soy novato en todo esto, y cada respuesta la tomo muy en cuenta.... Y tengo que hacer lecciones factibles para facilitar mi aprendizaje autodidata...
Gracias por la ayuda, muy amable de tu parte,

Saludos desde Bolivia... 

MinGW, sin duda.

Hay un instalador automático de apenas medio megabyte, es bastante ligero. Te paso el link del sitio donde puedes descargarte la última versión: http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/mingw-get-inst-20111118/

No tengo ni idea de si el instalador se encarga de configurar automáticamente la variable de entorno PATH. Si tienes algún problema respecto a su uso, ya nos lo dirás.

Bueno, ¡saludos jefe!