Programación General > C/C++

 Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP

(1/1)

TSW:
Hola señores , que tal ? les cuento:

Estoy haciendo un programa , ya lo tengo hecho , pero me falta la ultima parte, la mas importante.
El programa lo estoy haciendo un TURBO C++ 3.0 con una máquina antigua, Pentium 166 MMX y usando MSDOS 7.1 . Tengo ese PC para aprendizaje de ciertas cositas que los Sistemas Operativos de hoy en dia no te dejan aprender. Bueno , al grano:  

He hecho un cargador de BitMap,( carga imagánes bmp ) pero el problema es que voy leyendo y mostrando directamente en la video memoria, por lo tanto, voy viendo como carga la imagen. Es un proceso lento.

Segun he leido, lo que debo hacer es un doble buffer, o pantalla virtual, lo que haces es cargar los datos ahi ,y luego volcarlos a la video memoria. Eso se hace con malloc(), farmalloc(), o incluso llamando a la INT 21 Función 48 ( Asignar parrafos de memoria ). Lo que pasa es que hago esto y siempre se me cuelga el PC
Incluso usando INT 21 me dice que tengo poca memoria. Cosa que no es verdad.

Vamos , que no se como usar farmalloc, ni calloc, malloc ...y esa es mi duda.




--- Código: C++ ---  #include <graphics.h>#include <iostream.h>#include <stdio.h>#include <stdlib.h>   //LIBRERIAS#include <conio.h>#include <string.h>#include <dos.h>#include <math.h>#include <alloc.h>#include <malloc.h>#include <mem.h> main(){    clrscr();    int far *array;    array = (int far *) farmalloc(64000);do      {           array[contador] = 1;           contador = contador + 1;      }while(contador<=64000); }  
Cuando lo ejecuto se me cuelga el ordenador, ¿Por qué? Supuestamente no esta creado un espacio de memoria de 64000 bytes??¿?¿
¿Qué estoy haciendo mal? Porque la verdad que estoy desesperado.


Si alguien quiere usar el codigo para probarlo. Puede hacerlo creando un bmp con el paint y guardandolo como 256 colores ( guardar como ... 24 bits... 8 bits ... ) aunque probablemente lo vea mal , de hecho yo hice el bmp en Corel Draw 4.0 ( 1994 ) , me carga los bmp correctamente, ahora en un Paint normal , falla.


Tambien funciona en WINDOWS XP


