elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 ... 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [31] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ... 51
301  Programación / Programación C/C++ / Re: Proceso que retorna 141 en Linux. en: 27 Octubre 2012, 23:47 pm
uff a ver nunca he usado esta manera para crear distintos hilos de ejecucion, pero creo que en algo puedo ayudar:

1) en cuanto a tu duda inicial:

Código
  1. switch(getpeername(sockfd, &sockbuf, &stsize))
  2.   {
  3.    case 0: break;
  4.    case ENOTCONN:
  5.     printf("Proceso %i: reconectando socket...", ((struct params*)p)->thread);
  6.     //...
  7.  

la funcion getpeername() devuelve 0 en caso de que vaya bien, y -1 en caso de error, y es entonces cuando le da un valor a errno que es el que tu tienes que comprobar. el codigo seria algo asi:

Código
  1. aux=getpeername(sockfd, &sockbuf, &stsize);
  2. if (aux<0 && strcmp("ENOTCONN", strerror(errno))==0) {
  3.     //reconectando socket... etc

2) veo muchas reservas de memoria pero ningun free(). aunque lo normal es que los so modernos se encarguen de liberarla al finalizar el programa, nunca esta de mas ponerlo por si las moscas y para evitar posibles quebraderos de cabeza. te dejo un enlace corto que habla sobre ello:

http://cboard.cprogramming.com/cplusplus-programming/76877-general-malloc-question.html

3) cuando declaras el array de structs:

Código
  1. struct params *p = (struct params*)malloc(atoi(argv[1])*sizeof(struct params));

lo haces como un puntero, pero luego accedes a ellos de esta manera:

Código
  1. p[j].thread = j;
  2. p[j].port = atoi(argv[3]);

no deberias acceder a los campos del struct asi:

Código
  1. *(p[j]).thread=j;

o lo que es lo mismo, asi:

Código
  1. p[j]->thread=j;

en lugar de como tu lo haces? tenia entendido que hacerlo como tu lo haces era solo para un struct estatico. quizas he dicho una burrada, pero me refiero a que pensaba que era para una variable que la declaras asi (lo de estatico no se si esta bien dicho):

Código
  1. struct params p;

y no como un puntero. te funciona bien? si es asi ya lo se para la proxima vez. aunque entonces no se que utilidad tiene el operador '->'.

4) es un codigo que aunque no sea demasiado largo es bastante denso. tu eres quien lo ha codeado y quizas no tengas problemas, pero para quien quiera leerlo e intentar entenderlo cuesta bastante. unos cuantos espaciados y algun que otro comentario ayudarian bastante, y tambien te ayudarian a ti en caso de que dentro de unos meses quieras volver a mirarte el codigo.


5) si no te es mucha molestia podrias colgar el codigo cuando lo acabes ya que a mas de uno le vendra bien para aprender (yo incluido).

un saludo!

pd. estas haciendo este flooder para aquel proyecto en el que os juntasteis unos cuantos de este foro?
302  Programación / Programación C/C++ / Re: Proceso que retorna 141 en Linux. en: 27 Octubre 2012, 21:50 pm
sin el codigo completo es algo dificil adivinar de donde viene el error... :rolleyes:
303  Programación / Programación C/C++ / Re: Proceso que retorna 141 en Linux. en: 27 Octubre 2012, 20:54 pm
Citar
¿Puedo tratar de detectar si un socket esta conectado o no y reconectarlo sin que se cierre el programa?¿O de hacer un handler para esta señal?

getpeername()

y para lo otro, aunque ya lo hayas encontrado, por si acaso no lo has hecho asi, tienes todos los errores definidos en el archivo de cabecera syscall.h, que lo tendras en /usr/include o por ahi.

un saludo!
304  Programación / Programación C/C++ / Re: Acceder a bits de un array. en: 24 Octubre 2012, 17:20 pm
Citar
stdlib es una libreria del estandar, no es nada externo.

cierto, no lo dije como deberia haberlo hecho. me referia mas bien a que no hace falta usar ninguna libreria para hacer esto que comentas.

Citar
Y si tengo una pregunta, ¿de donde sacas las mascaras?

no se si lo sabras, pero para pasar de binario a hexadecimal se cogen los bits en grupos de 4 (por lo que tienes un valor de 0 a 15 para cada agrupacion) y se pasa directamente al caracter hexadecimal. por ejemplo:

Código:
 decimal: 12 -> binario: 0000(0) 1100(12 = C hex) -> hexadecimal: 0x0C
decimal: 67 -> binario: 0100(4) 0011(3) -> hexadecimal: 0x43
decimal: 179 -> binario: 1011(11 = B hex) 0011(3) -> hexadecimal: 0xB3

luego en cuanto a las mascaras, las mas simples son una AND (&) o una OR (|). para una AND, el resultado sera cierto (1) solo si los dos operandos son 1, y para los demas casos sera 0. en cuanto a la OR, solo sera falso (0) cuando los dos operandos son 0, y en cualquier otro caso sera 1.

te pondre un par de ejemplos mas:

si tienes un numero inicial 01100110 (102 en decimal), y quieres poner a 0 el bit 1 y 2 (en binario, el bit menos significativo es el de la derecha de todo y se considera el bit 0), entonces deberas aplicar una mascara AND con un numero que en esas posiciones tenga los bits en 0, y en todas las restantes tenga 1 para no alterar nada, ya que un AND con un 1 hara que el resultado siga como estaba, puesto que si estaba en 1 seria: 1&1=1 y si estaba en 0 seria: 1&0=0. por lo tanto, el numero que debemos usar para la mascara seria el 11111001, que es el 0xF9 en hexadecimal.
Código:
a=01100110
a&=0xF9 (a vale 01100000)

ahora imagina que quieres poner el bit 4 a 1, lo que deberias hacer es aplicar una mascara OR con un numero que tenga el bit en 1 en esa posicion, y las demas en 0 para no alterar nada mas, ya que si el bit estaba en 0: 0|0=0 y si estaba en 1: 1|0=1. este numero seria el 00010000, que es el 0x10 en hexadecimal.
Código:
a|=0x10 (a vale 01110000)

con esto y el operador shift (<< o >>) se pueden hacer infinidad de cosas a nivel de bits. la mas simple de todas, un simple programa que te pase de decimal a binario sin divisiones ni restos. (compila con un warning pero funciona bien, me daba pereza buscar el especificador de formato adecuado):

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. unsigned char byte;
  6. short int i;
  7.  
  8. printf("Ingresa un numero del 0-255: ");
  9. scanf("%u", &byte);
  10.  
  11. for (i=7; i>=0; i--)
  12. printf("%u", (byte>>i)&0x01);
  13. printf("\n");
  14.  
  15. return 0;
  16. }

con su salida:

Código:
:~$ ./dec2bin
Ingresa un numero del 0-255: 23
00010111

espero que te ayude, un saludo!
305  Programación / Programación C/C++ / Re: Como es que un unsigned tiene 16 bits? en: 24 Octubre 2012, 12:58 pm
dependera de si es un entero, un entero corto, un tipo caracter, etc.

para que veas un ejemplo:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. unsigned int ui;
  6. unsigned short int usi;
  7. unsigned char uc;
  8.  
  9. printf("unsigned int: %lu bytes\n", sizeof(ui));
  10. printf("unsigned short int: %lu bytes\n", sizeof(usi));
  11. printf("unsigned char: %lu byte\n", sizeof(uc));
  12.  
  13. return 0;
  14. }

lo que dara una salida de:

Código:
unsigned int: 4 bytes
unsigned short int: 2 bytes
unsigned char: 1 byte

un saludo!
306  Programación / Programación C/C++ / Re: en que lenguaje puedo programar para protoboard en: 24 Octubre 2012, 11:27 am
con C se ve que puedes controlar los puertos de tu computadora y hacer lo que dices. he encontrado una pequeña introduccion en el primer o segundo resultado de google:

