forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Интересно и вроде недокументровано (http://forum.boolean.name/showthread.php?t=11370)

impersonalis 08.12.2009 17:15

Интересно и вроде недокументровано
 
2Джокер - не читай
Сейчас натолкнулся на то, что операторы сравнения перегружены для строк. Причём не как сравнение тайпкаста контента к числу, а как облегчённое подобие функций типа strcmp из С++.
Пример:
Код:

Local bool%=Str("70")<Str("600")
Print bool
WaitKey()
End

Может показаться, что из-за низкой типизации б3д сравнит 70 и 600 и вернёт истину - дудки. Строка "70" при сортировке должна идти после "600" и потому "больше" - результат равен лжи.
Ещё пример:
Код:

Local bool%=Str("7.0")<Str("6.00")
Print bool
WaitKey()
End

результат - 0
Код:

Local bool%=Str("100")<Str("12")
Print bool
WaitKey()
End

результат - 1

Напрягает, что в хелпе ничего не нашёл.

SBJoker 08.12.2009 17:29

Ответ: Интересно и вроде недокументровано
 
Цитата:

Сообщение от impersonalis (Сообщение 128763)
2Джокер - не читай

Опять дискриминация...

impersonalis 08.12.2009 18:07

Ответ: Интересно и вроде недокументровано
 

Да потому что суть алгорима такова будет (я тебя знаю ;) ):
1) прочитать начало - напсиать что Импер не догадался и только лошара может не знать о перегружееном операторе
2) отослать к справочникам по Си (хотя Импер какбе намекнул про strcmp)
3) разжечь холивар на тему "блитц-ацтой"
вараиант_исключение (сработает если ни один из трёх невозможно реализовать, например после выхода из тела поста по директиве "джокер не читай") - поофтопить.

Итого:
джокер на коне (уже видим ряд спс к его посту)
импер в говоне (ещё увидим тrавлю)

moka 08.12.2009 19:39

Ответ: Интересно и вроде недокументровано
 
Чего это ты Импер?
Вроди у вас конфликтов в открытую на форуме не наблюдалось..

Dzirt 08.12.2009 19:55

Ответ: Интересно и вроде недокументровано
 
MoKa,а где здесь конфликт?...лично я воспринимаю пост Импа как дружественную шютку,не более....

moka 08.12.2009 21:24

Ответ: Интересно и вроде недокументровано
 
Он уже просто избегает, как побитый енот...

impersonalis 08.12.2009 21:40

Ответ: Интересно и вроде недокументровано
 
Цитата:

Сообщение от MoKa (Сообщение 128806)
Он уже просто избегает, как побитый енот...

эмм?
Спасибо, канеш, что внимательно всё прочитали и оценили по достоинству. до свиданья

Смотрю со времён основания мои попытки кому-то что-то донести из того что я знаю заканчивались плачевно. Ну ихренли корчить из себя.
Тоже стану троллем-шутом. Готовимся к первым рецензиям.
Доканало, блджад.

DeadElf 08.12.2009 22:59

Ответ: Интересно и вроде недокументровано
 
давайте вернёмся к теме, а?))

короче, как я понял по вот этому коду:
Цитата:

Local bool%=Str("70")<Str("600")
Print bool
WaitKey()
End
ты хочешь проверить, будет ли 70 меньше чем 600. блиц выводит, что нет.
почему? смотрим хелп по команде str:

Код:

Используйте эту команду, чтобы преобразовать числовое значение в строковое значению для использования с командами обработки строк. Blitz запросто печатает числовые значения так же, как и строчные, но если Вы захотите использовать такие функции, как LEFT$ или подобные, Вы должны будете преобразовать вашу числовую переменную в строчную. Заметьте: в процессе преобразования все 6 десятичных цифр будут представлены в виде числа с плавающей запятой .

Если Вы пожелаете выполнить обратное действие - преобразовать строку в число, то не найдете в Blitz-е никакой команды, эквивалентной команде Val в другтх версиях Бейсика. Вместо этого просто присвойте строковую переменную числовой переменной, и Blitz сам преобразует её.

проще говоря, он преобразует число 70 в "70". а ты задаешь ему сразу "70". понятное дело, заковыка... блиц путается и сравнивает значения посимвольно: "7">"6"? да, выходим из проверки. получаем 0. если же сделать int("70") и int("600"), то получим, что всё в порядке. если же поставить Str(70) и Str(600), то опять получим 0, потому как он проверяет посимвольно. Никаких проблем и ошибок нет.

impersonalis 08.12.2009 23:03

Ответ: Интересно и вроде недокументровано
 
блджад, с Джокером не вышло - нашёлся ещё один, читающий по диагонали. Спасибо, комрад)
ИСХ никто не хочет называться свои настоящим именем - Кэп О.

SBJoker 08.12.2009 23:33

Ответ: Интересно и вроде недокументровано
 
Смысл темы в том что блитц может сказать какая строка больше другой простым сравнением. По правилам сортировки, а не по длине.
Искринне ваш, К.О.

BlackOut 09.12.2009 00:01

Ответ: Интересно и вроде недокументровано
 
не поверите, но спасибо за тему, слэм в топку!

impersonalis 09.12.2009 20:30

Ответ: Интересно и вроде недокументровано
 
Возможно этот пример более зрелищен:
Код:

Local X$,Y%
X=600
Y=70
Local bool%=X<Y
If bool
        Print "X<Y"
EndIf
WaitKey()
End

Реузльтат - X<Y

Dzirt 09.12.2009 21:48

Ответ: Интересно и вроде недокументровано
 
занятно...хотя из первого поста итак все стало ясно) ...ну я так понимаю не всем.Вообще молодцом Имп,учтем!

moka 10.12.2009 02:59

Ответ: Интересно и вроде недокументровано
 
Цитата:

Сообщение от impersonalis (Сообщение 128949)
Возможно этот пример более зрелищен:
Код:

Local X$,Y%
X=600
Y=70
Local bool%=X<Y
If bool
        Print "X<Y"
EndIf
WaitKey()
End

Реузльтат - X<Y

А сколько bool будет таки?
Print "X<Y "+bool
что-то смущает, я вообще никогда так в блице не присваивал сравнения к переменным, только сперва в HLSL, а затем и в C++ такое увидел..

impersonalis 10.12.2009 03:53

Ответ: Интересно и вроде недокументровано
 
Цитата:

Local X$,Y%
X=600
Y=70
If X<Y
Print "X<Y"
EndIf
WaitKey()
End
результат тоже.

Сударь, как по вашему работает условный оператор?
Он всего-лишь делает или нет джамп принимая на вход (ТОЛЬКО!) истину или ложь. В свою очередь операторы сравнения возвращают 1 при истинности неравенства и 0 в обратном случае.
Так что HLSL и С++ в этом плане - всего-лишь инерция парадигмы. Даже языки различных ассемблеров как правило лишь сохраняют флаг результата сравнения, а подобие if его обрабатывает.
Собсвтенно, никаких рациональных мыслей "как реализовать if иначе" у меня нет (один говнокод).

Вот ещё в таком случае пример (выходит тоже не очень доументированной возможности):
Цитата:

Function GetMax%(a%,b%)
Return (a>b)*a+(b>a)*b+(a=b)*a
End Function

Local i%
For i=1 To 10
Local q=Rand(1,10)
Local w=Rand(1,10)
DebugLog "["+q+";"+w+"] -> "+GetMax(q,w)
Next
WaitKey()
End
результат для дефолтной инициализирующей последовательности ГПСЧ:
Цитата:

[4;8] -> 8
[4;5] -> 5
[6;8] -> 8
[6;2] -> 6
[1;7] -> 7
[2;5] -> 5
[3;3] -> 3
[7;7] -> 7
[1;10] -> 10
[5;6] -> 6
Так что, борец за права енотов, спуститесь с метафор на землю - нам ещё нужны хорошие дизайнеры.

impersonalis 11.12.2009 02:00

Ответ: Интересно и вроде недокументровано
 
Цитата:

хорошие дизайнеры.

эт тип с большой буквы было - если кто не понял, а то уже боишься мысли формулировать.


Часовой пояс GMT +4, время: 13:02.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot