Buenas amigos:
estoy haciendo unas pruebas para iniciarme en el hardware del pc, pero resulta que el tutorial que sigo me dice que busque dirtas funciones, resulta que las busqué y encontré pero luego me dan error.
Estas son las funciones que me pide, pongo tambien el code que encontré.
Y el codigo con el que luego dice que es incompatible, osea esas funciones las compila, pero luego al hacerlas funcionar no:
/* You will need to code these up yourself! */ unsigned char *memcpy(unsigned char *dest, const unsigned char *src, int count) { char *char_dest = (char *)dest; char *char_src = (char *)src; if ((char_dest <= char_src) || (char_dest >= (char_src+count))) { /* non-overlapping buffers */ while(count > 0) { *char_dest = *char_src; char_dest++; char_src++; count--; } } else { /* overlaping buffers */ char_dest = (char *)dest + count - 1; char_src = (char *)src + count - 1; while(count > 0) { *char_dest = *char_src; char_dest--; char_src--; count--; } } return dest; } unsigned char *memset(unsigned char *dest, unsigned char val, int count) { char* char_src = (char *)val; while(count>0) { *char_src = val; char_src++; count--; } return char_src; } unsigned short *memsetw(unsigned short *dest, unsigned short val, int count) { char *char_src = (char *)val; while(count>0) { *char_src = val; char_src++; count--; } return (unsigned short)char_src; } int strlen(const char *str) { const char * s; if(str == 0) return 0; for(s = str; *s; ++ s); return s - str; }
Lineas en las que da fallo:
memcpy (textmemptr, textmemptr + temp * 80, (25 - temp) * 80 * 2); memsetw (textmemptr + (25 - temp) * 80, blank, 80); memsetw (textmemptr + i * 80, blank, 80);
espero no haberme saltado nada,
Gracias
Gracias a todos por las
Gracias a todos por las respuestas pero ya no hace falta
No tiene nada que ver
Si miras la salida del "cmd", al intentar compilar el scrn.o te da un error en la lina 151 (función settextcolor) de scrn.c: "parse error before }". Debido a ese error no se crea scrn.o, por lo que cuando intentas hacer el ld te dice que falta el scrn.o.
Revisa scrn.c. Lo más probable es que te falte un ; o un ) o algo así.
Saludos!
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Me parece que a lo que se
Me parece que a lo que se refiere con las Funciones es a las warnings más que nada. Esas funciones no funcionarán bien si hay Warnings por punteros incompatibles, por mucho que compile bien, ya que se salta los argumentos el mismo compilador. De todas formas tambien está el error, que no me dí cuenta, xD.
Cierto.
No me había dado cuenta de que el código tiene fallos. A lo mejor funcionaría con warnings de punteros incompatibles, pero lo que tiene son errores algo más gordos.
Para empezar, en memset, la primera linea, estás convirtiendo un caracter a puntero a caracter. Además, estás intentando escribir en val (o en la dirección que indica val¿?), en lugar de en dest y dest no lo usas para nada. En todo caso sería:
aunque en cualquier caso no le veo el sentido a cambiar el unsigned char a char, pero bueno.
En memsetw, pues 3 cuartas partes de lo mismo, aunque además en el return te falta un asterisco (o quitarle el casting):
Esos son los warnings de las funciones que has puesto, aunque como ya te dije, tienes más warnings y errores en scrn.c. Puedes corregir las funciones como te indico, o puedes usar las de AlmamuPP, que a viista rápida están correctas y son algo más cortas :). Simplemente te pongo los errores que tienen las que has puesto, para que aprendas y por si tienes curiosidad.
Saludos!
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Para el memcpy no necesitas
Para el memcpy no necesitas tantas vueltas:
Para el memset más de lo mismo
Estas son las typedef de los tipos que uso( es decir, los tipos uint8_t, etc ):
Yo no devulvo valor ni en memcpy ni en memset, no lo veo necesario de la forma que las tengo escritas.
Al ser punteros lo que mandas a las funciones puedes cojer cosas como la longitud, el caracter actual y tal recorriendo los punteros con *variable++; de una manera sencilla, mientras programes un kernel los usarás bastante, ten eso en cuenta. Además, la funcion memsetw la veo un poco inutil, de todas formas, si te hace falta cambia los unsigned char por unsigned short y prueba.