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

#1511
Muy buenas.

He intentado acabar el programa que has realizado y me he encontrado con el problema de que a la hora de borrar registros el archivo queda con registros vacíos, pero su tamaño es igual al momento en que tenía un mayor número de éstos.

Es decir, si se han realizado cuatro entradas, pero se han borrado tres de ellas, al archivo solo le queda una, pero sigue manteniendo un tamaño de cuatro entradas. Eso es por el hecho de que C, en su biblioteca estándar no tiene capacidad para redimensionar un archivo. Debería para ello usarse otro archivo temporal para que se incluyeran las entradas válidas o usar funciones del S.O. para redimensionar el archivo.

Trabajar todo directamente sobre el archivo, como pretendes, complica un poco las cosas.  :-\
#1512
Cintunuando con la explicación de Eterna Idol, decir que una forma de poner en la pila una cadena es mediante el uso de arrays de carácteres:

char str[] = "Una cadena";

Siempre y cuando str sea una variable local. En este caso C crea espacio en la pila y genera el código para copiar 'Una cadena' en ese espacio reservado, mas un caracter nulo, con lo que 'Una cadena' no existe en otro sitio que el archivo fuente de C.

Pero no se puede definir de la manera siguiente
char str[];
str = "Una cadena";


Por el hecho de que str es un puntero estático, no puede apuntar a otro sitio, y ahora "Una cadena" es una constante que se guarda en la zona de memoria de solo lectura. C no genera codigo para copiar el valor sino que interpreta que se quiere que str apunte a la cadena, lo que es ilegal.
#1513
Cuándo a un puntero le antepones el asterisco (*) le estas diciendo al compilador que quieres obtener el valor que guarda.
Para incrementar el valor de la posición apuntada basta usar el operador de incremento (++).
Por eso, como en susodichas líneas no haces uso del valor devuelto por el puntero, algunos compiladores lanzaran alertas informando de ello.
#1514
Muy buenas.

Pues hay unos cuantos bugs.
Línea 14, 16 y 20: debes cambiar la forma con que haces el incremento. No te interesa el valor que hay guardado en el puntero, solo incrementarlo. Eso es cambiar *var++ por var++.

Por otra parte cuándo la cadena original no tiene separador, el separador es el primer carácter, o hay pocos caracteres en la cadena apuntada por s hay basura en las cadenas s y t.
#1515
Programación C/C++ / Re: Ayuda menu
24 Diciembre 2015, 18:46 PM
Muy buenas.

Pues eso es porque cuándo has introducido la opción a la siguiente ejecución del menú en el bufer del teclado sigue quedando el carácter de nueva línea. Éste es aceptado por scanf y la ejecución continua.

Inserta el código en tu switch y lo verás
  case '\n':
      printf("*** NL ***\n");


Debes encontrar una forma de eliminar el este carácter del buffer después del scanf.

Eso sí, fflush(stdin); no es la forma  :rolleyes:
#1516
Muy buenas.

Buscando un poco porqué el DexDrive terespondía IAI!, que no parece ser una respuesta ID válida después de INIT, me he encontrado con un código en C# que se comunica con DexDrive. Mirándolo un poco por encima se ve que hay que hacer más cosas que las explicadas en el manual que adjuntaste.

Aquí tienes:
https://github.com/ShendoXT/memcardrex/blob/master/MemcardRex/DexDrive.cs
#1517
Muy buenas.

Sobre la cadena IAI en toda comunicación el texto dice:

CitarA cada comando o respuesta le antecede la cadena "IAI" (0x49 0x41 0x49) [...]. Un solo byte las sigue, indicando qué comando o respuesta se está enviando. Pueden seguirle mas bytes, dependiendo del comando o la respuesta exacta; la naturaleza de estos argumentos está listada más abajo por cada comando o respuesta.

Así que según esto toda comunicación, tanto por tu parte, como por el DexDrive tendrá la forma
0x49 0x41 0x49 <byte de comando/respuesta> [<bytes de argumentos>]

El texto dice:
CitarCuando un DexDrive se energiza por primera vez, se encuentra en un estado que yo llamo "pouting", y básicamente rechaza realizar cualquier cosa hasta que no se haya inicializado. Cualquier comando válido, a parte de INIT, será respondido mediante POUT, y no sucederá nada.

(El modelo PSX continuará rechazando comandos inválidos con ERROR, mientras el modelo N64, contestará con POUT a todo menos a INIT, siempre y cuando se lleve el prefijo "IAI".)