--- Código: C++ --- //BITMAP LOADER BY TSW 2011.//PROGRAMADOR : Gabriel González González//E-MAIL : gabrielgg85@gmail.com//AGRADECIMIENTOS A MIGUEL Y A BOB (Canadá ) POR SU AYUDA//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#include <graphics.h>#include <iostream.h>#include <stdio.h>#include <stdlib.h>   //LIBRERIAS#include <conio.h>#include <string.h>#include <dos.h>#include <math.h> informacion(); //subprograma cabecera main(){//SUBPROGRAMA INFORMACION     clrscr();    cout << "BITMAP LOADER 1.0 BY TSWn";     char *fil = "c:\nuevo1.bmp"; //aquí la ruta de tu archivo, no olvides poner DOBLE BARRA \ ,te recomiendo ponerlo en c: raiz el archivo.    FILE *archivo;    archivo = fopen(fil,"rb"); //binario     if(archivo == NULL )    printf("ERROR GRAVE !!! NO SE HA PODIDO ABRIR EL ARCHIVO!!!n");    if (archivo)        printf("ARCHIVO ABIERTO CON XITO !!!n"); cout << "Ruta de Archivo " << fil ;cout << "n---------------------------------------n";cout << "INFORMACIàN DE CABECERA ARCHIVO BMP n";cout << "---------------------------------------n"; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ long tamano;long offset;long ancho;       //nombro variableslong alto;int planos;int bpp;long compresion;long tamanoBmpPixel;long NumColores;char tipo[1]; //Tipo BMP ( Microsoft,OS/2...) tamano = 0;offset = 0;ancho = 0;       //inicializo variables para que no tomen valores extra¤osalto= 0;planos= 0;bpp= 0;compresion= 0;tamanoBmpPixel= 0;NumColores= 0;  fseek(archivo,0L,SEEK_SET); //Tipo de bmp   fread(tipo,1,2,archivo);   printf("þ     Tipo de BMP   = %s n",tipo);//   rewind(archivo); fseek(archivo,2L,SEEK_SET); //---tama¤o archivo bmp     fread(&tamano,1,4,archivo);     printf("þ     Tama¤o de BMP = %lu Bytesn",tamano); fseek(archivo,10L,SEEK_SET); //----offset archivo     fread(&offset,1,4,archivo);     printf("þ     Offset BMP    = %d (Datos im gen empiezan en este byte)n",offset);  fseek(archivo,18L,SEEK_SET); //----ancho archivo    fread(&ancho,1,4,archivo); //guardo en &ancho, 1 registro de 4 bytes.    printf("þ     Ancho de BMP  = %dn",ancho); fseek(archivo,22L,SEEK_SET); //----alto bmp    fread(&alto,1,4,archivo);    printf("þ     Alto de BMP   = %dn",alto); fseek(archivo,26L,SEEK_SET); //----numero de planos    fread(&planos,1,2,archivo);    printf("þ     Numero de planos BMP = %dn",planos); fseek(archivo,28L,SEEK_SET); //----bit por pixel ( 256 colores 8 bit)    fread(&bpp,1,2,archivo);    printf("þ     Bit por pixel (BPP) = %dn",bpp); fseek(archivo,30L,SEEK_SET); //----compresion archivo bmp    fread(&compresion,1,2,archivo);    printf("þ     ¨Existe compresi¢n? (0->NO) = %dn",compresion); fseek(archivo,34L,SEEK_SET); //---cantidad en pixel    fread(&tamanoBmpPixel,1,4,archivo);    printf("þ     Tama¤o im gen %lu pixelesn",tamanoBmpPixel); fseek(archivo,46L,SEEK_SET); //--- numero colores bmp    fread(&NumColores,1,4,archivo);    printf("þ     N£mero de colores de im gen %dn",NumColores); cout << "n";cout << "PULSE UNA TECLA PARA MOSTRAR EL BMP EN PANTALLA";getch(); long  rojo,verde,azul,contador;long  dato,cuenta_colores;long  valorLetra;int   valor;    //con INT SALE MAS COLOR original CHARint r,v,a,c;r = 0; v= 0; a= 0; c= 0;valor = 0;valorLetra = 0;cuenta_colores = 0;contador  =  0;dato      =  0;     asm{      mov ah,0      mov al,13h      int 10h    }      fseek(archivo,54L,SEEK_SET); //--- numero colores bmp ( Cargo Paleta Colores )    do       {         outportb(0x3c8,cuenta_colores);        fread(&valor,1,1,archivo);           valorLetra = valor;           azul = abs(valorLetra /4);   //falta poner valor ascii           valorLetra = 0;           a = azul;         fread(&valor,1,1,archivo);          valorLetra = valor;          verde = abs(valorLetra/4 );          valorLetra = 0;          v = verde;         fread(&valor,1,1,archivo);           valorLetra = valor;           rojo = abs(valorLetra/4 );           valorLetra = 0;           r = rojo;         fread(&valor,1,1,archivo);        valorLetra = 0;        cuenta_colores = cuenta_colores + 1;          outportb(0x3c9,r);         outportb(0x3c9,v);         outportb(0x3c9,a);        }     while(cuenta_colores <= 255);    getch();     do        {        fseek(archivo,1078L+contador,SEEK_SET);   //Aquí vuelvo a video memoria. Lo que quiero hacer es guardar esos datos en un array de 63779        fread(&dato,1,1,archivo);        //elementos y luego volcarlo a la video memoria, pero no se como hacerlo.        pokeb(0xa000,contador,dato); // Muestra en video memoria.        contador = contador + 1 ;        }    while (contador <=63779);     getch();      asm{    mov ah,0    mov al,02h          //vuelvo a pantalla modo texto    int 10h    } return(0);}   

sergio__:
HnoTpuedoTpegarPlink://es.kioskea.net/c ... t-bmp.php3

Leete eso, ahi te ayuda bastante porq tenes bien como es el formato del bmp, al principio esta toda la metadata, es mas facil levantar los structs, y despues pedir en el buffer memoria necesaria para la imagen en si

no te conviene leer del archivo de a 1 byte porq te lo hace muy ineficiente, el acceso a disco es lo que mas tarda

en el codigo que pusiste donde usas el farmalloc ,el farmalloc no lo use nunca yo, pero asumo que no debe ser muy distinto del malloc, no te esta andando porq vos definis un arreglo de 64000 bytes, pero tu arreglo es del tipo entero, cada entero son 4 bytes, es decir, cuando incrementas el indice en el arreglo avanzas de a 4 bytes, no de a uno, entonces llegas a pisar memoria no permitida

tendrias que hacer asi

int * arreglo =(int*) malloc(sizeof(int)*64000);  --> con esto allocas espacio para 64000 enteros, que es 64000*4 bytes
sino
char* arreglo= (char*)malloc(sizeof(char)*64000); --> con esto allocas espacio para 64000 chars, que como cada char pesa 1 byte son 64000bytes


creo que ese es tu error, no lo puedo probar aca porq no tengo un compilador de C en esta pc

Navegación

[0] Índice de Mensajes

Ir a la versión completa