Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Работа с разделяемой памятью


Автор: denisovstas 21.5.2012, 13:48
Работа с разделяемой памятью. Программа в каждой строке матрицы выводить минимальный (Min), максимальный(Max) элементы. Дальше, эти элементы она соединяет в один и выводит как вектор ("Stroka"). С этим проблем нет, а вот с указателями и со structmem все время ошибки. 
Нужно вывести эту строку (min+max) используя указатель.


Код

#include <stdio.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>

struct mymem{
int e[4];
int y;
}  *mem_e;

int main(){
int k=4; n=5;
int l=8;
int min[k];
int max[k];
int e[k];
int b[k];
int c[k];
int x[4][5]={{2,3,4,7,0},{5,4,3,2,1},{5,6,7,8,3},{4,8,6,7,9}};
int i,j;

int shmid=shmget(IPC_PRIVATE,2,IPC_CREAT|0666);
  if(shmid<0){
    fprintf(stdout,"Error\n");
    return 0;    
  }
mem_e=(mymem*)shmat(shmid,NULL,0);
int pid;
pid=fork();
if(pid==0){
//Min
 for(i=0;i<k;i++)
 {
 min[i]=x[i][0];
 for (j=0; j<n;j++)
 {
 if (x[i][j]<min[i])
 min[i]=x[i][j];
 }}
 // Max
 for (i=0;i<k;i++){
 max[i]=x[i][0];
 for (j=0; j<n;j++)
 {
 if (x[i][j]>max[i])
 max[i]=x[i][j];
 }}
 // max+min
 for(i=0; i<k;i++)
 {
 b[i]=max[i];
 }
 for(i=0;i<k;i++)
 {
 c[i]=min[i];
 }
 for(i=0; i<l; i++){
 e[i]=(i<k?c[i]:b[i-k]);}
 mem_e->e[y]=e[i];
 }
 
 if (pid!=0){
 //Min
 for(i=0;i<k;i++)
 {
 min[i]=x[i][0];
 for (j=0; j<n;j++)
 {
 if (x[i][j]<min[i])
 min[i]=x[i][j];
 }}
 // Max
 for (i=0;i<k;i++){
 max[i]=x[i][0];
 for (j=0; j<n;j++)
 {
 if (x[i][j]>max[i])
 max[i]=x[i][j];
 }}
 // max+min
 for(i=0; i<k;i++)
 {
 b[i]=max[i];
 }
 for(i=0;i<k;i++)
 {
 c[i]=min[i];
 }
 for(i=0; i<l; i++){
 e[i]=(i<k?c[i]:b[i-k]);
 }
 mem_e->e[y]=e[i];
 }
 wait(NULL);
 //Vyvid massiva
 for(i=0; i<k;i++)
 {
 printf("\n";
 for(j=0; j<n;j++)
 { printf("x[%d][%d]= %d", i,j,x[i][j]);}
 }
 printf("\n");
 // Vyvod na ekran min
  for(i=0; i<k;i++) {
  printf("%d\n", min[i]);
  }
  // Vyvod na ekran max
  for(i=0; i<k;i++){
  printf("%d\n", max[i]);
  }
  
  //Vyvod max+min
  printf("Stroka\n");
  fprintf(stdout,"%d\n", mem_e->e[i]);
  }
  return 1;
  }

 

Автор: rsm 23.5.2012, 16:49
Для начала предлагаю добиться чтобы код хотя бы просто компилировался.

Автор: denisovstas 23.5.2012, 18:50
код уже компилируется, но прога выводит сообщение Error, то есть выполняется условие

Код

int shmid=shmget(IPC_PRIVATE,2,IPC_CREAT|0666);
  if(shmid<0){
    fprintf(stdout,"Error\n");
    return 0;   
  }


Обновленный код:

Код

#include <stdio.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
 
struct mymem{
int mas[4];
int i[4];
}  *mem_e;
 
int main(){
int k=4; n=5;
int l=8;
int min[k];
int max[k];
int e[k];
int b[k];
int c[k];
int x[4][5]={{2,3,4,7,0},{5,4,3,2,1},{5,6,7,8,3},{4,8,6,7,9}};
int i,j;
 
int shmid=shmget(IPC_PRIVATE,2,IPC_CREAT|0666);
  if(shmid<0){
    fprintf(stdout,"Error\n");
    return 0;   
  }
 
mem_e=(mymem*)shmat(shmid,NULL,0);
int pid;
pid=fork();
 
if(pid==0){
 
//Min
 for(i=0;i<k;i++)
 {
 min[i]=x[i][0];
 for (j=0; j<n;j++)
 {
 if (x[i][j]<min[i])
 min[i]=x[i][j];
 }}
 
 // Max
 for (i=0;i<k;i++){
 max[i]=x[i][0];
 for (j=0; j<n;j++)
 {
 if (x[i][j]>max[i])
 max[i]=x[i][j];
 }}
 
 // max+min
 for(i=0; i<k;i++)
 {
 b[i]=max[i];
 }
 for(i=0;i<k;i++)
 {
 c[i]=min[i];
 }
 
 for(i=0; i<l; i++){
 e[i]=(i<k?c[i]:b[i-k]);
 mem_e->mas[i]=e[i];}
 }
 
 if (pid!=0){
 
 //Min
 for(i=0;i<k;i++)
 {
 min[i]=x[i][0];
 for (j=0; j<n;j++)
 {
 if (x[i][j]<min[i])
 min[i]=x[i][j];
 }}
 
 // Max
 for (i=0;i<k;i++){
 max[i]=x[i][0];
 for (j=0; j<n;j++)
 {
 if (x[i][j]>max[i])
 max[i]=x[i][j];
 }}
 
 // max+min
 for(i=0; i<k;i++)
 {
 b[i]=max[i];
 }
 for(i=0;i<k;i++)
 {
 c[i]=min[i];
 } 
 for(i=0; i<l; i++){
 e[i]=(i<k?c[i]:b[i-k]);
 
 mem_e->mas[i]=e[i];}
 }
 wait(NULL);
 
 //Vyvod massiva
 for(i=0; i<k;i++)
 {
 printf("\n";
 for(j=0; j<n;j++)
 { printf("x[%d][%d]= %d", i,j,x[i][j]);}
 }
 printf("\n");
 
 // Vyvod na ekran min
  for(i=0; i<k;i++) {
  printf("%d\n", min[i]);
  }
 
  // Vyvod na ekran max
  for(i=0; i<k;i++){
  printf("%d\n", max[i]);
  }
  
  //Vyvod max+min
  printf("Stroka\n");
  fprintf(stdout,"%d\n", mem_e->mas[i]);
  }
  return 1;
  }

Автор: rsm 24.5.2012, 03:30
Цитата(denisovstas @  23.5.2012,  20:50 Найти цитируемый пост)
код уже компилируется

"Не верю!" © smile
Даже невооружённым глазом видно как минимум 4 критических ошибки синтаксиса, из-за которых код в принципе не может быть скомпилирован.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)