Mostrando entradas con la etiqueta matriz. Mostrar todas las entradas
Mostrando entradas con la etiqueta matriz. Mostrar todas las entradas

domingo, 28 de diciembre de 2014

Guardar matriz en Memoria Compartida

Ya sabemos que no se pueden almacenar punteros en memoria compartida (las direcciones de memoria son diferentes para diferentes procesos). Esto acarrea que no se puedan crear vectores multidimensionales de la manera "tradicional" ( int ** ). 
La solución esta en emular las matrices al puro estilo de malloc (método index magic)

Supongamos que queremos declarar una matriz de enteros de 5x5 en memoria compartida.

El tamaño de la memoria será: el tamaño del tipo de dato multiplicado por la cantidad de columnas y la cantidad de filas.

int id_Memoria = shmget (key,sizeof(int) * 5 * 5, 0777 | IPC_CREAT);



Ahora para acceder a la memoria sería:

// nCol = Cantidad de columnas de la matriz
matriz[x][y] ----> matriz[y * nCol + x];



Ejemplo con código:



  1. int nFil = 5; // numero de filas
  2. int nCol = 5; // numero de columnas
  3. int row, column;
  4. int *matrix;
  5.  
  6. // Crea el segmento de memoria compartida
  7. id_shmem = shmget(ipc_key, sizeof(int)*nFil*nCol, IPC_CREAT|0777); 

  8. matrix = (int *)shmat(id_shmem, 0, 0);
  9.  
  10. matrix[3*nCol + 2] = 1; // Equivalente a matrix[2][3]   


Links: 

http://stackoverflow.com/questions/1961504/is-it-possible-to-allocate-a-2d-array-as-shared-memory-with-ipc

lunes, 30 de diciembre de 2013

Imprimir matrices y formas en C/C++ con Dev-C++ y WinBGIm

Primero debes configurar Dev-C++ para trabjar con WinBGIm. Para ello debes

1 - Descargar graphics.h y pegarlo en el directorio "include" de Dev-C++.
     Por defecto es C:\Dev-Cpp\include




2- Descargar libbgia y pegarlo en el directorio "lib" 
Por defecto es C:\Dev-Cpp\lib


3- Entrar en Herramientas / Opciones del Compilador

4- En el text area del linker copiar lo siguiente:
-lbgi
-lgdi32
-lcomdlg32
-luuid
-loleaut32
-lole32



Aceptas y ya debe estar configurado.

Ahora un pequeño ejemplo de impresión una matriz columna por columna. Cosa que no se puede hacer con printf que imprime fila por fila


#include <graphics.h>

int main( )
{
    // Inicia un cuadro de 400x300 caracteres
    initwindow(400, 400, "Ejemplo Matriz");
    
    int n=10; // Cantidad de columnas de la matriz
    int m=10; // Cantidad de filas de la matriz
    char matriz[n][m];    
    memset((void*)matriz,48,sizeof(char)*m*n); // Limpa la zona de memoria 
    char  caracter_puntual[2]={0,'\n'}; // Caracter específico de la matriz
        
    for (int x=0; x < n ; ++x )
    {       
            // Imprime la columna
            for (int y=0; y < m ; ++y )
            {
                caracter_puntual[0]=matriz[x][y];
                // Imprime el valor x,y de la matriz
                outtextxy(x*20,y*20,caracter_puntual);
            }            
            delay(200);
            
    }    
    getchar();    
    return 0;
}



Otro ejemplo. Impirmiendo un circulo:

#include <graphics.h>

int main( ){    initwindow(400, 300, "First Sample");    circle(100, 50, 40);    while (!kbhit( ))    {        delay(200);    }    return 0;}




Otro Ejemplo: Imprimiendo letras con colores:

#include <winbgim.h>

void waitForLeftMouseClick();

int main()
{
    initwindow(700,300); 
    settextstyle(0,0,2);
    setcolor(RED);
    outtextxy(100,100,"WELCOME TO CÓDIGO INFORMÁTICO");
    setcolor(GREEN);
    outtextxy(280,130,"INFO - UNT");

    // while(!kbhit()); // wait for user to press a key
    waitForLeftMouseClick(); 

    closegraph();        //close graphics window
    return 0;
}

void waitForLeftMouseClick()
{
    clearmouseclick(WM_LBUTTONDOWN);
    const int DELAY = 50; 
    int x, y;
    while (!ismouseclick(WM_LBUTTONDOWN))
        delay(DELAY);
    getmouseclick(WM_LBUTTONDOWN, x, y);
}

La documentación oficial está en esta pagina:

http://www.cs.colorado.edu/~main/bgi/