2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1 ... 34, 35, 36, 37, 38  След.
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 17:18 
Yadryara в сообщении #1717462 писал(а):
вопрос о том как в Убунте автоматически запускать много последовательных файлов остаётся.

Это очень простой вопрос, если его чётко и правильно поставить. Юникс/Линукс "заточен" на конвейрную работу, т.е. на то, чтобы запускать много всего - хоть последовательно, хоть параллельно. Вы, правда, выбрали WSL 1, а не WSL 2, но надеюсь что это не повлияет фатально.

 
 
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 17:28 
Аватара пользователя
wrest в сообщении #1717473 писал(а):
Это очень простой вопрос, если его чётко и правильно поставить.

Я опять чего-то недоформулировал? :-)

Я пока что не мудрю и при запуске обычно выполняю 2-3 команды:

Код:
chmod 666 RabUb_400_79_1.gp
cd D24-20
gp2c-run -g RabUb_400_79_1.gp

Как мне сделать, чтоб вручную запустить только файл

RabUb_400_79_1.gp

и чтобы после окончания его работы запустился бы

RabUb_400_79_2.gp

, затем

RabUb_400_79_3.gp,

и так далее до

RabUb_400_79_10.gp

?

 
 
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 17:40 
Yadryara в сообщении #1717477 писал(а):
Я пока что не мудрю и при запуске обычно выполняю 2-3 команды:

Этими командами вы компилируете текст программы на языке pari/gp и потом запускаете, а не просто запускаете.
gp2c-run это скрипт ("батник" по-вашему) который сперва запускает транслятор .gp в .c, создаёт .gp.run, компилирует .c в исполняемый файл/библиотеку .o, запускает интерпретатор .gp который "инсталлирует" пользовательскую функцию из этой библиотеки, потом её запускает. Короче, много всего происходит.
Я же вам показывал как делать: вместо десяти скриптов .gp сделать один, который будет вызывать функцию с нужными параметрами - хоть последовательно через for, хоть параллельно через parfor.
А вы всё ещё на бейсике :) Но и тут можно автоматизировать, только ещё раз: надо понять какое начальное состояние и в какое вы хотите попасть в итоге.

P.S. Вот текст скрипта gp2c-run у меня в андроиде (у вас немного другой)
код: [ скачать ] [ спрятать ]
Используется синтаксис Bash
#!/bin/sh -e
#Copyright (C) 2001-2013  The PARI group.
#
#This file is part of the GP2C package.
#
#PARI/GP is free software; you can redistribute it and/or modify it under the
#terms of the GNU General Public License as published by the Free Software
#Foundation. It is distributed in the hope that it will be useful, but WITHOUT
#ANY WARRANTY WHATSOEVER.
#
#Check the License for details. You should have received a copy of it, along
#with the package; see the file 'COPYING'. If not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

name="stdin";
for p in "$@"; do
case "$p" in
  -h|--help) cat <<EOF
gp2c-run <options> <file.gp>
Compile file.gp with gp2c and launch a gp session with functions of file.gp
added.
<options> are passed to gp2c

gp2c-run <file.c>
Compile file.c and launch a gp session with functions of file.c added.

ENVIRONMENT:
GP2C: path to the gp2c compiler, default: /data/data/com.termux/files/usr/bin/gp2c
GP: path to the gp calculator, default: /data/data/com.termux/files/usr/bin/gp
EOF

exit
;;
  -l|-t|-v)  exec $GP2C "$@" ;;
  -o) echo "gp2c-run does not support option -o" 1>&2; exit 1;;
  -*) ;; #We discard options
  *) name=$p;;
esac
done

if test "x$GP2C" = "x"; then
  GP2C="/data/data/com.termux/files/usr/bin/gp2c"
fi


if test "x$GP" = "x"; then
  GP="/data/data/com.termux/files/usr/bin/gp"
fi

case $name in
*.c) name=${name%.c};;
*) $GP2C -o $name.c "$@" ;;
esac

command=`echo "aarch64-linux-android-clang -c -o %s.o -O3 -Wall -fno-strict-aliasing -fstack-protector-strong -Oz -isystem/data/data/com.termux/files/usr/include/c++/v1 -isystem/data/data/com.termux/files/usr/include -fPIC -I\"/data/data/com.termux/files/usr/include\" %s.c && -o %s.so %s.o -Wl,-rpath,/data/data/com.termux/files/usr/lib " | sed -e "s %s $name g"`
eval $command || exit $?
grep "^GP;" $name.c | sed 's/^GP;//' >$name.run
$GP $name.run

 
 
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 18:16 
Аватара пользователя
Не хочу я пока всю программу объявлять функцией.

Вот Дмитрий меня сразу понял.

wrest в сообщении #1717478 писал(а):
Но и тут можно автоматизировать, только ещё раз: надо понять какое начальное состояние и в какое вы хотите попасть в итоге.

Состояние такое. Я не могу нормально считать по программе: каждые 40-50 минут потоки останавливаются из-за переполнения стека.

В качестве простейшего временного решения вижу разбивку одной программы на 10. С последовательным запуском. Уже проверено: с таким количеством счёта переполнения не происходит. Ну не успевает стек переполниться.

 
 
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 18:17 
Yadryara в сообщении #1717482 писал(а):
Не хочу я пока всю программу объявлять функцией.

Вот Дмитрий меня сразу понял.
Ок, дело ваше :D

-- 06.02.2026, 18:19 --

Yadryara в сообщении #1717482 писал(а):
В качестве простейшего временного решения
Не проблема, подождём когда созреете для постоянного 8-)

 
 
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 18:37 
Аватара пользователя
wrest в сообщении #1717483 писал(а):
Не проблема, подождём когда созреете для постоянного

:-) Ну то есть вы меня воспитывать взялись? "Пойми, Антоха, ты разобрался плохо" :-)

Если нельзя создать список из нескольких команд на последовательную компиляцию и запуск, тогда другое дело. Но вряд ли.

 
 
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 19:04 
Yadryara в сообщении #1717484 писал(а):
Если нельзя создать список из нескольких команд на последовательную компиляцию и запуск, тогда другое дело.

Почему нельзя, можно :) В такой постановке, без подробностей, вот вам "батник":
Код:
#!/bin/bash

for i in {1..10}; do
    f="RabUb_400_79_${i}.gp"
    chmod 666 "$f"
    (cd D24-20 && gp2c-run -g "../$f")
done

Называете его скажем run_all.sh
Кладёте в папку с файлами .gp
Делаете исполняемым
Код:
chmod +x run_all.sh

и запускаете:
Код:
./run_all.sh

Неясен только момент, зачем у вас там
Код:
cd D24-20

 
 
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 20:14 
Аватара пользователя
Спасибо, попробую. Эта команда конечно не нужна для цикла. Как понял, надо заменить

(cd D24-20 && gp2c-run -g "../$f")

на

gp2c-run -g "../$f"

 
 
 
 Re: Как писать быстрые программы
Сообщение06.02.2026, 20:33 
Yadryara в сообщении #1717495 писал(а):
Как понял, надо заменить

Да, на

Код:
gp2c-run -g "$f"

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 04:48 
Аватара пользователя
Понял.

Не, не работает. Два варианта попробовал:

Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ chmod +x run_all.sh
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ ./run_all.sh
/bin/bash: ./run_all.sh: Permission denied
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ chmod 666 run_all.sh
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ ./run_all.sh
-bash: ./run_all.sh: Permission denied


-- 07.02.2026, 04:57 --

Доступ к 4-м файлам разрешил вручную и попытался запустить 4. Тогда Убунта по-другому начала ругаться:

Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ ./run_all.sh
./run_all.sh: line 2: $'\r': command not found
./run_all.sh: line 3: syntax error near unexpected token `$'do\r''
'/run_all.sh: line 3: `for i in {1..4}; do


-- 07.02.2026, 04:59 --

Файл сейчас такой:

Код:
#!/bin/bash

for i in {1..4}; do
    chmod 666 "$f"
    f="RabUb_400_${i}.gp"
    gp2c-run -g "$f"
done


-- 07.02.2026, 05:03 --

И если убрать chmod 666 "$f", то то же самое пишет.

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 12:58 
Yadryara
Печалька.
Думаю, пришло время ставить костыли и править скрипт gp2c-run
Вместо строчки
Код:
grep "^GP;" $name.c | sed 's/^GP;//' >$name.run

