LINUX.ORG.RU

помогите студенту написать курсовик =)


0

1

Что-то в таком духе(осторожно, хабр!), только с уклоном в алгоритмы:
1) сражаются 2 юнита
2) присутствует гравитация

Программа моделирования будет написана на C++, алгоритмы агентов будут вынесены в отдельные программы и будут получать/отправлять информацию об эволюции системы через stdin/stdout, будут написаны на Лиспе ибо он поддерживает инкрементальное программирование и рефакторинг без попоболи. Программа моделирования будет запускать программы-агенты и перенаправлять их ввод/вывод в fifo, через которые будет с ними общаться, либо 2-ой способ(для джейла, например): получать пути к fifo через входные параметры.

Но! При попытке реализации сабжа у меня случился фейл: перенаправление потоков ввода/вывода ведет себя совсем не так, как я ожидал.

Вот пример.

#include <iostream> 
using namespace std;

int main ()
{
  for (;;) {
    int c1, c2;
    cin >> c1 >> c2;
    cout << "incoming! " << c1 << " " << c2 << endl;
  }
}
Попробуем запустить.
$ g++ tst.cpp -o tstp
$ ./tstp
0
1
incoming! 0 1
2 3
incoming! 2 3
4 5 6 7 8
incoming! 4 5
incoming! 6 7
9
incoming! 8 9
  C-c C-c
$
То, что нужно! Теперь попробуем перенаправить stdin.
$ mkfifo in
$ ./tstp < in
Переходим в другой терминал:
$ echo 0 1 > in
В первом терминале:
incoming! 0 1
incoming! 0 1
incoming! 0 1
incoming! 0 1
incoming! 0 1
incoming! 0 1
incoming! 0 1
incoming! 0 1
incoming! 0 1
...
Ох щи! Почему это произошло??
Если перенаправлять поток внутри программы, результат такой же.

1) Нужно выходить из программы, когда pipe закрывается+
- for (;;) {
+ while (cin.good()) {

2) Чтобы писать в pipe из одной программы, нужно писать как-то так:
cat > in
1 2
3 4
5 6 7
8
Ctrl+D
Так как при echo pipe будет каждый раз закрываться.

vzzo ★★★
()
Ответ на: комментарий от vzzo

Прошу прощения,

- cin >> c1 >> c2;
+ if (!(cin >> c1 >> c2)) break;

vzzo ★★★
()
Ответ на: комментарий от vzzo

Спасибо за оперативный и полный ответ. Почитал еще про i/o потоки и fifo, понял в чем дело.

kermzyxer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.