http://hgr.tripod.com/puertos_c.html

sino siempre puedes usar un microcontrolador y programarlo en C con los compiladores HITECH o CSS por ejemplo, para luego comunicar el microcontrolador con el pc ya que a partir de cierta gama no muy cara disponen de un modulo USART muy facil de usar, entre otros.

espero que te sirva de ayuda, un saludo!
307  Programación / Programación C/C++ / Re: Acceder a bits de un array. en: 23 Octubre 2012, 23:43 pm
una pregunta que es lo que quieres hacer exactamente? modificar los bits de un byte? esto se suele hacer aplicando mascaras al byte. por ejemplo, si tienes un byte inicial:
Código:
a = 10000001
y quieres poner a 0 el MSB para que quede asi:
Código:
b = 00000001
lo que deberias hacer es aplicar la siguiente mascara:
Código:
b = a & 0x7F
con lo que estarias poniendo a 0 el bit mas significativo, y dejando igual a los demas. si ahora quisieras volver a ponerlo a 1, deberias aplicar la siguiente mascara:
Código:
c = b | 0x80

lo digo porque no creo que hagan falta librerias externas y demas para acceder a los bits, ya que con los operadores que trae hay mas que suficiente para muchisimas aplicaciones. si tienes alguna pregunta ya diras...

espero que te sirva de ayuda, un saludo!
308  Programación / Programación C/C++ / Re: ¿Cómo determinar que sólo acepte 8 dígitos? en: 21 Octubre 2012, 02:11 am
Citar
Código
  1. if (strlen(Datos[c].CodigoBarras)==8) // Aquí necesito ayuda
Datos[c].CodigoBarras es un numero entero, y tu lo estas pasando como argumento a una funcion que espera un puntero a caracter. no se si lo sabras, pero strlen() devuelve la longitud de la cadena pasada como parametro, por lo que pasarle un entero como parametro no tiene mucho sentido.

si lo que quieres hacer es tratar a un codigo de barras como un array de enteros, entonces tienes que hacerte alguna funcion que te diga el total de digitos que tiene el numero. ademas seria mas facil declarar el codigo de barras asi:
Código
  1. int CodigoBarras[10];

si quieres trabajar el codigo de barras como una cadena para usar strlen(), entonces debes declararlo como tal:
Código
  1. char CodigoBarras[10];

espero que te ayude, un saludo!
309  Programación / Programación C/C++ / Re: insertar palabra por palabra a una matriz en: 20 Octubre 2012, 14:25 pm
estas reservando memoria para un array de punteros a caracter, pero luego no reservas memoria para cada uno de esos punteros. suponiendo que quieres que la matriz contenga NumPal palabras y que cada palabra tenga un maximo de NumLet letras (sin incluir el NULL al final):

Código
  1. char** matriz=(char**)malloc(NumPal*sizeof(char*));
  2. for (j=0; j<NumPal; j++) matriz[j]=(char*)malloc((NumLet+1)*sizeof(char));

y al final de programa, no te olvides de liberar la memoria reservada:

Código
  1. for (j=0; j<NumPal; j++) free(matriz[i]);
  2. free(matriz);

un saludo!
310  Programación / Programación C/C++ / Re: Direcciones de memoria en: 17 Octubre 2012, 14:45 pm
prueba asi:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(){
  5.  
  6. int n, *p;
  7. FILE *f;
  8.  
  9. n=10;
  10. f=fopen("mem.txt","w");
  11. fprintf(f,"%p",&n);
  12. fclose(f);
  13.  
  14. f=fopen("mem.txt","r");
  15. fscanf(f,"%p",&p); // aqui te faltaba el &
  16. fclose(f);
  17. printf("%d\n", *p); // aqui se imprime el numero 10
  18.  
  19. return 0;
  20. }

un saludo!
Páginas: 1 ... 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [31] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ... 51
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines