|
20.02.2011, 17:30
|
#61
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Афула
Сообщений: 1,700
Написано 658 полезных сообщений (для 1,963 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Сообщение от JeanWinters
Еще вопрос: можно ли использовать статичные константы в типе и другие типы в типе?
|
Константы использовать можно. Другие типы нельзя.
Как ты себе представляешь статичные константы? Константа сама по себе статична, на то это и константа.
__________________
kali surgeon
|
(Offline)
|
|
20.02.2011, 17:40
|
#62
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
В C# например нету оператора Method или Function. Объявление функции и её роль зависит от её значений перед, например в классе:
Это будет аналогично объявлению метода в бм.
А вот:
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, в понятии бм - это метод.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.02.2011, 01:14
|
#63
|
Разработчик
Регистрация: 24.02.2010
Адрес: Новороссийск
Сообщений: 485
Написано 112 полезных сообщений (для 329 пользователей)
|
Ответ: Вопрос-Ответ (для новичков 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. Вроде ж сделал как в хелпе. (Недавно пересел на бимакс, еще плохо его знаю)
__________________
299 792 458
|
(Offline)
|
|
22.02.2011, 01:26
|
#64
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Афула
Сообщений: 1,700
Написано 658 полезных сообщений (для 1,963 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Измени "Method Create:TMaterial(image :TImage)" на "Function Create:TMaterial(image :TImage)"
Выше как раз описана разница между методом и функцией типа.
Насчёт копипаста не скажу, сразу установил blide.
__________________
kali surgeon
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.03.2011, 22:01
|
#65
|
|
Ответ: Вопрос-Ответ (для новичков 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
Догадайтесь с трех раз, что выведется на консоль?!
ЗЫ : Хотя, некоторые БМаксеры считают это небезопасным маневром в плане уборки мусора.
ПРАВКА : Насчет полей я был не прав. Их можно только переопределить.
Последний раз редактировалось Черный крыс, 12.03.2011 в 01:00.
|
|
|
Сообщение было полезно следующим пользователям:
|
|
12.03.2011, 09:05
|
#66
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
А какой может быть практический смысл использования "типа в типе"? Или это просто разработчики языка не доглядели и теперь можно делать такой странный "хак"?..
|
(Offline)
|
|
12.03.2011, 11:35
|
#67
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Почитай что нибудь про ООП. Многое станет ясно.
__________________
|
(Offline)
|
|
12.03.2011, 12:16
|
#68
|
|
Ответ: Вопрос-Ответ (для новичков 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(...) - но это уже черезчур =)
|
|
|
01.05.2011, 21:41
|
#69
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Запускаю блицмакс, а он выдает ошибку "Unable to determine BlitzMax version. Please, reinstall BlitzMax to repair this problem". Это че за хрень?
|
(Offline)
|
|
01.05.2011, 23:39
|
#70
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Афула
Сообщений: 1,700
Написано 658 полезных сообщений (для 1,963 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Пожалуйста, переустанови BlitzMax, чтобы исправить эту проблему.
__________________
kali surgeon
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.05.2011, 00:01
|
#71
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Спасибо, кэп. Переустановил, то же самое.
|
(Offline)
|
|
03.05.2011, 15:21
|
#72
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
У тебя Widows?
|
(Offline)
|
|
03.05.2011, 20:43
|
#73
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
К сожалению, да. Поставил Blide, заработало.
|
(Offline)
|
|
18.06.2011, 15:37
|
#74
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Есть List, в нём несколько int. Проходим по нему For..Each'ем - MAV - пишет, что индекс цикла (который, естественно, тоже int) должен быть объектом. Разве Int это не тип?
Error: " EachIn index variable must be an object"
|
|
(Offline)
|
|
19.06.2011, 21:36
|
#75
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,361
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Сообщение от Nerd96
Есть 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])
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:19.
|