FreeBasic
Главная
Вход
Регистрация
Среда, 16.10.2024, 07:53Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Пример применения шаблона в FreeBasic
haavДата: Вторник, 16.10.2012, 06:58 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Пример применения шаблона в FreeBasic


Хороший пример, показывающий реализацию шаблона для структуры. Я уже не раз применял шаблоны в своих кодах, только для функций.

Автор: MOD

Code

'Template
#Macro vectorDummy ( T ) 'Macro zur Definition des Templates
  #Ifndef vector##T 'Verhindert doppelte Definitionen
   Type vector##T 'Eigentliche Klasse
    As T X , Y , Z 'Beispiel-Records
   End Type
  #EndIf
#EndMacro

vectorDummy ( Integer ) 'Klasse fur den Typ Integer anlegen
Dim As vectorInteger meinVector1
meinVector1.X = 5

vectorDummy ( String ) 'Klasse fur den Typ String anlegen
Dim As vectorString meinVector2
meinVector2.X = "Hallo"

Print meinVector1.X
Print meinVector2.X

Sleep


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Вторник, 30.05.2017, 20:44 | Сообщение # 2
Лейтенант
Группа: Пользователи
Сообщений: 59
Репутация: 4
Статус: Offline
А как реализовать шаблон для функции и для объекта?

Сообщение отредактировал Vitamin - Вторник, 30.05.2017, 21:36
 
haavДата: Среда, 31.05.2017, 07:33 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Вот например:


Код
Dim Shared As Integer iDim(5)
Dim Shared As String sDim(5)

#Macro t (mtype,pref)
    Sub addvalue##pref(pref As mtype)
        Static ic As Integer
        pref##Dim(ic) = pref
        ic+=1
        If ic>5 Then ic = 0
    End Sub
#EndMacro

t(String,s)
t(Integer,i)

' ТЕСТ
For i As Integer = 0 To 5
    addvaluei(i)
Next

For i As Integer = 0 To 5
    addvalues("string =" & i)
Next

For i As Integer = 0 To 5
    ? iDim(i)
Next

For i As Integer = 0 To 5
    ? sDim(i)
Next

Sleep


Конечно данный пример не имеет практического смысла , но для понимания думаю пойдет. Лично я применял шаблоны функций тогда, когда исходник разрастался в объеме одинаковым кодом. Например мне нужна была сортировка для разных типов. По сути сам код сортировки для разных типов практически не менялся, лишь пару строк в нем различались. Там просто напрашивались шаблоны, чтобы сократить размер исходника. В итоге вместо ~100 строк, я получал меньше 40.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Среда, 31.05.2017, 12:03 | Сообщение # 4
Лейтенант
Группа: Пользователи
Сообщений: 59
Репутация: 4
Статус: Offline
Спасибо за пример. Немного поэкспериментировал с шаблоном для объекта, если кому интересно вот пример:

Код
#Macro Vektor (T) ' Создание подстановочных типов   
   #Ifndef Vektor##T ' проверка, что такой тип Тип еще не был создан

      ' создаём объект с указанным именем
      Type Vektor##T ' декларация типа; имя типа получатся слиянием строк
         i As ##T
         Declare Sub test (zn As ##T) ' декларация процедуры вывода         
      End Type
 
      Sub Vektor##T.test (zn As ##T) ' тело процедуры вывода
         ? zn 
      End Sub            
      
   #EndIf
#EndMacro ' ---------------------------------------------------------------

Type MY As String  ' пользовательский тип

Vektor (MY) ' создаём Вектор-Тип с пользовательским Типом "MY" в теле 
Dim As VektorMY meinVector3
meinVector3.i = " S" : Print meinVector3.i  ' ввод/вывод в новый объект
?"Sub = "; : meinVector3.test ("5w") ' процедура вывода "MY"
?
Vektor (Long) ' создаём Вектор-Тип с Типом "Long" в теле 
Dim As VektorLong meinVector4
meinVector4.i = 1 : Print meinVector4.i  ' ввод/вывод в новый объект
?"Sub = "; : meinVector4.test (6) ' процедура вывода "Long"

Sleep


Сообщение отредактировал Vitamin - Четверг, 01.06.2017, 18:30
 
DarkDemonДата: Пятница, 02.06.2017, 13:43 | Сообщение # 5
Полковник
Группа: Друзья
Сообщений: 194
Репутация: -2
Статус: Offline
Эти фичи упрощают код только для пишущего код, для читающего сильно усложняют - имхо.
В целом макросы интересная вещь, но в своих проектах применять сложные(неоднострочные) макросы бы точно не стал.
 
VitaminДата: Пятница, 02.06.2017, 21:01 | Сообщение # 6
Лейтенант
Группа: Пользователи
Сообщений: 59
Репутация: 4
Статус: Offline
В любом приёме есть как свои плюсы, так и минусы. Подобные макросы как раз призваны не для облегчения чтения кода (хотя особых проблем здесь нет), а для борьбы с дубликатами целых блоков кода из-за какого-то разнотипного определения.
Хотя и с небольшими выражениями можно бороться. Например зачем писать Integer, когда можно написать In (в С++ Int).
Вот небольшой пример:

Код
#Define Pauza(Sek) Sleep Sek##000' Пауза(сек) пауза задаётся целыми секундами

' Псевдонимы для стандартных Типов
#Define Bt Byte
#Define UBt UByte
#Define Sh Short
#Define USh UShort
#Define Ln Long
#Define ULn ULong
#Define In Integer
#Define UIn UInteger
#Define LnI LongInt
#Define ULnI ULongInt
#Define Sng Single
#Define Dbl Double
#Define St String
#Define WSt WString
#Define ZSt ZString

' Псевдоним для объявлений Типов
#Define Dm Dim As

' Псевдоним для деклараций
#Define Dec Declare

Dm In i     ' = Dim As Integer i
Pauza(2)     ' Пауза 2 сек


Сообщение отредактировал Vitamin - Суббота, 03.06.2017, 11:36
 
haavДата: Суббота, 03.06.2017, 10:30 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Цитата Vitamin ()
Хотя и с небольшими выражениями можно бороться. Например зачем писать Integer, когда можно написать In (в С++ Int).

Так-то так, главное самому потом не запутаться smile


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 1 из 1
  • 1
Поиск: