Foros > C++: segmentation fault

  1. juanolaya

    Mensajes [1] - Enviado el Viernes 08 de Mayo de 2009 a las 22:22hs

    En el siguiente codigo de c++ (en linux):

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include


    using namespace std;

    int **matriz_in;
    double **matriz_out;
    bool **matriz_verif;
    int limites[4][9];

    key_t ClaveOut;
    int idMemoriaOut;

    key_t ClaveIn;
    int idMemoriaIn;

    key_t ClaveVerif;
    int idMemoriaVerif;



    void inicializar_verif(bool **matriz_verif){
    for(int i=0; i<340; i++){
    for(int j=0; j<480; j++){
    matriz_verif[i][j]= false;
    }
    }
    }

    void cargar_datos(){
    ifstream entrada;
    entrada.open("matriz.txt");
    if (!entrada){
    cerr<<"Error al abrir el archivo: C:/Borland/prueba.txt";
    }
    char buffer[1500];
    for(int i=0;i<340;i++){
    entrada.getline(buffer, 1500);
    char *num= strtok(buffer, " ");
    matriz_in[i][0]= atoi(num);
    for(int j=1; j<480; j++){
    num = strtok(NULL, " ");
    matriz_in[i][j]= atoi(num);
    }
    }
    entrada.close();
    }

    void aplicar_filtro(int ini_x, int fin_x, int ini_y, int fin_y){
    int contador_i =1 ;
    int contador_j =1 ;

    for(int i=ini_x;i for(int j=ini_y; j if(matriz_verif[i][j]==false){
    if(contador_i==2 && contador_j==2){
    matriz_out[i][j]= matriz_in[i][j] * 0;
    }else{
    matriz_out[i][j]= matriz_in[i][j] * 0.125;
    }
    matriz_verif[i][j]=true;
    }
    contador_j++;
    if(contador_j==4) contador_j=1;
    }
    contador_i++;
    if(contador_i==4) contador_i=1;
    }
    }

    void guardar_datos(){
    ofstream salida("matriz_transformada.txt", ios::app);
    for(int i=170; i<340; i++){
    for(int j=0; j<480; j++){
    salida< }
    salida<<"
    ";
    }
    salida.close();
    }

    void asignar_limites(){
    limites[0][0]=170;
    limites[0][1]=228;
    limites[0][2]=0;
    limites[0][3]=162;
    limites[1][0]=170;
    limites[1][1]=228;
    limites[1][2]=160;
    limites[1][3]=322;
    limites[2][0]=170;
    limites[2][1]=228;
    limites[2][2]=320;
    limites[2][3]=480;
    limites[3][0]=226;
    limites[3][1]=284;
    limites[3][2]=0;
    limites[3][3]=162;
    limites[4][0]=226;
    limites[4][1]=284;
    limites[4][2]=160;
    limites[4][3]=322;
    limites[5][0]=226;
    limites[5][1]=284;
    limites[5][2]=320;
    limites[5][3]=480;
    limites[6][0]=282;
    limites[6][1]=340;
    limites[6][2]=0;
    limites[6][3]=162;
    limites[7][0]=282;
    limites[7][1]=340;
    limites[7][2]=160;
    limites[7][3]=322;
    limites[8][0]=282;
    limites[8][1]=340;
    limites[8][2]=320;
    limites[8][3]=480;
    }

    int main()
    {
    matriz_in = new int * [340];
    for (int i=0; i<340; i++)
    matriz_in[i] = new int [480];

    matriz_out = new double * [340];
    for (int i=0; i<340; i++)
    matriz_out[i] = new double [480];

    matriz_verif = new bool* [340];
    for (int i=0; i<340; i++)
    matriz_verif[i] = new bool [480];


    ClaveOut = ftok("/bin/more",59);
    if(ClaveOut==-1){
    cout<<"No consigo clave para memoria compartida OUT"< exit(0);
    }

    ClaveIn = ftok("/bin/lsmod",69);
    if(ClaveIn==-1){
    cout<<"No consigo clave para memoria compartida IN"< exit(0);
    }


    ClaveVerif = ftok("/bin/ls",3);
    if(ClaveVerif==-1){
    cout<<"No consigo clave para memoria compartida VERIF"< exit(0);
    }

    idMemoriaOut=shmget (ClaveOut, sizeof(double)*340*480, 0777 | IPC_CREAT);
    if(idMemoriaOut==-1){
    cout<<"No consigo clave para memoria compartida OUT1"< exit(0);
    }


    idMemoriaIn=shmget (ClaveIn, sizeof(int)*340*480, 0777 | IPC_CREAT);
    if(idMemoriaIn==-1){
    cout<<"No consigo clave para memoria compartida IN1"< exit(0);
    }


    idMemoriaVerif=shmget (ClaveVerif, sizeof(bool)*340*480, 0777 | IPC_CREAT);
    if(idMemoriaVerif==-1){
    cout<<"No consigo clave para memoria compartida VERIF1"< exit(0);
    }

    matriz_in = (int**)shmat (idMemoriaIn, (char*)0,0);
    if(matriz_in ==NULL ){
    cout<<"No se consiguio memoria compartida"< exit(0);
    }

    matriz_out = (double**)shmat (idMemoriaOut, (char*)0,0);
    if(matriz_out ==NULL ){
    cout<<"No se consiguio memoria compartida"< exit(0);
    }

    matriz_verif = (bool**)shmat (idMemoriaVerif, (char*)0,0);
    if(matriz_verif ==NULL ){
    cout<<"No se consiguio memoria compartida"< exit(0);
    }


    time_t start,end;
    double dif;
    pid_t pid[9];
    time (&start);
    asignar_limites();
    inicializar_verif(matriz_verif);
    cargar_datos();
    for(int i=0;i<9; i++){
    pid[i] =fork();
    if(pid[i]==0){
    aplicar_filtro(limites[i][0], limites[i][1], limites[i][2], limites[i][3]);
    }
    else if(pid<0){
    cerr << "Failed to fork" << endl;
    exit(1);
    }
    else {
    guardar_datos();
    time (&end);
    dif = difftime (end,start);

    shmdt ((double **)matriz_out);
    shmctl (idMemoriaOut, IPC_RMID, (struct shmid_ds *)NULL);

    shmdt ((int **)matriz_in);
    shmctl (idMemoriaIn, IPC_RMID, (struct shmid_ds *)NULL);

    shmdt ((bool **)matriz_verif);
    shmctl (idMemoriaIn, IPC_RMID, (struct shmid_ds *)NULL);

    cout<<"El tiempo es "< }
    return 0;
    }
    return 0;
    }

    me sale el error en tiempo de ejecucion: segmentation fault, las matrices matriz_in (int), matriz_out (double), y matriz_verif(bool) son de tama?o 340*480, el archivo de entrada contiene enteros de 0 a 15.

    Muchas gracias si alguien me puede colaborar


responder

Para poder responder a este tema tenes que ingresar. Si no tenes una cuenta podes registrarse gratis..

publicidad

API DE FACEBOOK
GOOGLE CALENDAR API
GOOGLE MAPS API