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
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"<
}
ClaveIn = ftok("/bin/lsmod",69);
if(ClaveIn==-1){
cout<<"No consigo clave para memoria compartida IN"<
}
ClaveVerif = ftok("/bin/ls",3);
if(ClaveVerif==-1){
cout<<"No consigo clave para memoria compartida VERIF"<
}
idMemoriaOut=shmget (ClaveOut, sizeof(double)*340*480, 0777 | IPC_CREAT);
if(idMemoriaOut==-1){
cout<<"No consigo clave para memoria compartida OUT1"<
}
idMemoriaIn=shmget (ClaveIn, sizeof(int)*340*480, 0777 | IPC_CREAT);
if(idMemoriaIn==-1){
cout<<"No consigo clave para memoria compartida IN1"<
}
idMemoriaVerif=shmget (ClaveVerif, sizeof(bool)*340*480, 0777 | IPC_CREAT);
if(idMemoriaVerif==-1){
cout<<"No consigo clave para memoria compartida VERIF1"<
}
matriz_in = (int**)shmat (idMemoriaIn, (char*)0,0);
if(matriz_in ==NULL ){
cout<<"No se consiguio memoria compartida"<
}
matriz_out = (double**)shmat (idMemoriaOut, (char*)0,0);
if(matriz_out ==NULL ){
cout<<"No se consiguio memoria compartida"<
}
matriz_verif = (bool**)shmat (idMemoriaVerif, (char*)0,0);
if(matriz_verif ==NULL ){
cout<<"No se consiguio memoria compartida"<
}
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