Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 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-сайт: basicproduction.nm.ru/
 Профиль | | #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-сайт: basicproduction.nm.ru/
 Профиль | | #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
  ;Dim 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-сайт: basicproduction.nm.ru/
 Профиль | | #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-сайт: basicproduction.nm.ru/
 Профиль | | #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-сайт: basicproduction.nm.ru/
 Профиль | | #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-сайт: basicproduction.nm.ru/
 Профиль | | #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 откомпилировался уменя нормально, может все
таки дело в программисте?

:)))

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам