forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Вопрос-Ответ (для новичков BlitzMax) (http://forum.boolean.name/showthread.php?t=13756)

baton4ik 20.02.2011 17:30

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от JeanWinters (Сообщение 179750)
Еще вопрос: можно ли использовать статичные константы в типе и другие типы в типе?

Константы использовать можно. Другие типы нельзя.
Как ты себе представляешь статичные константы? Константа сама по себе статична, на то это и константа.

moka 20.02.2011 17:40

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
В C# например нету оператора Method или Function. Объявление функции и её роль зависит от её значений перед, например в классе:
Код:

public string Name () {
Это будет аналогично объявлению метода в бм.
А вот:
Код:

public static string Name () {
Будет аналогично функции, и вызывается не через объект (хотя и так можно), а через сам класс, например:
Код:

public class TUser {
  private string _nameFirst;
        private string _nameLast;
 
        ...
     
        public static string Name {
              get { return MakeName(_nameFirst,_nameLast); }
          }
        public static string MakeName(string first, string last) {
              return first+" "+last;
        }
     
        ...
}

...

TUser _user = new TUser();
...
_user.Name // получает имя юзера.
...
TUser.MakeName("James","Bond") // получает имя "James Bond"

Вот MakeName - это функция класса, она есть статичная функция.
А функция Name, в понятии бм - это метод.

DeeJex 22.02.2011 01:14

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Объясните нубу:
1) Почему переодически отключается возможность копипастирования кода в стандартном IDE?
2)
Код:

Type TMaterial
Field img :TImage
        Method Create:TMaterial(image :TImage)
                Mat :TMaterial = New TMaterial
                        Mat.img = image
                Return Mat
        EndMethod
End Type
...
Mat :TMaterial = TMaterial.Create(LoadImage("dat\banana.png"))

Ошибка на Create. Вроде ж сделал как в хелпе. (Недавно пересел на бимакс, еще плохо его знаю)

baton4ik 22.02.2011 01:26

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Измени "Method Create:TMaterial(image :TImage)" на "Function Create:TMaterial(image :TImage)"
Выше как раз описана разница между методом и функцией типа.

Насчёт копипаста не скажу, сразу установил blide.

Черный крыс 11.03.2011 22:01

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
1) Типы внутри типов использовать МОЖНО., естественно, обьявить новый тип в теле другого типа никто вам не даст. А вот такая запись вполне допустима :

Код:

Type TCar
    Field _pos:Float
    Method Update()
        Type TTire
            field _x:Float
            Method Update()
                ...
            EndMethod
        EndType
    EndMethod
EndType

Тип TTire - временный, или по другому статичный.

2) Насчет статичных функций. Всегда считал, что с приходом методов они стали атавизмом. Ну нету таким функциям рационального использования и все тут! Единственное что они привносят - так это путаницу, и нечитабельность кода. Более того они не являются частью ООП. Многие новички любят делать такими функциями конструкторы и деструкторы, но вот только с точки зрения ООП - это все равно, что загнать себя в угол и кричать потом от безисходности и нечитабельности кода. Да и еще, статичные функци начинают "по настоящему" мешать, если речь идет о развитии и поддержке кода, так как они убивают само понятие "наследования" читай ООП.

3) Отсюда вывод -> Никаких функций в типах. Конструкторы и деструкторы можно легко сделать на методах.

Код:

Type TVector
    Field x:Float
    Field y:Float
 
    Method New() ' Дефолтный конструктор
        x=0 ; y=0
    EndMethod
 
    Method Create:TVector(x:Float = 0.0, y:Float = 0.0) ' Расширенный конструктор
        Self.x=x ; Self.y=y
        Return Self
    EndMethod
 
    Method Delete() ' Деструктор для GC
        Free()
    EndMethod
 
    Method Free() ' Принудительный деструктор
        x=Null ; y=Null
    EndMethod
EndType

Юзаем так :

Код:


Local v0:TVector = New TVector ' x=0 ; y=0
Local v1:TVector = New TVector.Create(10.0,15.0) ' x=10.0 ; y=15.0
 
