Autor Tema: Duda sobre mapeado de variables en RAM  (Leído 2183 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado skm

  • PIC10
  • *
  • Mensajes: 8
Duda sobre mapeado de variables en RAM
« en: 03 de Julio de 2006, 20:09:34 »
Hola muy buenas!

No se si es el sitio adecuado para preguntar esto pero no se donde ponerlo sino.
Hace poco que he empezado simulando pics con proteus. Estoy haciendo un programa para un 18F4520. Su funcion es comunicarse con el puerto serie del ordenador. Resulta que utilizo muchas variables. El otro dia no me funcionaba una funcion que trabaja con una variable de tipo int. Observando bien con proteus paso a paso descubrir que una variable de tipo char string[n]  machacaba literalmente la posicion de memoria de la anterior variable tipo int. Como es posible esto??? es un error o esto puede pasar? el problema segun creo es que adjunte a la variable char string[n] un numero superior a n de caracteres y el resultado fue que sobreescribio las siguientes posiciones de memoria que en principo estaban mapeadas a otras variables. Finalmente solbente el problema definiendo las variables pequeñas antes que las grandes, de esta manera si me passo de caracteres machacaran posiciones libres de memoria.

Mi pregunta es: Esto es algo raro? es fallo de proteus? es fallo del PIC o simplemente (y como de costumbre) es fallo mio?

encontre este error un poco curioso ia que siempre habia creido que no tenia que preocuparme por las variables ya que suponia que el pic se ocupaba de administrarlas correctamente.

bueno muchas gracias ejje, perdon por el toston. A ver si alguien puede aclarame esta pequeña duda.
SkM

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Duda sobre mapeado de variables en RAM
« Respuesta #1 en: 03 de Julio de 2006, 23:38:41 »
Mi pregunta es: Esto es algo raro? es fallo de proteus? es fallo del PIC o simplemente (y como de costumbre) es fallo mio?

1) Si tu defines un string[10] y le escribes 14 caracteres... sobreescribirás la memoria que le sigue al string.  Esto te ocurrirá con un pic o con una PC.  Es un error básico de C

2) Si tu definiste un string[10] y ocupaste solo 8 bytes y te sobreescribió la ram... entonces es un problema del compilador (cosa que dudo)

Si pones el ejemplo será mas fácil de ayudarte


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado skm

  • PIC10
  • *
  • Mensajes: 8
Re: Duda sobre mapeado de variables en RAM
« Respuesta #2 en: 04 de Julio de 2006, 07:24:39 »
Gracias maunix, no sabia esto que comentas. No puedo poner el ejemplo porque como te digo cambie el programa y luego ia me funciono. Me queda una pregunta... quano declaras una string[] que hacen el compilador y el pic? tambien machacan posiciones de memoria?
SkM

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Duda sobre mapeado de variables en RAM
« Respuesta #3 en: 04 de Julio de 2006, 08:13:11 »
Gracias maunix, no sabia esto que comentas. No puedo poner el ejemplo porque como te digo cambie el programa y luego ia me funciono. Me queda una pregunta... quano declaras una string[] que hacen el compilador y el pic? tambien machacan posiciones de memoria?

Seguramente ;)

Además , el problema no es que el "compilador machaque posiciones", eres tu :) 

Eso lo debes tener muy en claro, no para achacarte culpas sino para poder ver la causa de lo que te ocurre y solucionar errores.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado skm

  • PIC10
  • *
  • Mensajes: 8
Re: Duda sobre mapeado de variables en RAM
« Respuesta #4 en: 04 de Julio de 2006, 11:07:28 »
Muchas gracias!

Hacia unos dias que ocurrian cosas raras con los strings jejeje ahora ia me ha quedado claro! Tendre que vigilar bien las variabes!

Un saludo!
SkM

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Duda sobre mapeado de variables en RAM
« Respuesta #5 en: 04 de Julio de 2006, 11:44:51 »
Como bien dice maunix si sobrepasamos las posiciones que ocupa el string escribimos en las posiciones adyacentes. Este efecto que es comun en todos los compiladores de "C" se conoce como "buffer overflow" y debe ser el programador el encargado de comprobarlo. En el mundo de los hackers este error se ha explotado sobremanera para producir la DoS "Denegación de Servicios" e inclusive para obtener una puerta de entrada a un ordenador. Por que "C" no comprueba el indice en los buffer, pues simplemente por eficiencia, el código corre mas deprisa si el compilador no hace esta comprobación, ya que en la mayoria de los casos no se produce rel desbordamiento del buffer y las instrucciones añadidas son innecesarias.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús