Estaba escribiendo código en C para simular la transmisión de un personaje de la uart. Estoy consiguiendo el título de error.

Código:

#include<stdio.h>
void transmit(char uart, char data[]){
   writeReg(uart,data);
      ......
       ......
}

void writeReg(char addr, char data[]){
  char* dataPtr = data;
  char* regPtr = (char*)addr;
  *regPtr = *dataPtr;  ........ This is where the error was thrown <bad ptr>
}

void main(){
   transmit(0x28,"1245");
}
  • El addr argumento de tipo char. Es este intencional? Parece dudosa.
  • Usted le dijo a escribir a la dirección de memoria 0 x 28,y le dijo a usted que usted no puede hacer eso. Que debería ser una pista
  • addr denota 8 bits de dirección y, por tanto, el tipo de datos char.
  • Yo quería declarar algunos de ubicación de la dirección representando una memoria asignada registro de la interfaz. Básicamente estoy tratando de enviar datos a un destino a través de la memoria asignada registro de la interfaz. Dirección de destino es de 8 bits. 0xx28 hexadecimal por lo tanto 8 bits. Quiero implementar transmitir función y probarlo sin necesidad de un hardware de destino. Por favor, sugiera.
InformationsquelleAutor user3833065 | 2014-07-12

3 Comentarios

  1. 5

    El código intenta escribir en la memoria en la ubicación 0x00000028. Esta dirección se encuentra en una región protegida de la dirección de espacio y no está permitido escribir (o leer) no. Por tanto, la infracción de acceso.

    Sus problemas comienzan aquí:

    char* regPtr = (char*)addr;

    addr es un char, y en su programa se tiene el valor 0x28. Usted, a continuación, tratar de que, como una dirección, y la consecuencia inevitable es la infracción de acceso.

    La razón por la que el compilador rechazado

    char* regPtr = addr;

    es que addr no es un char*. Simplemente casting no cambia ese hecho. Cuando usted se enfrenta con un error de compilación que usted no entiende, no intente emitir su camino más allá de ella. El paso 1 es siempre a entender el error.

    De su código hace ningún sentido real. No sé lo que intenta hacer, así que no puedo decir cuál es el código debe ser.

    • +1 en particular para el asesoramiento acerca de fundición. Si los tipos no coinciden, y no sé por qué, es probable que sea un error. Casting sólo permite alegremente ignorar que el error hasta que ya sea golpes en la cara o se convierte en todo un lío profano de moldes.
    • Gracias. El error fue arrojado al ejecutar el código. si no me conversión de tipo es. Yo no podía llegar addr valor de 8 bits de dirección. Me he referido en este enlace stackoverflow.com/questions/4166201/…
    • No creo que usted realmente entender mi comentario sobre el elenco. El reparto no hacer que tu código sea más válida. Sólo convierte un error de tiempo de compilación en un error en tiempo de ejecución. No se puede escribir a 0 x 28. No en windows.
  2. 2

    Usted está lanzando un carácter de valor a un puntero, que le da un puntero no válido.

    Tal vez quería hacer esta vez?

    char *regPtr = &addr;
    • No parece que el OP está tratando de escribir en addr. addr hecho que contengan algún tipo de dirección; no es una dirección de memoria.
    • se inicializa con el valor de addr, a continuación, se eliminan las referencias del LHS – que facilita la escritura a addr en mi libro.
    • Por qué me está diciendo que su mensaje se muestra para facilitar a hacer algo que el OP no quiere hacer?
    • Ah, la incomprensión – yo no estaba tratando de inferir una intención más allá de lo que he sugerido, porque no puedo ver claramente lo que es. Tienes razón que no probablemente es uno, pero la pregunta no es claro.
  3. 1

    Usted está tratando de escribir en el memory location que es no asignado a su programa.

    El programa debe cambiar los valores de la memoria contenida sólo para el espacio de direcciones asignado.

    Asignación de espacio de direcciones se realiza dinámicamente y siempre se debe utilizar la relativa ubicación de la memoria y no absoluta ubicación, como en su caso. Porque en relación de la localización de memoria cambiará de acuerdo con el espacio de direcciones asignado a su programa, pero la ubicación absoluta

    puede o no puede caer

    lo cual puede producir exceptions como lo hizo.

    • Para ser claros, hay casos donde las direcciones absolutas sentido-en un núcleo del sistema operativo, por ejemplo, usted es dueño de toda la máquina, así que usted puede poner las cosas donde quieras. Y algún sistema de cosas es a direcciones conocidas. Pero si usted está construyendo un núcleo, probablemente también entender punteros muy, muy bien. 🙂 Para que usted sepa cuando las reglas se pueden romper.
    • Eso es verdad 🙂 . Pero lo que he mencionado anteriormente son sólo las directrices.

Dejar respuesta

Please enter your comment!
Please enter your name here