v0 = Null ' Delete()
v1.Free()
v1 = Null

4) Как всем известно если вы в потомке обьявляете одноименный метод предка, то метод потомка заместит метод предка, а метод предка станет доступным через кейворд 'Super'. - В той же мере это относится и к полям, они тоже перекрываются и поля предка доступны через это же слово. Пример :

Код:

Type TParent
Field _value:String = "Parent field!"
EndType
 
Type TChild Extends TParent
Field _value:Int = 100
 
Method Test()
DebugLog(Super._value)
DebugLog(String(_value))
EndMethod
EndType

Догадайтесь с трех раз, что выведется на консоль?!

ЗЫ : Хотя, некоторые БМаксеры считают это небезопасным маневром в плане уборки мусора.

ПРАВКА : Насчет полей я был не прав. Их можно только переопределить.

JeanWinters 12.03.2011 09:05

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
А какой может быть практический смысл использования "типа в типе"? Или это просто разработчики языка не доглядели и теперь можно делать такой странный "хак"?..

SBJoker 12.03.2011 11:35

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Почитай что нибудь про ООП. Многое станет ясно.

Черный крыс 12.03.2011 12:16

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Это скорость.

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

Код:

Global value:Int = 100
 
Function Test()
    Local value:Int = 50
    DebugLog value
EndFunction
 
Function Test2()
    DebugLog value
EndFunction
 
Function Test3(value:Int)
    DebugLog value
EndFunction

Функция, метод или тип представляет собой что то вроде ветки. Быстрее всех выполнится функция Test3 самой медленной будет Test2.
В одно время Oxid высказывал свое мнение по этому поводу : если в функции обьявить локальную переменную и назвать ее коротким именем, то есть шанс что переменная занесется в регистр процессора для мнгновенного доступа.

Для глобальной функции приоритет приблизительно таков : аргументы->локальные переменные->глобальные переменные.

Для метода : аргументы->поля->локальные переменные->глобальные переменные внутри типа->глобальные переменные.

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

А если рассматривать целиком весь БМакс, то он весь состоит из чунков (порций кода), - отсюда его модульность.
По идее глобальную функцию (и не только ее) можно вызвать класически : DrawImage(image,x,y,0)
А можно явно указать с какого чунка вызвать функцию : brl.max2d.DrawImage(image,x,y), в той же степени это относится ко всему остальному.
Хотя на самом деле компилятор на стадии формирования кода все вызовы приводит ко второму виду.

Для пытливых - можно пойти еще дальше : brl.max2d.TImage(image).Frame(0).Draw(...) - но это уже черезчур =)

Nerd 01.05.2011 21:41

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Запускаю блицмакс, а он выдает ошибку "Unable to determine BlitzMax version. Please, reinstall BlitzMax to repair this problem". Это че за хрень?

baton4ik 01.05.2011 23:39

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Пожалуйста, переустанови BlitzMax, чтобы исправить эту проблему.

Nerd 02.05.2011 00:01

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Спасибо, кэп. Переустановил, то же самое.

FireOwl 03.05.2011 15:21

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
У тебя Widows?

Nerd 03.05.2011 20:43

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
К сожалению, да. Поставил Blide, заработало.

Nerd 18.06.2011 15:37

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Есть List, в нём несколько int. Проходим по нему For..Each'ем - MAV - пишет, что индекс цикла (который, естественно, тоже int) должен быть объектом. Разве Int это не тип?
Цитата:

Error: " EachIn index variable must be an object"

Randomize 19.06.2011 21:36

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Nerd96 (Сообщение 192106)
Есть List, в нём несколько int. Проходим по нему For..Each'ем - MAV - пишет, что индекс цикла (который, естественно, тоже int) должен быть объектом. Разве Int это не тип?

Int, Float, Double, Byte в лист не засунуть.
А вот String пожалуйста. Можешь делать так:
Код:

Local str:String
str[0] = 100500 'твоё число
List.AddLast(str)

Потом извлекать:
Local number:Int = Int(List.ValueAtIndex(0)[0])



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

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