LINUX.ORG.RU

QBASIC - помогите с теорией

 , ,


1

1

Здравствуйте. Не нашелся в каком разделе спросить и выбрал генеральский =)

Переделываю софтину из 80-х, писаную на qbasic, в веб-страницу.
Т.к. устали люди ею пользоваться - очень, понимаете, недружественный у нее UI))
Софтина суровая, расчитывает режимы изготовления клея, которым крылья самолётам приклеивают :)
Как именно она творит уже доподлинно не известно, потому мне нуна понимать точно чего разраб наваял, а мой qbasic почти 20 лет назад закончился на «человечках отрывающих друг другу бошки по нажатию пробела» %)

Сути проблемы таковы:

1) когда GOSUB отсылает в якобы подпрограмму/процедуру, то переменные с такими же именами как в основном коде они совпадают или отдельные создаются? о_О
вводятся в оборот без предварительного объявления
моя основная версия, что совпадают %)

2) наткнулся на пару таких мест:

X = Y0
Z = X - 12345/(456-789)
при этом Y0 массив :\ одномерный из чисел..
и происходит это в цикле, переберающем какраз этот массив и есть в начале цикла его употребление, как
X0 = Y0(I)
что кагбэ намекает, на мою основную версию:
потрогав массив в нем перемещается некий указатель, текущего элемента чтоли, и можно обращаться к нему (элементу массива) без явного указания индекса нужного элемента 8|


Подскажите, прав ли я в предположениях или как этот код правильно понять?


ЗЫ: Ходил вчера на мелкомягко.сом - следы qbasic'а невнятны %)

по идее GOSUB эта подпрограмма, поэтому переменные должны существовать в одной области памяти. Для процедуры там есть вызов SUB, для функции FUNCTION ...

вот что-то нашел:

В выражении нам три раза придется вычислять факториал, производя при этом одни и те же действия с разными числами. Нам облегчит работу подпрофамма, которую мы разместим в конце основной профаммы и назовем, например, fact. В подпрофам-ме мы опишем, как вычислить факториал вообще, а затем из основной программы обратимся к подпрофамме три раза с различными параметрами. Вот как будет выглядеть программа:

CLS
1 : INPUT "Введите значения N и М"; N, М
K=N
GOSUB FACT
Х1=Р
К=М
GOSUB FACT
Х2=Р
K=(N-M)
GOSUB FACT
Z=X1/(X2*P)
PRINT "Искомое выражение равно"; Z
PRINT "Еще одно выражение?(Y/N): INPUT а$
IF UCASE$(a$)="Y" THEN 1 ELSE PRINT "До новых встреч
у монитора..." END
' Описание подпрограммы FACT для вычисления факториала
FACT:
Р=1
FOR i=l TO К
P=P*i NEXT i RETURN
xinim
()
Ответ на: комментарий от buratino

мож проще на python переписать начисто? buratino (17.03.2015 10:19:25)

робот чтоли? :)

чтобы начисто переписать куда угодно нужно понимать исходник, с целью чего, и задаю тут глупые вопросы ^_^

MERZaveC
() автор топика
Ответ на: комментарий от MERZaveC

тогда ещё не было слова «робот», и это называлось «мальчик из альтернативных материалов»

ну так запусти и посмотри. :) в режиме совместимости с qbasic может работать и freebasic... кстати, я когда-то на freebasic с помощью циркуля и линейки писал полнофункциональный веб-сервер, с поддержкой get/post/cookies, с нуля. телнетом опрашивал apache, и делал «чтобы было похоже» :)

но это самый тяжёлый случай. правда, непонятно, зачем в qbasic нужны gosub, если там есть полноценные процедуры и функции. что переменные внутри gosub индивидуальные - вероятность нулевая, а вот про массивы не помню - последний раз на qbasic, точнее на более продвинутом qb, писал лет 12 назад, милую текстовую игрушку. :)

buratino ★★★★★
()

1) совпадают
2) массив y() и переменная y смело сосуществуют:

DIM y(9)
FOR i = 0 TO 9
  y(i) = 1
NEXT
x = y
PRINT x
даст 0, несмотря на то, что все элементы y равны 1.

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

да я щас на ссылку кину, только он для школьников. Давно где-то в сети был сайт посвященный сабжу.

!держи

xinim
()
Ответ на: комментарий от buratino

непонятно, зачем в qbasic нужны gosub, если там есть полноценные процедуры и функции

пара слов, приводящая в дрожь — обратная совместимость. До qbasic в составе MS-DOS поставлялся gwbasic, а там были GOSUB, но никакими SUB и FUNCTION и близко не пахло

bormant ★★★★★
()

Кстати, в составе qbasic есть отличная справка, а в составе русского qbasic она ещё и на русском, F1 в помощь.

bormant ★★★★★
()

Может проще просто написать веб-страничку, которая будет принимать входные параметры из формы, запускать программку на qbasic-е и выдавать её результаты в виде HTML? А то расчёты судя по описанию важные, ошибаться нельзя.

Если всё же хочешь переписать, то обязательно сначала сформируй множество тестов. Скорее всего у тебя на работе уже есть множество входных параметров, с которыми эту программу вызывали. Для начала собери их все и разложи в файлики. Создай запускалку, которая будет на входных параметрах запускать qbasic и писать ответ в файл. Это будет эталон. Свою переписанную программу тестируй на этих эталонах. И по мере переписывания добавляй новые тесты во всех сомнительных местах, где ты можешь хотя бы теоретически ошибиться. Это будет называться функциональное тестирование.

Legioner ★★★★★
()

Извини, что не по теме, но - сюда уже местные упорыши приходили, предлагающие переписать все на брейнфаке/скале/питоне/похапе/сишечке и прочем? =)

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

То есть по факту это будет выглядеть так:
Твоя софтина у юзера толкает после ввода всех значений эту софтину, берет ее результат и кажет у себя.
ИМХО, это более безболезненный вариант, нежели переписывать все с нуля, тем более, что она вроде как важная.

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

по идее GOSUB эта подпрограмма, поэтому переменные должны существовать в одной области памяти. Для процедуры там есть вызов SUB, для функции FUNCTION ...

в общем, да, про GOSUB и переменные из самого кода понятно, что переменные одни и те же, но я на всякий случай %)

Оч-чень беспокоит момент 2), т.к., мало того, есть еще и такое употребление в этом коде, и тут я совсем в ТУПике о_О

830 X = X1 + H
...
1025 t = X
1030 FOR I = 1 TO I1
1035 FOR J = 1 TO N(I)
1040 IF t < t(I, J) GOTO 1055
1045 LX = TI(I, J): UX = TI(I, J + 1)
1050 LT = t(I, J): UT = t(I, J + 1)
1055 NEXT J
1060 HR(I) = (UT - LT) / (UX - LX)
1065 NEXT I
и даже не в тупике, тут моск мой начинает подплавляться, ибо, этот 2-мерный массив объявлен как
50 DIM T(6,10)
т.е. Заглавной буквой, а в коде применяется только строчной..
хотя, принять, что, видимо, qbasic'у всеравно на регистр букв в именах переменных, гораздо проще, чем осознать суть ТАКОГО кода =|

Могу предположить, что t=X присваивает каждому элементу массива одно и то же значение, но как тогда исполняется этот IF?
Или как может исполниться GOTO, если предположить, что t без индекса есть некий «текущий элемент», то они же все одинаковые, что сравнивать? T_T

Тут конечно возникает резонный вопрос: а работает ли код и не посмотреть ли шо за переменные, в самой оболочке?
Конечно, да, на заводе, таки, запускают EXE-шник, но .BAS лежит с ним рядом %)
И таак лениво добывать мастдай для запуска, что решил сначала попробовать помучать знающих людей О:)

MERZaveC
() автор топика
Ответ на: комментарий от xinim

только скажи когда скачаешь.

всёскачял.спасибо :)

MERZaveC
() автор топика
Ответ на: комментарий от MERZaveC

Заглавной буквой, а в коде применяется только строчной

Имена регистронезависимы. Более, того, стоит единожды в редакторе QBasic поправить имя переменной, она будет изменена во всем тексте.

Могу предположить, что t=X присваивает каждому элементу массива

Не надо ничего предполагать, t — обычная переменная, t() — массив, совпадение имен переменных и массивов не возбраняется.

QBasic-у номера строк не нужны,

X = X1 + H
...
t = X
FOR I = 1 TO I1
  FOR J = 1 TO N(I)
    IF t >= t(I, J) THEN
      LX = TI(I, J)
      UX = TI(I, J + 1)
      LT = t(I, J)
      UT = t(I, J + 1)
    END IF
  NEXT J
  HR(I) = (UT - LT) / (UX - LX)
NEXT I

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от bormant

1) совпадают 2) массив y() и переменная y смело сосуществуют:

Огромное спасибо
Вы остановили мою панику и теперь я смогу продолжить извращения (переписывание) в моём брейнфаке (жабаскрипте)
%D

MERZaveC
() автор топика
Ответ на: комментарий от MERZaveC

Конечно, да, на заводе, таки, запускают EXE-шник, но .BAS лежит с ним рядом %)

Строго говоря QBASIC — интерпретатор, поставлявшийся в в составе MS-DOS, компилировать в .EXE не умеет, QB — отдельный мелкомягкий продукт с компилятором и некоторыми отличиями от...

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

тебе надо весь аут в это оборачивать. это раз. а есть ещё и два, и три :)

У ТС, как выяснилось, QB, редирект там работает без каких-либо приседаний, если я правильно путаю.

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

ключевое слово DosBox.

А как же «чистота эксперимента»? =Ъ
Могу приврать, но, кажется, на заводе 9х мастдай..
Да, доступа у меня туда нет :)
Известно точно станет когда у тестера мой HTML+JS на IEv0.01 не пойдёт %)
Но я попробую - давно хотел найти повод, а тут забыл

MERZaveC
() автор топика

Леденящий душу тред

anonymous
()
Ответ на: комментарий от Zhbert

То есть по факту это будет выглядеть так: Твоя софтина у юзера толкает после ввода всех значений эту софтину, берет ее результат и кажет у себя. ИМХО, это более безболезненный вариант, нежели переписывать все с нуля, тем более, что она вроде как важная.

Идея извращения в html+js состоит не только в том, что ни-на-чём-больше-ниумею-сейчас, но и в пускай-на-любом-калькуляторе-работает 8)
Всего-то.. кода 5 страниц - блок-схему рисовал 3 дня %)

MERZaveC
() автор топика
Ответ на: комментарий от buratino

ну так запусти и посмотри. :)

Собственно, да. Не помню, как в qbasic.exe, а в qb45.exe была же встроенная IDE с пошаговым отладчиком и просмотром переменных.

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

Может проще просто написать веб-страничку, которая будет принимать входные параметры из формы, запускать программку на qbasic-е и выдавать её результаты в виде HTML? А то расчёты судя по описанию важные, ошибаться нельзя.

Если всё же хочешь переписать, то обязательно сначала сформируй множество тестов.

Предполагаю оставить это «удовольствие» (тестирование на реальных данных) сначала «автору ТЗ», ибо страдания его (пользователя) звучали как
мы-вводим-вводим-а-одно-число-перепутаешь-и-заново-заново!!
А там посмотрим как будут расхождения - авось сходу получится, зря что ли неделю блок-схемой разминался %))

MERZaveC
() автор топика
Ответ на: комментарий от buratino

а сколько ты будешь к qbasic приделывать stdin/stdout? :)

Нуууу....
Да можно банально в текстовик писать, не?

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

Идея извращения в html+js состоит не только в том, что ни-на-чём-больше-ниумею-сейчас, но и в пускай-на-любом-калькуляторе-работает 8)

И каким образом это противоречит моему варианту?

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

Строго говоря QBASIC — интерпретатор, поставлявшийся в в составе MS-DOS, компилировать в .EXE не умеет, QB — отдельный мелкомягкий продукт с компилятором и некоторыми отличиями от...

Да, я оч-чень страдал в децтве, что exe-шники не делались в qbasic'e и потому с криками ура переметнулся на ТП (турбо паскаль) при первом же знакомстве %)

Мм.. Математическую чисто задачу имея, полагаю, забить на отличия возможным становится..? :)

MERZaveC
() автор топика
Ответ на: комментарий от Zhbert

И каким образом это противоречит моему варианту?

Понимаю, что я, видимо, заблуждаюсь, но вижу Ваш вариант требующим дополнительный софт, акромя тырнет-браузера..? /8)

MERZaveC
() автор топика
Ответ на: комментарий от MERZaveC

дополнительный софт, акромя тырнет-браузера..? /8)

Тааак...
Чтобы работал «тырнет-браузер», нужно что?

Zhbert ★★★★★
()

GOSUB

Данный оператор не создаёт каких то новых переменных и не определяет новое пространство имён. Его можно имитировать множеством способов.

1) Выделить находящийся в нём код в отдельную функцию и передавать используемые переменные как параметры.

2) Тоже выделить в отдельную функцию, но объявить используемые переменные как глобальные.

А вообще, используй gambas, будет легче портировать. https://ru.wikipedia.org/wiki/Gambas#.D0.9A.D0.BE.D0.BC.D0.BF.D0.BE.D0.BD.D0....

rezedent12 ☆☆☆
()

Если у тебя есть лишние деньги, то я как специалист по различным диалектам BASIC могу помочь с портированием программы на Gambas.web.

rezedent12 ☆☆☆
()
Ответ на: комментарий от bormant

QBasic-у номера строк не нужны

Это моему жабаскрипту номера строк не нужны, а в исходнике они есть 8Ъ
Исходник хоть и датирован 1988 годом, но очень нравится мне подозревать, что исполнялась эта прога еще на перфокартах ^_^

Еще раз, огромное спасибо за Ваш прямой-однозначный-четкий-понятный-спасший-мой-моск-от-мануалов-и-гугла-супер ответ :)
Не сегодня завтра сдам v1.0 %)

MERZaveC
() автор топика
Ответ на: комментарий от Zhbert

сюда уже местные упорыши приходили, предлагающие переписать все на брейнфаке/скале/питоне/похапе/сишечке и прочем?

конечно!

Есть один простой вариант, которым я когда-то пользовался: найти в коде места, где оно выплевывает тебе результаты и добавить это выхлоп еще и в какой-либо промежуточный формат

лучше уж переписать на нормальный ЯП.

emulek
()
Ответ на: комментарий от buratino

для html + js «вебсервером» может выступать файловая система, любая.

А, что-то я не учел немного, что он пишет просто на хтмл+жс. Извиняюсь =) Так тогда какая разница? Положил рядом с главной страницей бинарник проги и толкай ее себе.

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

Могу предположить, что t=X присваивает каждому элементу массива одно и то же значение

AFAIK в сабже такой фичи не было.

Т.е. T(aka t) это совсем другая переменная, не массив.

emulek
()
Ответ на: комментарий от MERZaveC

Могу приврать, но, кажется, на заводе 9х мастдай..

это MS-DOS с накостыленными сверху окошками и пародией на многозадачность (с претензией на многопользовательность).

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

но ты вообще ППЦ предлагаешь.

Почему? ИМХО это куда как проще, чем разбираться в кривом коде предшественника, что ужас даже в том случае, если там все хорошо закомменчено.

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

что ужас даже в том случае, если там все хорошо закомменчено

Не могу не отметить, что закомменчено в перемываемом исходнике только несколько строк рассказывающих название и автора, да пара формул в одном месте =D

для html + js «вебсервером» может выступать файловая система, любая. buratino (17.03.2015 13:06:03)

Я какраз начал подозревать, что следует уточниться про «предполагается запускать локально» =)

лучше уж переписать на нормальный ЯП

Прошу простить мою неграмотность, но тут имеется ввиду «Я Плакал»? =Ъ

MERZaveC
() автор топика
Ответ на: комментарий от Zhbert

Положил рядом с главной страницей бинарник проги и толкай ее себе.

Вот это интересно, примерно как такое делается?

MERZaveC
() автор топика
Ответ на: комментарий от MERZaveC

тут имеется ввиду python :) ну или что-то подобное :)

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