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

#301
sin el codigo completo es algo dificil adivinar de donde viene el error... :rolleyes:
#302
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!
#303
Citarstdlib 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.

CitarY 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:

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.
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.
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):

#include <stdio.h>

int main() {

unsigned char byte;
short int i;

printf("Ingresa un numero del 0-255: ");
scanf("%u", &byte);

for (i=7; i>=0; i--)
printf("%u", (byte>>i)&0x01);
printf("\n");

return 0;
}


con su salida:

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


espero que te ayude, un saludo!
#304
dependera de si es un entero, un entero corto, un tipo caracter, etc.

para que veas un ejemplo:

#include <stdio.h>

int main() {

unsigned int ui;
unsigned short int usi;
unsigned char uc;

printf("unsigned int: %lu bytes\n", sizeof(ui));
printf("unsigned short int: %lu bytes\n", sizeof(usi));
printf("unsigned char: %lu byte\n", sizeof(uc));

return 0;
}


lo que dara una salida de:

unsigned int: 4 bytes
unsigned short int: 2 bytes
unsigned char: 1 byte


un saludo!
#305
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!
#306
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:
a = 10000001
y quieres poner a 0 el MSB para que quede asi:
b = 00000001
lo que deberias hacer es aplicar la siguiente mascara:
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 = 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!
#307
Citarif (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:
int CodigoBarras[10];

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

espero que te ayude, un saludo!
#308
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):

char** matriz=(char**)malloc(NumPal*sizeof(char*));
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:

for (j=0; j<NumPal; j++) free(matriz[i]);
free(matriz);


un saludo!
#309
Programación C/C++ / Re: Direcciones de memoria
17 Octubre 2012, 14:45 PM
prueba asi:

#include <stdio.h>
#include <stdlib.h>

int main(){

int n, *p;
FILE *f;

n=10;
f=fopen("mem.txt","w");
fprintf(f,"%p",&n);
fclose(f);

f=fopen("mem.txt","r");
fscanf(f,"%p",&p); // aqui te faltaba el &
fclose(f);
printf("%d\n", *p); // aqui se imprime el numero 10

return 0;
}


un saludo!
#310
Programación C/C++ / Re: Direcciones de memoria
17 Octubre 2012, 14:35 PM
c+especificadores+formato y busca por puntero o direccion de memoria, veras que el que se usa no es %x.

si despues de esto te sigue fallando comentalo y probaremos otra cosa.

un saludo!