cделать так:
Код:
grep "^[ \t]*GP;" "$name.c" | sed 's/^[ \t]*GP;//' >"$name.run"

а вместо строчки
Код:
$GP $name.run

сделать так:
Код:
$GP -q $name.run


У меня есть три файла cледующего содержания:
hello1.gp:
Код:
/*
GP;init_hello1();
*/
/*
GP;quit;
*/
print("Hello 1 from gp2c again");
hello2.gp:
Код:
/*
GP;init_hello2();
*/
/*
GP;quit;
*/
print("Hello 2 from gp2c again");
hello3.gp:
Код:
/*
GP;init_hello3();
*/
/*
GP;quit;
*/
print("Hello 3 from gp2c again");

запуск файла run_all.sh такого содержания, из директории где лежат файлы hello*.gp:
Код:
#!/bin/bash

for i in {1..3}; do
    f="hello${i}.gp"
    gp2c-run -g "$f"
done

Даёт такой результат:
Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ ./run_all.sh
Hello 1 from gp2c again
Hello 2 from gp2c again
Hello 3 from gp2c again
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$


Желаю удачи в строительстве костылей :D
Но поскольку это костыли, может случиться что-то непредвиденное 8-)

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 13:37 
Аватара пользователя
Исправил gp2c-run как указано. Теперь, после отработки рабочей программы появилась

Код:
/usr/bin/gp2c-run: 60: Syntax error: Unterminated quoted string

Полагаю, это связано с внесёнными исправлениями.

А при попытке запуска пишет то же самое:

Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ ./run_all.sh
./run_all.sh: line 2: $'\r': command not found
./run_all.sh: line 3: syntax error near unexpected token `$'do\r''
'/run_all.sh: line 3: `for i in {1..3}; do


-- 07.02.2026, 13:51 --

Решил сделать в точности как у вас. Но доступ к новому файлу run_all_3.sh опять не даёт.

Код:
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ chmod +x run_all_3.sh
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$ ./run_all_3.sh
/bin/bash: ./run_all_3.sh: Permission denied
yadryara@DESKTOP-QPP2F5P:~/D24-20/10f$

А если записать в старый, то те же ошибки.

Или обязательно перезагрузить надо?

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 14:01 
Yadryara в сообщении #1717559 писал(а):
Полагаю, это связано с внесёнными исправлениями.

Да, костыли - дело такое... Видать что-то не так поняли. Покажите последние 3 строчки файла gp2c-run, команду ниже запускать из директории где располагается gp2c-run (у меня это /usr/bin у вас не знаю).
Код:
tail -n3 gp2c-run
ну или как вам удобнее - откройте в текстовом редакторе и дайте сюда 3 последних строки.
Yadryara в сообщении #1717559 писал(а):
./run_all.sh: line 2: $'\r': command not found

И что там у вас во второй строке такого?

-- 07.02.2026, 14:06 --

Yadryara в сообщении #1717559 писал(а):
Но доступ к новому файлу run_all_3.sh опять не даёт.

Ну потому что chmod неправильный. Чтоб сразу давало, команда
Код:
chmod 777 run_all_3.sh

7 - это в двоичном коде 111
первая единица это права на чтение
вторая - на запись
третья - на исполнение
при команде chmod 666 получается, что двоичная запись числа 6 это 110 и права на исполнение не выдаются, только на чтение и запись.

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 14:22 
Аватара пользователя
Три последние строчки:

Код:
eval $command || exit $?
grep "^[ \t]*GP;" "$name.c" | sed 's/^[ \t]*GP;//' >"$name.run"
$GP -q $name.run


Понял. 777 сработало, но результат запуска тот же.

wrest в сообщении #1717565 писал(а):
И что там у вас во второй строке такого?

Код ровно такой же как у вас. И файлы hello1-3.gp при ручном запуске отрабатывают нормально.

 
 
 
 Re: Как писать быстрые программы
Сообщение07.02.2026, 14:29 
Yadryara в сообщении #1717571 писал(а):
И файлы hello1-3.gp при ручном запуске отрабатывают нормально.

что значит "при ручном запуске"?

 
 
 [ Сообщений: 566 ]  На страницу Пред.  1 ... 34, 35, 36, 37, 38  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group