Asesoramiento en la resolución de UD en funciones de gestión de bajo nivel

Soy bastante nuevo en C y comencé a escribir una pequeña biblioteca con funcionalidad para obtener la longitud de cadenas, invertir cadenas, convertir datos binarios en búfer de caracteres a ints y cortos. Solo por el bien de la educación y para comprender mejor las funciones de bajo nivel que ya están disponibles en string.h, etc.

El problema es que los errores que tengo son aleatorios hasta cierto punto. Tengo 4 funciones:

  • getStringLength (Obtiene la longitud de una cadena)
  • reverseString (Invierte una cadena usando el reemplazo de XOR y usando getStringLength para obtener la longitud)
  • charsToUShort (Convierte un puntero de matriz de caracteres con dos bytes (sin contar el término nulo) de datos binarios en un corto sin firmar)
  • charsToUInt (Convierte un puntero de matriz de caracteres con cuatro bytes (sin contar el término nulo) de datos binarios en un int sin signo)

Básicamente, ocurre un problema cuando pruebo todas estas funciones en mi función principal. Cuando se utilizan todas las funciones, el iterador en reverseString que irá desde 0 a length / 2 se establece como 32767. Entonces, básicamente, cuando la inversión de la cadena se itera, el ciclo ni siquiera comienza ya que el iterador es 32767. A pesar de que se inicializa como 0. Si solo uso 3 de estos para funciones, por ejemplo, si elimino charsToUInt en mi función principal, todo funciona como se esperaba.

La pregunta principal

  • ¿Qué consejo tienes para solucionar un problema como este?
  • ¡Todos los demás consejos también son bienvenidos!

Código propenso a errores para aclarar

getStringLength:

unsigned int getStringLength(char *str){
    unsigned int i = 0;

    while(str[i]){
        i++;
    }

    return i;
}

reverseString:

void reverseString(char *str){
    int i, m = 0;
    unsigned int l = getStringLength(str);

    m = l >> 1;

    while(i < m){
        str[i] ^= str[l - 1];
        str[l - 1] ^= str[i];
        str[i] ^= str[l - 1];
        i++;
        l--;
    }
}

charsToUShort:

unsigned short charsToUShort(char *str){
    unsigned int l = getStringLength(str);
    unsigned short result = 0;

    if(l != 2){
        return 0;
    }else{
        result |= str[0] << 8;
        result |= str[1] << 0;
        return result;
    }
}

charsToUInt:

unsigned int charsToUInt(char *str){
    unsigned int l = getStringLength(str);
    unsigned int result = 0;

    if(l != 4){
        return 0;
    }else{
        result |= str[0] << 24;
        result |= str[1] << 16;
        result |= str[2] << 8;
        result |= str[3] << 0;
        return result;
    }
}

Prueba de salida para aclarar

Aquí está el resultado de la prueba con resultado de error:

0: reverseString failed! Expected value: 'olleH', actual value: 'Hello'
1: charsToUShort passed! Expected value: '0x6261', actual value: '0x6261'
2: charsToUInt passed! Expected value: '0x62616364', actual value: '0x62616364'

Y aquí está el resultado esperado:

0: reverseString passed! Expected value: 'olleH', actual value: 'olleH'
1: charsToUShort passed! Expected value: '0x6261', actual value: '0x6261'
2: charsToUInt passed! Expected value: '0x62616364', actual value: '0x62616364'

preguntado el 16 de mayo de 11 a las 18:05

Yo personalmente recomendaría usar los tipos uint16_t y uint32_t más bien que short y int, porque los tamaños son más obvios y no cambian entre arquitecturas. -

@shart ¡Gracias por el consejo! Examinaré uint16_t y uint32_t y leeré sobre los cambios de tamaño de letra en las arquitecturas. -

1 Respuestas

Tu código solo establece m a cero, i se deja sin inicializar, quieres int i = 0, m = 0;, de lo contrario, el bucle nunca ejecutará una sola iteración

contestado el 16 de mayo de 11 a las 22:05

Sí, ese era el problema exacto. Ni siquiera pensé en esa dirección ya que el problema apareció de forma bastante aleatoria. ¡Gracias por prestarme su aguda vista! ^^ - rzetterberg

@Ancide: si alguna vez te encuentras con errores divertidos como este, siempre es una buena idea aumentar la verbosidad de advertencia del compilador, te advertirá de cosas como esta :) - Necrolis

¡Sin duda lo haré la próxima vez! Gracias de nuevo - rzetterberg

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.