Страница: 1 | 2 | 3 |
Вопрос: ГЛЮК или ОСОБЕННОСТЬ ???
Добавлено: 29.06.04 17:56
Автор вопроса: Dingo
Друзья!
Знатоки и гуры моего любимого PowerBASICa!
Поясните: это вот ГЛЮК или ОСОБЕННОСТЬ :)) такая.
Фрагмент №1:
'--------------------------
Dim i As Dword
For i = 23 To 1 Step -1
MsgBox Str$(i)
Next i
'--------------------------
Фрагмент №2:
'--------------------------
Dim i As Long
For i = 23 To 1 Step -1
MsgBox Str$(i)
Next i
'--------------------------
Фрагмент №1 НЕ РАБОТАЕТ (т.е. работает только 1 раз) !!!
Фрагмент №2 РАБОТАЕТ (т.е. работает 23 раза).
Это же глупо! Не вижу ни каких причин для сего факта.
Хоть тип Dword и положительный, но от него же отнять 1 не проблема, причём, всё это явно без переполнения.
Судя по всему проблемным является "Next i" т.к.
если добавить во фрагмент №1 после цикла "MsgBox Str$(i)", то он покажет 22 !
Проясните ситуацию.
(писАлось на PB/Win 7.04).
Ответы
Всего ответов: 42
Номер ответа: 1
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #1
Добавлено: 29.06.04 19:46
It is important to note that increment must be the same data type or in the same range as Counter. For example:
FOR x?? = 50 TO 1 STEP -1
will fail because -1 is not within the range of an unsigned Word variable.
FOR/NEXT loops run fastest when Counter is a Long-integer variable, and start and increment are Long-integer constants.
Если непонятно, то объясню. Нет в типе Dword такой цифры -1. Это же беззнаковое число. Беззнаковые типы лучше использовать при работе с системой или или при изобретении чего нибудь.
Номер ответа: 2
Автор ответа:
Dingo
Вопросов: 1
Ответов: 9
Профиль | | #2
Добавлено: 29.06.04 19:53
Спасибо!
Теперь вобщем-то всё ясно (хотя всё же несколько забавно).
Номер ответа: 3
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #3
Добавлено: 29.06.04 20:26
:004010A5 C7458023000000 mov [ebp-80], 00000023
:004010AC 8B4580 mov eax, dword ptr [ebp-80]
:004010C5 FF4D80 dec [ebp-80]
:004010C8 837D8001 cmp dword ptr [ebp-80], 00000001
:004010CC 76DE jbe 004010AC
Пошагово:
mov [ebp-80], 00000023
 im i As Dword: i=23
