El compilador te muestra que errores tienes. Deberías darle un vistazo.
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úCita de: RayR en 8 Abril 2019, 01:20 AMAh, ¡esos condenados break! siempre me pasa, y por más que reviso el código siempre se me cola uno
Ese error se debe a que te falta un break para el case 'x' (y ya que estamos, para el case '%').
int kputs(const char *fmt, ...) {
/* Empty string sanity test */
if (!fmt)
return 0;
char buffer[1024] = {0};
va_list args;
size_t cout;
unsigned int* charc;
va_start(args, fmt);
for (cout = 0; cout < strlen(fmt); ++cout) {
switch (fmt[cout]) {
case '%':
switch (fmt[cout + 1]) {
case 'c':
charc = (char)va_arg(args, int);
putch(charc);
++cout;
break;
case 's':
charc = va_arg(args, char *);
strcpy(buffer, (const char*) charc);
print_string(buffer);
++cout;
break;
case 'i':
charc = va_arg(args, int);
itoa(charc, buffer, 10);
print_string(buffer);
++cout;
break;
case 'X':
case 'x':
charc = (char)va_arg(args, int);
itoa(charc, buffer, 16);
print_string(buffer);
++cout;
case '%':
putch("%");
++cout;
default:
va_end(args);
return 1;
}
break;
default:
putch(fmt[cout]);
break;
}
}
va_end(args);
return cout;
}
Cita de: CalgaryCorpus en 7 Abril 2019, 01:13 AMGracias, pero aún así no me funciona, mismo problema.
Tienes que variar el tipo del segundo parametro de va_arg.
Tu solo usas unsigned int (o int) y deberias usar el tipo que calce con el % que se pasa.
Mira el ejemplo al final de aqui: https://linux.die.net/man/3/va_arg
kputs("r8: %x r9: %x r10: %x", r->r8, r->r9, r->r10);
r8: b8000└
int kputs(const char *fmt, ...) {
/* Hacer nada si la cadena esta vacia. */
if (!fmt)
return 0;
char buffer[1024] = {0};
va_list args;
size_t cout;
unsigned int* charc;
va_start(args, fmt);
for (cout = 0; cout < strlen(fmt); ++cout) {
switch (fmt[cout]) {
case '%':
switch (fmt[cout + 1]) {
case 'c':
charc = va_arg(args, unsigned int);
putch(charc);
++cout;
break;
case 's':
charc = (int*) (va_arg(args, unsigned int));
strcpy(buffer, (const char*) charc);
print_string(buffer);
++cout;
break;
case 'i':
charc = va_arg(args, int);
itoa(charc, buffer, 10);
print_string(buffer);
++cout;
break;
case 'X':
case 'x':
charc = va_arg(args, int);
itoa((unsigned)charc, buffer, 16);
print_string(buffer);
++cout;
case '%':
putch("%");
++cout;
default:
va_end(args);
return 1;
}
break;
default:
putch(fmt[cout]);
break;
}
}
va_end(args);
return cout;
}