• Publicidad

Duda con pack e int en C

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Duda con pack e int en C

Notapor creating021 » 2009-08-30 19:19 @847

Hola, una duda con estructuras :|

En creador.pl tengo el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print OUT (pack "I", 12 );
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Los datos imprimen perfectamente en el archivo (lo he visto con un editor hexadecimal) pero a la hora de usar C... los cosas no van bien.
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
//...
unsigned int numero;
read(fp, &numero, sizeof(unsigned int));
printf("El número es: %i\n", numero);
//...
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Debería de imprimir 12, pero imprime -1073743292 lo cual es ilógico.

¿Qué es lo que está pasando?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Publicidad

Re: Duda con pack e int en C

Notapor salva » 2009-08-31 03:41 @195

Yo no veo ninguna relación entre el 12 y el número que tu estás leyendo (-1073743292)

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -e 'print pack I => 12'|hexdump -C
  2. 00000000  0c 00 00 00                                       |....|
  3. 00000004
  4. $ perl -e 'print pack I => -1073743292'|hexdump -C
  5. 00000000  44 fa ff bf                                       |D...|
  6. 00000004
  7.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Si haces un hexdump del fichero generado por Perl que obtienes?

A mi me da la impresion de que estas leyendo otra cosa... ¿qué valor te devuelve la funcion de C read()?
Última edición por explorer el 2009-08-31 04:06 @212, editado 1 vez en total
Razón: Acento
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Duda con pack e int en C

Notapor netsoul » 2009-08-31 13:10 @590

Creo que a creating021 le está resultando algún puntero o dirección de memoria en lugar del resultado esperado, de los cuales serían diferentes en cada máquina. Aparentemente el problema es algo minúsculo pero no sabría cómo solucionarlo ya que mis conocimientos son muy escasos. :)
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Duda con pack e int en C

Notapor creating021 » 2009-08-31 16:00 @708

Gracias por responder.
En efecto hexdump me muestra 0c 00 00 00 lo cual significa que Perl no es el problema.

La prueba de eso está en otro programa hecho en C donde usé errno, el cual se queja y dice "Bad file descriptor"; ahora la cosa es que yo estaba usando fopen y al usar open el problema se arregló ¿Por qué?

La documentación de OpenGroup no dice nada de esto, y en teoría se puede usar fopen("archivo", "rb") :?

Me encantaría poderlo hacer todo en Perl... :cry:
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Duda con pack e int en C

Notapor explorer » 2009-08-31 17:48 @783

Desde luego, siempre es mejor usar la mejor herramienta para resolver un problema, así que si la mejor solución es usar C, pues estupendo.

Ahora bien, me gustaría saber qué es lo que no puedes hacer en Perl.

Yo, cuando necesité potencia de procesador, use PDL e Inline::C.

También sería interesante ver el código en C que falla.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda con pack e int en C

Notapor creating021 » 2009-08-31 18:59 @833

explorer escribiste:Ahora bien, me gustaría saber qué es lo que no puedes hacer en Perl.

No es que no se pueda hacer en Perl; yo lo uso para generar los datos, pero la lectura se hace con una extensión de una librería hecha en C, para un proyecto que es sólo C (caprichos... aquí no hay nada que refutar, es así o así).

explorer escribiste:También sería interesante ver el código en C que falla.

Era más o menos así (he cambiado fopen() por open(), al igual que fclose()).
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
#include <stdio.h>
#include <fcntl.h>

int main(void) {
    FILE *fp;
    unsigned int numero;
    fp = fopen("archivo.algo", "rb");

    if ( fp == NULL ) {
        perror("El archivo no se puede abrir\n");
        exit(1);
    }

    lseek(fp, 0, SEEK_SET);
    read(fp, &numero, sizeof(unsigned int));
    printf("El numero %i debe ser igual a 12\n", numero);

    fclose(fp);
    return 0;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Duda con pack e int en C

Notapor explorer » 2009-09-01 02:55 @163

El error está en usar la función read()...

Si usas el par fopen() y fclose(), entonces debes usar la función fread().

Si quieres usar la función read(), es que debes usar open() y close().

De ahí sale el error de "Bad descriptor file...". Cada conjunto de funciones es de una capa de abstracción de I/O distinta. Y estabas mezclándolas.

En cuanto a la lectura por parte de una librería escrita en C, aun así también puedes hacerlo desde Perl :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Inline C => Config => LIBS => '-lbiblioteca';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


aunque de forma un poca liosa (al menos al principio, hasta que le coges el truco).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda con pack e int en C

Notapor salva » 2009-09-01 04:15 @218

creating021 escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
    read(fp, &numero, sizeof(unsigned int));
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Aquí, estaría bien que comprobases lo que devuelve read:

Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
    int bytes;
    bytes = read(fp, &numero, sizeof(unsigned int));
    if (bytes != sizeof(unsigned int)) {
       if (bytes == -1) {
           perror("error de lectura del fichero");
       }
       else {
           fprintf(stderr, "no se leyeron suficientes bytes del fichero (%d < %d)\n",
                   bytes, sizeof(unsigned int));
       }
    }
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¡Admito que es bastante engorroso, pero si en C no compruebas los errores al final las aplicaciones acaban fallando por todos lados!

De todas formas siempre puedes crear una función que asegure que se leen realmente todos los bytes que se le piden y que sea capaz de gestionar adecuadamente los errores EINTR, que siempre aparecen cuando menos te lo esperas.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Duda con pack e int en C

Notapor creating021 » 2009-09-01 19:16 @844

Muy instructivo los comentarios, he aprendido mucho y agradezco por eso, pero aquí va lo más importante, este trabajo me enseñó que:

Sí bien el proyecto se puede hacer 100% en Perl, debido a que el diseño inicial es 100% en C no se puede usar Perl (no porque Perl no deje o no se pueda, es por otras cuestiones que no están en discusión). Este post demuestra qué Perl, como lenguaje, es tan capaz de lidiar con estructuras y generar datos como en C, además que toma menos tiempo programar la aplicación y revisar que no haya errores, que las operaciones y la lectura como escritura de datos binarios son más simples en Perl y que mejor aún, sus funciones son más integradas y a decir verdad, en mi opinión, Perl está mejor documentado que C.

En efecto, Perl no es, pera nada engorroso, a diferencia de C. ¡Que viva Perl!
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Duda con pack e int en C

Notapor explorer » 2009-09-01 20:55 @913

Una buena oportunidad, para que cuando el proyecto esté acabado, decirle al cliente "Pues menos mal que está acabado... aunque con Perl, hubiéramos tardado la mitad" :lol:

Bueno, queda claro que respetamos la decisión del diseñador en usar C como sistema de desarrollo. Tendrá sus motivos y/o requerimientos. Perl no puede alcanzar a veces algunos de ellos, como por ejemplo la velocidad en la ejecución, pero aún esos justificados casos, se podría hacer las partes de C integradas en Perl, como ya comentamos.

Y, naturalmente, el cliente siempre tiene razón (aunque sea "su" razón).

Yo ahora estoy prestando servicios en una empresa en la que el jefe insiste con:

* "Somos una empresa Windows"
* "Solo hacemos trabajos para Java y .Net" y
* "Solo contratamos titulados"

Esas son sus premisas, pero cuando le preguntas por las razones, no las dice. Teniendo en cuenta que no tiene ni idea de programar una sola línea en ningún lenguaje de programación y, de Windows, sabe lo justito -aún cierra un programa para pasar a otro-, sus razones 'aparentes' son:

* "Trabajamos en Windows porque es lo que demanda el mercado"
* "Las últimas y más modernas tecnologías pasan por Java y .Net" y
* "Nuestro personal es el más cualificado del mercado"

cuando en realidad, las verdaderas razones son:
* "Es más fácil encontrar un cliente para desarrollar para Windows, en nuestra región, aparte que Micro$oft pone un montón de pasta encima de la mesa para hacer proyectos"
* "Los programadores de Java y .Net son más fáciles de encontrar en el mercado laboral, y por ende, son mucho más baratos"
* "Me supongo que un chaval que es un Ingeniero tendrá la madurez y sabiduría suficiente como para terminar el proyecto a tiempo, antes de que sea contratado por una empresa mejor"

En otras palabras... no son razones tecnológicas, sino de mercado, incluso basadas en prejuicios.

Frente a ellas, me río delante de él, con mis propias razones:

* "Instalé Linux desde el primer día en mi ordenador y no he tenido problemas para intercambiar información con el resto de compañeros"
* "Además, los servidores de la empresa, realmente, son equipos Linux desde hace AÑOS"
* "Jefe, necesito otros 1000€ más este año para renovar las licencias de Windows, MSDN, Office y Visual Studio -somos empresa Windows, recuerde- :twisted: "
* "Por muy expertos en Java y .Net que sean los programadores, al final, todos los plazos pactados se van al garete, porque siempre se descubren fallas en las librerías que obligan a los programadores a resolverlas de otras formas distintas de las que habían pensado para resolver el problema principal" y
* "Mucho Ingeniero Superior en Informática pero al final, hasta que no lo pones delante de un ordenador, no te das cuenta de lo inútil que es... por la sencilla razón de que una cosa es estudiar Informática y aprobar exámenes y otra cosa es dominar Informática y ser diestro y rápido con el ordenador".

En otro trabajo distinto, mi conversación con el jefe fue esta:
- ¿Cómo que Perl? ¿Qué es eso? Aquí lo hacemos todo con C.
- Bueno, de acuerdo. Lo haré en C. Mientras, el programa en Perl que he tardado 20 minutos en hacer ya está funcionando y el resto de compañeros y ordenadores ya lo están usando.
- Bien...
- En cuanto al programa en C, yo creo que tardaré un día en hacerlo, comprobarlo e instalarlo.
- ¡Ah!... Vale...
(se dio media vuelta y se marchó)
Naturalmente, viendo la cara que puso, no hice el programa en C, ni en ese momento, ni durante los 5 años siguientes. Obviamente, le interesaba tener el trabajo hecho cuanto ANTES. Y dejarse de preocupar si lo hacíamos en tal o cual lenguaje.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados