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


Автор: MedvedNick 5.11.2009, 16:23
Задача: 
Написать функцию int max(int *beg, int len), beg - ссылка на начало массива, len - длина. Функция ищет максимальный элемент в массиве: создает два дочерних процесса, первый запускает функцию рекурсивно для первой половины массива, второй - для второй половины, и возвращает максимум из полученных от процессов значений. Если длина равна 1, то функция возвращает число, на которое указывает начало.

Код

#include <stdio.h>
#include <unistd.h>


int max(int *beg, int len)
{ int first, sec;

  if (len == 1) return *beg;

  if (fork()==0) exit(max(beg, len/2);
  if (fork()==0) exit(max(beg+len/2, len-len/2));

  wait(&first);
  wait(&sec);
  
  if (first < sec) first = sec;
  
  return first;
}

int main()
{ int Nik[10];
  int i;

  printf("Enter:\n");

/* быстрый ввод массива*/
  for (i=0; i<10; i++)
      Nik[i] = getchar() - '0';
  
  printf("%d\n", max(Nik, 10));
  return 0;
}



Это не работает, возвращает всегда ноль. Подскажите, в чем тут ошибка, пожалуйста

Автор: GrayCardinal 5.11.2009, 20:35
MedvedNick, 
Там ошибок больше чем кода. Извини, за тебя переписывать не охота  smile 

Автор: MedvedNick 5.11.2009, 22:03
единственная ошибка была - заменить
Код

  wait(&first);
  wait(&sec);

на
Код

  wait(&first);
  first = WEXITSTATUS(first);
  wait(&sec);
  sec = WEXITSTATUS(sec);

добавив при этом в include <sys/types.h>  и <sys/wait.h>

но, хотелось бы увидеть другие ошибки))

Автор: MAKCim 5.11.2009, 22:47
GrayCardinal
за исключением отсутствия проверок на ошибку при форке, код вполне приемлем ;)

MedvedNick
Код

...
wait(&first);
wait(&sec);

first = WEXITSTATUS(first);
sec = WEXITSTATUS(sec);
...

+ подключи sys/types.h и sys/wait.h

Автор: GrayCardinal 6.11.2009, 20:02
Или я чего-то не догоняю, либо одно из двух.
Ну не два процесса там создается. Или мне пойти выспаться ? smile

Автор: MAKCim 6.11.2009, 22:26
GrayCardinal
посчитай ;)

Автор: MedvedNick 6.11.2009, 23:23
в каждой функции - два процесса создается, а каждый из них запускает ту же функцию рекурсивно, итого - много процессов))

Автор: hente 7.11.2009, 09:12
Создание новых процессов в рекурисии smile ? матерь  божья.....
Автор а мона вопрос где это будет работать надеюсь не на АС?

Автор: GrayCardinal 7.11.2009, 11:16
hente, 
 smile 

Автор: MAKCim 7.11.2009, 11:39
ребята, хватит флудить, задача, насколько я понял, учебная и не претендует на значимость в реальной жизни ;)

Автор: MedvedNick 7.11.2009, 16:22
MAKCim, правильно понял ;-)
собственно, тема себя уже исчерпала)

Автор: hente 7.11.2009, 19:55
1. решение хоть и не в полне красивое но адекватное уже приведено

2.Если честно не осилил смысловой нагрузки этого задания.
Найти макс-оне значение массива разными потоками, хм занятие не оч приятное на мой взгляд...
На скока я понимаю выполняться проверка на максисумум все равно будут последовательная а не паралельная т.е. выигрыша ваще нивчем не будет кроме задействовании груды ресурсов, при чем в пустую....

3.Автору будет смысл еще раз задуматься над заданием потому как мне например кажется что он не до конца понял задание или заведомо пошел не по верному пути,...

PS так что я думаю эт не флуд......

Добавлено @ 19:57
ааа ссори там ввод числа.....приношу свои извинения....
хотя смысла все равно не осилил

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