|
|
|||||||||||||||||||||||||||||||||||||||||||||||||
Who the Hell...?!motagirl2, la culpable de todo esto¿De qué va esto?Temas
¿Más cosas interesantes?Elementos compartidos de motagirl2Quiero estar al dia!- Subscribirme usando mi agregador de noticias ^^- No, gracias, prefiero recibir un mail cuando haya nuevos artículos ;) ¿Dónde está mota?En Anime-Planet En Anobii En Bloglines En Blogspot En DailyMotion En DeviantArt En DinoParc En El Bruto En Facebook En Flickr En Fotolog En GoEar En Hammerfest En Jisko En LastFM En MySpace En Naturalquimia En Orkut En Technorati En Tuenti En Twitter En Wordpress En YouTube Reglas y consejos para apostar a las tragaperras en tu web de casinos de internet
|
Hace un par de días sufrí en propias carnes algo que nadie jamás me había explicado hasta ese momento: La diferencia entre los punteros near y los punteros far. Resulta que un puntero far ocupa cuatro bytes porque guarda el segmento (2bytes) y el offset (otros 2bytes), mientras que un puntero near sólo ocupa dos bytes porque sólo guarda el offset.¿Qué significa esto? Que con un puntero near NO puedes acceder a otro segmento distinto al que estás usando. Curioso... (Para los que no sepan de qué hablo: un puntero es mas o menos como una variable, pero en vez de guardar un valor (’2’, ’3’, "patata") guarda otra dirección de memoria (04E6,0000 por ejemplo)). Otra cosa importante es el modelo de memoria elegido. Esto representa el modelo de "cómo" accederá a memoria el compilador. En TurboC podemos elegir entre Tiny, Small, Medium, Compact, Large y Huge. Estos se diferencian en los tamaños de los segmentos de código, datos y pila, y en el tipo de los punteros. Podría explicarlo en modo texto pero se ve más claro en una tabla: 1Mb Por ejemplo, el modelo Medium se utiliza para programas pequeños que utilizan pocos datos, al contrario que el Compact, que es usado para programas pequeños que utilizan gran cantidad de datos. Como ejemplo de lo "importante" (pasad por alto la trivialidad del programa de ejemplo xD) que puede llegar a ser esto (habérmelo leído antes me hubiera ahorrado una tarde de programas con comportamientos erráticos), os expongo el ejemplo que me trajo de cabeza a mí. Resulta que el compilador que usamos para esta asignatura, Borland TurboC (sí, algo actual y todo eso) sobre MS-DOS (idem) viene por defecto con el model Small. Y claro, para esto necesitabamos como mínimo Compact (aunque vamos de sobraos y lo recomendado era Huge) El programa en cuestión consiste en acceder a la memoria de video y escribir directamente en ella para crear un rectángulo con un carácter y todas las variantes de color de carácter y color de fondo. El acceso a la memoria se realiza mediante un puntero, tal que así: char *p = MK_FP(0xB800, 0x000) donde MK_FP indica que queremos un puntero far (FP,Far Pointer) y 0xB800, 0x0000 indica el inicio del segmento 0xB800, que es el de video. Así que, nos ponemos manos a la obra y compilamos/enlazamos/ejecutamos con varios modelos de memoria (esto se puede cambiar desde Options/Compiler/Model en el TurboC) -Tiny, Small y Medium: Los "efectos" son variados, desde un warning al compilar ("Conversión sospechosa de puntero"), warning al enlazar ("No hay pila"), error al ejecutar ("Instrucción no permitida") hasta autoabortos: Bueno, al menos no me salta el antivirus como hace un par de años xD -Compact, Large y Huge: Ahora sí que se está accediendo al segmento "bueno" por ser un puntero far, y el resultado es justo el que esperábamos: ¿A que es mono? Pues casi lagrimeo un poco cuando descubrí que mi código era bonito y maravilloso pero que el error estaba en el modelo de memoria elegido. Ahora seguro que ya no se me vuelve a olvidar :D |
||||||||||||||||||||||||||||||||||||||||||||||||