La para inicializar DexDrive, hay que mandar el comando INIT, seguido por un MAGIC_HANDSHAKE en los subsiguientes 100ms (aprox.) después de recibir la respuesta ID.

Sobre la respuesta de INIT y el ID:
Citar0x00    INIT

   Argumentos: <17 bytes>
   Respuesta: ID

[...]

0x40    ID

   Argumentos: <byte extraño> <3-bytes modelo> <versión de firmware>

   Identifica el modelo de DexDrive en respuesta a INIT.

   <byte extraño> está derivado de la cadena de 17 bytes mandada con INIT; ver fórmula extraña de mas abajo para mas detalles.

   La cadena 3-bytes modelo es "PSX" o "N64".

   <versión firmware> es la versión firmware x.yz empaquetada en un simple byte de la forma: xxyyyyzz

Sobre la fórmula extraña da el proceso de cómo calcularla, pero hay que tener en cuenta que es algo que hace DexDrive. Por tu parte el sacarla solo te serviría como comprobación. Pero viendo lo que dice el texto el algo que te puedes ahorrar. El texto dice:
CitarNo tengo ni idea de porqué es tan complejo, especialmente por el hecho de que no conduce a ningún sitio. InterAct's DexPlorer no rechazará comunicarse con ningún dispositivo que no produzca el byte esperado, aunque si siempre se envía la misma cadena de 17 bytes, ¿cuál es la idea?. [...]

Básicamente te basta recoger de qué modelo se trata, si PSX o N64, alguna función responde de una forma según el modelo.

Si no sabes inglés te será difícil que puedas crear el programa. Los traductores informáticos no dan buenos resultados a la hora de traducir este texto.

Espero haberte ayudado.
#1518
Muy buenas.

Leyendo el txt que adjuntas veo que te has saltado varias cosas.
Cito:
Every command or reply is prefixed with the string "IAI" (0x49 0x41 0x49)
(possibly standing for "InterAct Accessories, Inc.").  A single byte follows,
indicating which command or reply is being sent.


Eso indica que antes de mandar los 17 bytes debes incluir IAI y después un byte con el número de función que vas a llamar, en este caso 00. Con lo que tu lista de bytes quedaría de esta forma

0x49 0x41 0x49 0x00 0x10 0x29 0x23 0xbe 0x84 0xe1 0x6c 0xd6 0xae 0x52 0x90 0x49 0xf1 0xf1 0xbb 0xe9 0xeb

Después de haber mandado esto DexDrive te va a mandar su ID. Desde que recibes esta tienes 100ms para mandar un magic handshake, como te indica el texto en la sección POUTING. Después, como indica la sección MAGIC HANDSHAKE, el firmware para PSX te responderá con un error, mientras que el firmware N64 no responderá nada.

Sobre la configuración del puerto. Cito:
The serial connection with the DexDrive is established at 38400 baud, 8 bits,
no parity, one stop bit (8N1).


Lo único que se desconoce es si usa RTS/CTS: Se dice que habilita estas lineas pero no está claro si las usa o cuando las usa.

Espero haberte ayudado.
#1519
Cierto, es una conversión. Pero decía de que es extraño porque no se suele ver esta forma de llamar a una función directamente con los datos, siempre se suelen preparar antes en una variable.
#1520
Muy buenas.

Pues sigo con mi cruzada de autodescubrimiento de gramáticas extrañas que C acepta.

Supongamos la siguiente función que acepta un array de cadenas y las va imprimiendo hasta encontrar una cadena vacía:

void func(char* str[]) {
    int i = 0;
    while(str[i][0] != '\0')
        printf("%s\n", str[i++]);
}


Ante esto uno piensa que para llamar a dicha función debe crear una variable de esta forma
char *lista[] = {"uno", "dos", "tres", "cuatro", "");
y después llamar a la función
func(lista);

Pues se puede llamar a la función pasando un argumento anónimo, la lista entera directamente, de esta forma
func((char*[]){"uno", "dos", "tres", "cuatro", ""});

Obviamente, como siempre, esto se puede modificar al gusto y necesidades de cada uno.

Un programa de prueba completo es este:
#include <stdio.h>

void func(char* str[]) {
    int i = 0;
    while(str[i][0] != '\0')
    printf("%s\n", a[i++]);
}

int main()
{
    func((char*[]){"uno", "dos", "tres", "cuatro", ""});
    return 0;
}


Ya me diréis que os parece  ;)