mov eax, dword ptr [ebp-80]
Это для MsgBox. Дальше идёт серия Call'ов, показывающая Msgbox Str$(i)
dec [ebp-80]
i=i-1
cmp dword ptr [ebp-80], 00000001
jbe 004010AC
If i<=1 then goto 004010AC
Получается
1 Dim i As Dword: i=23
2 i=i-1
3 If i<=1 then goto 1
=====
Это для Long
:004010A5 C7C623000000 mov esi, 00000023
:004010AB 8975A8 mov dword ptr [ebp-58], esi
:004010C2 FFCE dec esi
:004010C4 83FE01 cmp esi, 00000001
:004010C7 7DE2 jge 004010AB
1 i=23
2 Msgbox i
3 i=i-1
4 f i>=1 then goto 1
=====
Это не глюк и не особенность. Это глючная особенность
Похоже что для всех типов используется один алгоритм.
Судя по проге "Flags and JCC © The Svin".
http://www.wasm.ru/tools/22/jcc.zip
Для получения >= в беззнаковом числе, его нужно инвертировать. А при едином алгоритме для всех типов у беззнакового получается <=.
Номер ответа: 4
Автор ответа:
Dingo
Вопросов: 1
Ответов: 9
Профиль | | #4
Добавлено: 29.06.04 21:20
Тонко, тонко...
Теперь предельно понятно. Спасибо.
Тонко, однако.
По-нашему это - глюк, а по ихнему/умному - особенность
Им конечно видней, но возможно же (наверное) было реализовать механизм циклов не с инверсией чисел, а с проверкой флага CF (хотя вероятно это повлияло бы на скорость или предварительную проверку крайних значений для выбора того или другого механизма цикла (что усложнило бы компилятор).
Тем не менее хорошо всё-же, что авторы таки прописали данную "адвансед-фичу" в предостережениях.
Вердикт: пожалуй сегодня я сочту данную меру оправданной )
Номер ответа: 5
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #5
Добавлено: 29.06.04 22:09
Для знаковых и беззнаковых чисел используются разные флаги.
JGE Jump if Greater or Equal (signed) SF=OF
JBE Jump if Below or Equal CF=1 or ZF=1
Да и инвертируются скорее всего не числа, а флаги.
А вообще надо бы поковыряться в этой табличке. Я сам её первый раз открыл.
Номер ответа: 6
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #6
Добавлено: 29.06.04 23:58
>Это глючная особенность
Нее, это особенная глючность. Глючность продукта PowerBasic.
А вообще-то я нашёл, как бороться с этими глюками PB. Дёшево и сердито.
Номер ответа: 7
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #7
Добавлено: 30.06.04 02:05
Сжёг все ворованные копии ненавистного Power Basic'a?
Собственно у него есть неплохая альтернатива - VB.NET. Пользуй. ))
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 30.06.04 12:11
Ну вот, зачем сразу жечь? А VB.NET - это не альтернатива, это ...у ...ы... ммм.. незнаю как и сказать... (чтобы Павел не услышал)
А если серьёзно, то на PowerBasic сделать что-либо приличное, особенно в плане графического оформления можно только сплошь и рядом используя АПИ. Я тут пару недель назад закачал masm32 v8.2 и немало был удивлён, почитав его хелпы и попробовав примеры из учебников. По сравнению со старинным ассемблером изменений множество, одно из которых меня удивило более всего - MASM High Level Syntax. И куча всяких готовых макросов. В общем поковырял я всё это и кажется начинаю понимать причину относительной непопулярности PowerBasic. На мой взгляд на уровне РВ надо опускаться как можно ниже (голые АПИ, ассемблерные вставки и т.д.) но этого же можно добиться, чуть приподнимаясь от чисто ассемблерного уровня (mov, cmp, add и sub) на уровень High Level Syntax. И что особенно приятно, в masm'e я не заметил пока каких-либо глюков, похожих на РВ-глюки, которые ставят в тупик своей необъяснимостью и непредсказуемостью поведения готовой программы. Если есть ошибка - то это стабильно ТВОЯ ОШИБКА, устранил её - и программа работает СТАБИЛЬНО независимо от того, какое сегодня число, был ли с утра дождь, и не забыл ли ты почистить свои туфли... А в РВ складывается ощущение, что программы работают по принципу RND: хочет - работает, не захотела эта же самая прога - завтра работать не будет.
Вот собственно и вся альтернатива.
Номер ответа: 9
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #9
Добавлено: 30.06.04 13:45
)))))))
>в РВ складывается ощущение, что программы работают по принципу RND: хочет - работает, не захотела эта же самая прога - завтра работать не будет.
- Никогда с таким не сталкивался.
>Вот собственно и вся альтернатива.
- Power Basic имеет к MASM32 только косвенное отношение. HLS в MASM32 создавался по образу Power Basic. Посмотри самые старые темы в POFFS.
Самая старая от Hutch'а датируется 98 годом. А MASM32 появился в 2001. Т.е. полюбому он HLS взял не спотолка, а с PB. Так что можешь ждать теж глюков от MASM32, что и в PB.
Или переходи на RosASM. Там для HLS используется синтаксис языка Це.
Номер ответа: 10
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #10
Добавлено: 30.06.04 14:14
Да я и не утверждаю, что РВ имеет какое-то отношение к masm32. Если HLS и создавался по подобию PB, это же не значит, что он был создан буквально как Copy-Paste. Возможно, что принципы те же, но реализация иная. Об этом косвенно говорит то, что размеры асм- ехе-шника значительно меньше, чем РВ. Значит механизмы разные.
> - Никогда с таким не сталкивался.
Сплошь и рядом. Последний пример из практики:
MAIL ICON DISCARDABLE "img\sendmal.ico"
Заметил, что sendmal написано без буквы "i"? Первоначально было с i, всё прекрасно компилировалось, создавался ресурс, всё работало. Затем без всяких изменений в .rc файле перестал создаваться файл .pbr, хотя .res по прежнему создаётся. Сама икона тоже прежняя. Просто случайно вычислил, что проблема с именами. sendmal прекрасно компилируется, а sendmail - ни в какую. О какой стабильности идёт речь? Программа, поставленная в автозагрузку, запускается через раз, захотела - запустилась, не захотела - не запускается. Один и тот же код. Вручную запускается прекрасно. Эта непредсказуемость убивает наповал.
И что за RosASM такой? Можно чуть подробней?
Номер ответа: 11
Автор ответа:
Dingo
Вопросов: 1
Ответов: 9
Профиль | | #11
Добавлено: 30.06.04 15:43
ВОТ ЭТО ДИСКУССИЯ ! ))))))
Молодцы.
Номер ответа: 12
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #12
Добавлено: 30.06.04 16:27
У меня ни разу PBRes ошибок не выдавал.
Бывало rc выбивало. Так rc - это (c) MS.
sendmail конвертировался нормально. Раз 10 конвертанул - ни одной ошибки.
>что за RosASM такой
- См. http://wasm.ru
Раздел посвящённый компиляторам. Название раздела не помню.
Сделал его француз(вроде) Бетов (Betov). Говорил что 5 лет выдержки
===
Dingo,
Обычный флейм.
Номер ответа: 13
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #13
Добавлено: 01.07.04 13:12
Почти во всех случаях "глюки PB" объясняются "глюками программиста", вы зайдите на форум по VB.NET там постоянно можно прочитать возгласы VB.NET - ГЛУЧИТ! ПАМАЖИТЕ!! ))
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 01.07.04 14:43
Прежде, чем говорить о "глюках программиста", неплохо было бы для начала иметь представление о каждом конкретном случае.
Есть довольно известная точка зрения: если какая-либо программа не работает, то в этом виноват юзер: нажимает не те кнопки. Похоже, что alex приверженец этой точки зрения. Я считаю несколько иначе: если в программе не предусмотрены все возможные действия юзера, то данная программа - потенциально глючная. И создатель PBEdit должен был подумать о том, что моя иконка может называться "sendmail.ico", и я не обязан путём перебора вариантов определять, какие имена иконок подходят для создания файла ресурсов, а какие не подходят.
Номер ответа: 15
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #15
Добавлено: 01.07.04 16:57
Вообще-то ресурсы компилирует RC.EXE, эта утилита создана Микрософт
и свободно распостраняется. PB к компилированию ресурсов не имеет
никакого отношения. PBRES производить всего лишь конвертацию
32-битного .RES файла в 16-разрядный формат, чтобы компилятор
BPWIN.EXE смог его корректно обработать.
Кстати в разделе DOWNLOAD сайта powerbasic.com есть Freeware –
линкер ресурсов, не помню его название. С помощью него можно
“прилинковывать” .RES файл к любому EXE. Так что если есть проблемы
с компиляцией ресурсов, можно использовать его…
Я уже полгода активно использую PBWIN 7.0- 7.2 - 7.4 для создания DLL
с ассемблерными вставками, глюков компилятора пока не заметил, качество
кодогенерации – замечательное, скорость работы – сверхзвуковая.
Мои DLL используются в крупных проектах связанных с учетом
финансирования Федеральных Управлений Минздрава, под
VB6/Delhpi/VB.NET/C#
Кстати, sendmail.ico откомпилировался уменя нормально, может все
таки дело в программисте?
))