Anuncios Google

Funciones

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


Be Libre my Friend.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de OdnetninI

Gracias a todos por las

Gracias a todos por las respuestas pero ya no hace falta

Imagen de joserc87

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!


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Almamu

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.


Imagen de joserc87

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:

unsigned char *memset(unsigned char *dest, unsigned char val, int count)
{
    char* char_src = (char *)val;
    ...
}

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

return (unsigned short*)char_src;
// O bien simplemente
return char_src;

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!


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Almamu

Para el memcpy no necesitas

Para el memcpy no necesitas tantas vueltas:

void memcpy(uint8_t *dest, const uint8_t *src, uint32_t len)
{
  for(; len != 0; len--) *dest++ = *src++;
}

Para el memset más de lo mismo

void memset(uint8_t *dest, uint8_t val, uint32_t len)
{
  for ( ; len != 0; len--) *dest++ = val;
}

int strlen(char *src)
{
  int i = 0;
  while (*src++)
    i++;
  return i;
}

Estas son las typedef de los tipos que uso( es decir, los tipos uint8_t, etc ):

typedef unsigned int   uint32_t;
typedef          int   int32_t;
typedef unsigned short uint16_t;
typedef          short int16_t;
typedef unsigned char  uint8_t;
typedef          char  int8_t;

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.


Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.