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

#891
Lo más sensato sería que representaras el sensor en tu código, así, incluso, te sería más fácil depurar.

C, y por ende C++ son lenguajes creados para hablar con la máquina pero muchas veces, sobre todo quien trabaja a más alto nivel olvida o desconoce ese potencial del lenguaje. En tu caso deberías usar los bitfields.

En tu ejemplo, para representar el registro CONFIG_0 podrías hacer así:


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

typedef enum {
    DIVIDE_BY_2,
    DIVIDE_BY_4,
    DIVIDE_BY_8,    /* Default value */
    DIVIDE_BY_16,
    DIVIDE_BY_32,
    DIVIDE_BY_64,
    DIVIDE_BY_128,
    DIVIDE_BY_256
} prescaler;

struct {
    unsigned TX_FREQ_DIV : 3;
    unsigned NUM_TX : 5;
} CONFIG_0;

/* Aquí otros registros
struct {
    unsigned <campo> : <tamaño en bits>;
    unsigned <campo> : <tamaño en bits>;
    ...
} <nombre del registro>

...

*/

int main() {
    CONFIG_0.TX_FREQ_DIV = DIVIDE_BY_8;
    CONFIG_0.NUM_TX = 5;
   
    puts("CONFIG_0 register status");
    puts("------------------------");
    printf("TX_FREQ_DIV : %u\n", CONFIG_0.TX_FREQ_DIV);
    printf("NUM_TX      : %u\n", CONFIG_0.NUM_TX);
}
#892
Ok. La construcción está mal hecha. Intentas anidar expresiones y eso no está permitido,  hasta donde yo sé.

Después intentas hacer que scanf recoja y guarde un dato numérico cuando tratas con una cadena. El argumento [ indica a scanf que el dato va a ser una cadena. Esa d al final solo indica a scanf que en el buffer va a haber una d al final de todo que debe ser ignorada.

Usa otra técnica.

Por ejemplo recoge una cadena de X caracteres y después mira si tiene más de 1 caracter, si es así da un mensaje de error.
Después miras si ese carácter es un dígito, da un mensaje de error.
Al final tendrás el caracter para comparar con el if. O lo conviertes a un número y podrás usar un switch para facilitar futuras ampliaciones del menú.
#893
A ver, ¿qué intentaste decir con ese argumento del scanf?
#894
Vale, entiendo. Algo que te va a gustar poco: C es un lenguaje de nivel medio y a diferencia de Java, C#, PHP, etc. debes aprender más de como funcionan los ordenadores por dentro, solo entonces sacarás todo el partido al lenguaje. Debes pensar que C fue creado para escribir el sistema operativo  UNIX y eso es trabajar con el hardware.

Dicho esto cuando en la línea de comandos haces COMANDO < ARCHIVO lo que haces es ejecutar el comando o programa y pasar el contenido del archivo al buffer de entrada estándar del comando. Desde tu punto de vista es como si alguien, una vez ejecutado el programa, hubiera escrito todo el contenido del archivo desde el teclado y debieras sacarlo.

En ce existe la función fgets que sirve para sacar una cadena de texto de un archivo, en tu caso el buffer de entrada (que es stdin).

Un posible inicio:

#include <stdio.h>

int main() {
    char str[80] = {0};
   
    fgets(str, 80, stdin);
    while(!feof(stdin)) {
        /* Cambia la siguiente línea por tu detector
         * de líneas vacías.
         **/
        printf("%s", str);
       
        fgets(str, 80, stdin);
    }
}
#895
Busca una línea que únicamente contenga '\n'
#896
Esos errores te que indica el compilador precisamente te marcan el fallo.

Usas variables globales que son enteros p y q como punteros a la estructura. Esto es un problema de tipos que deberías solucionar.

Por otra parte usas los miembros de la estructura info y liga cuando estos no existen en ella. En tu estructura tienes definidos los miembros int dato, *p, *q y *t. Por cierto *p, *q y *t son punteros a entero, no deberían ser usados para guardar la dirección de la estructura dato, como intuyo pretendes hacer.
#897
Programación C/C++ / Re: enteros de 12 bits
5 Marzo 2017, 12:41 PM
A ver, he encontrado esto: http://www.disc.ua.es/~gil/FAT12Description.pdf

Según el paper los 12 bits se consiguen de esta forma:

Suponiendo que 3 bytes consecutivos tienen la siguiente información (supongamos también que cada bit del byte puede alojar un número decimal):


PosiciónByte
076543210
154321098
232109876

Bien, pues el primer número de 12 bits sería el 109876543210
y el segundo número de 12 bits sería el 321098765432

Esto es así porque la FAT se hizo para máquinas IBM, y esas son little-endian, lo que quiere decir que el LSB se encuentra en la parte baja de la memoria. Traducido:
Para formar la representación de los 12 bits del primer número debes tomar
· Del 2º byte los 4 bits menos significativos : 1098
· Del 1er byte todos los bits : 76543210

Para formar la representación de los 12 bits del segundo número debes tomar
· Del 3er byte todos los bits : 321098765432
· Del 2º byte los 4 bits más significativos
#898
Programación C/C++ / Re: Ayuda con un codigo
4 Marzo 2017, 11:25 AM
Te liadte demasiado con el case 5: tienes un segundo main.
#899
Las funciones con puntos suspensivos son funciones con lista de argumentos variables. Hay veces que no sabes cuantos argumentos se van a pasar y se usan estas. Por ejemplo, como te han dicho, printf es una de ellas, scanf otra. De antemano su programador desconoce que se le va a pasar pero hacen su trabajo ya sea con uno o cien argumentos.

Búscala por internet, son un poco complicadas pero enseguida se le pilla el truco.
#900
Programación C/C++ / Re: Multi procesos en C ?
21 Febrero 2017, 11:03 AM
Desde C11 está la librería threads. Sirve para programación multihilos nativa en C.

Para multiproceso tienes fork y la familia exec. En inglés hay bastante información.