Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2014, 06:21   #1
XyLigAnD
Новичок
Джуниор
 
Регистрация: 08.06.2013
Сообщений: 1
По умолчанию Что делает строка

Имеется код программы, записывающий битовую карту.
Не знаю, что выполняет строка из кода, а необходимо ее объяснить преподу. Строка *pr|=01<<(bit_r); находится на 68 строке.
Помогите, пожалуйста)

Код:
static int b=104857600; /* Размер /dev/sda1 */
struct timeval T;
FILE *log_out,*log_out2;
time_t t_start, t_finish;
static int from_root[2];
static int to_root[2];

int check(void *str,int n,int coun)
{int i,l,ostat,size;
  long double *p;
  p=(long double *) str;
  if(((size=sizeof(long double)) ==64))  l=n/8;
  //else if (n%i) {return -1; }
	else {l=n/size;
              ostat=n%size;}
  for (i=0; i<l; i++)
       { 
		/*fprintf(log_out2,"\n%d %f \n",coun,p[i]);*/
		if (*p++ !=0) {/*  fprintf(log_out2,"Exit because %f ",p[i]); */ return 1;}
		}
	if (ostat!=0) {char * sp;
							int smeshenie=size*l;
	                       sp=(char *) str;
	                       sp=sp+smeshenie;
	                       for (i=smeshenie;i<n;i++)
	                       if (*sp++ !='\0') {return 1;}
					  }	
	return 0;
	}   
void process(int rank, int p)
{	int fd;
	FILE *out;
	int BLOCKSIZE=512;
	fd = open ("/dev/sda1", O_RDONLY);
	char s[10]="";
	sprintf(s,"./a%d",rank+1);
	out = fopen (s, "wb");
	char byte;
	int len = b/p;
	int ost= b%p;
	int local_a = rank*len;
	int local_b = local_a + len;
	if (ost!=0) {local_b=local_b+ost;}
	
	int i=0,j;
	if(lseek(fd, local_a,0)==-1L)
		printf("Seek Error\n");
   
	int ostatok=(local_b-local_a)%(BLOCKSIZE);
	int num=(local_b-local_a)/(BLOCKSIZE); 
	
	char *bmap,*pr;
	char bit;
	if (ostatok==0) {bmap=calloc(num/8,1);}
		else {bmap=calloc(num/8+1,1);}

	char ch[BLOCKSIZE];
	for (i=0;i<BLOCKSIZE;i++) ch[i]='\0';
	
	
pr=bmap;	
int bit_r;	
	for (i=0;i<num;i++)
	{	bit=i%8;
        bit_r=7-i%8; 	    
	 	if (read (fd, &ch, BLOCKSIZE)==-1) {printf("Read error\n");exit(1);}
		if(check(ch,BLOCKSIZE,i)==1) 
			 *pr|=01<<(bit_r);
    	if (bit==7) pr++;
	for (j=0;j<BLOCKSIZE;j++) ch[j]='\0';		
                         

		}
			for (i=0;i<num/8;i++) {fprintf(out,"%c",bmap[i]);}
	if(ostatok!=0)
	   {  char symv[ostatok];
	       
           if (read (fd, &symv, ostatok)==-1) {printf("Read error\n");exit(1);}
           	if(check(symv,ostatok,num)==1)  
           	       *pr|=01<<(bit_r);
           	       fprintf(out,"%c",bmap[num+1]);
      			}

			
			
			
	if (read(from_root[0], &byte, 1) != 1)
	{
		printf("ERROR: in read (process) in %d\n",getpid());
		exit(1);
	}
	if (write(to_root[1], &rank, 1)!=1)
	{  
		printf("ERROR: in write (process) in %d\n",getpid());
		exit(1);
	}
close (fd);
fclose (out);
}		



int main (int argc, char ** argv)
{	
	/*log_out = fopen ("./bitmap_log.txt", "wb");
    log_out2 = fopen ("./bitmap_log2.txt", "wb");*/
	pid_t pid;  int p; 	int i;	int byte;
	char byte2;
	printf("Size of long double=%d\n",sizeof(long double));
	printf("Enter number of PROCESSES\n");
	scanf("%d", &p);
	if (pipe(from_root)==-1)
	{
		printf("ERROR: in pipe(from_root) (main)\n");
		exit(1);
	}
	if (pipe(to_root)==-1)
	{	//p - число процессов
		printf("ERROR: in pipe(to_root) (main)\n");
		exit(1);
	}
		gettimeofday(&T, NULL);
		t_start=T.tv_sec*1000000+T.tv_usec;
		for (i = 0; i < p; i++)
	{	pid = fork();
		if (pid==-1)
		{
			printf("ERROR: pid==-1 (main)\n");
			exit(1);
		}
		else if (pid == 0)
		{
			// body for child
			close(from_root[1]);
			close(to_root[0]);
			process(i, p);
			close(from_root[0]);
			close(to_root[1]);
			return 0;
		}
	}
	close(from_root[0]); 
	close(to_root[1]);
	
		for (i = 0; i < p; i++)
	{
		byte = i;
		if (write(from_root[1], &byte, 1)!=1)
		{
			printf("ERROR: in write (main)\n");
			exit(1);
		}
		if (read(to_root[0], &byte2, 1)!=1)
		{  
			printf("ERROR: in read (main)\n");
			exit(1);
		}
		   printf("Process №%d is finished\n",byte2);

	}  

	gettimeofday(&T, NULL);
	t_finish=T.tv_sec*1000000+T.tv_usec;
	/*fclose (log_out);
	fclose (log_out2);*/
	printf("Calculated by %d microseconds\n",t_finish-t_start);
	char command[100]="cat";
	for (i=0;i<p;i++)
	sprintf(command+3*(i+1)," a%d",i+1);
	sprintf(command+3*(p+1),">bitmap");  	
	system(command);
	return 0;
}

Последний раз редактировалось Stilet; 30.05.2014 в 10:02.
XyLigAnD вне форума Ответить с цитированием
Старый 30.05.2014, 09:38   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Устанавливает соответствующий бит
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обьясните пожалуста как и что делает эта программа и почему она это делает. Dimka-novitsek Общие вопросы C/C++ 7 16.10.2013 12:02
Обьяснить код программи, что каждая строка делает NastyaV Фриланс 2 26.03.2011 17:04
Что делает тэг <o:p> VistaSV30 HTML и CSS 1 29.08.2010 08:30
скрипт, что он делает Sparky JavaScript, Ajax 2 20.06.2010 19:34
Печать. Что делает MS и не делает Delphi Влад12 Общие вопросы Delphi 8 05.05.2010 20:04