FreeBasic
Главная
Вход
Регистрация
Суббота, 23.09.2017, 10:18Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Freebasic » Вопросы по языку FreeBasic » Вышла новая версия компилятора FreeBasic (1.00.0) (Вышла новая версия компилятора FreeBasic (1.00.0))
Вышла новая версия компилятора FreeBasic (1.00.0)
haavДата: Понедельник, 15.09.2014, 09:26 | Сообщение # 1
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
Вышла новая версия компилятора FreeBasic (1.00.0)

Так вот постепенно, компилятору FreeBasic в этом году исполнилось 10 лет. Большая благодарность разработчикам, что они не бросили свой продукт и продолжают нас радовать новыми версиями. Новую версию решили назвать 1.00.0 и я думаю это вполне заслуженно, хотя это надо было сделать уже несколько лет назад. Основной упор новой версии был на создание 64х битной версии компилятора для 64х битных платформ. На самом деле данная версия уже давно ходила неофициально, хотя была сделана исключительно под пакет MinGW. Но вот свершилось и теперь владельцы компьютеров на базе 64х битной системы, могут пользоваться официальной версией с официальной поддержкой разработчиков и сообщества (что немаловажно!!!).

И так основные нововведения :

Код
[*]64х битная версия компилятора
[*]Значительно улучшено разрешение перегрузки
[*]Динамические массивы внутри определяемых пользователем типов (например: array(Any) As Integer)
[*]Новый синтаксис объявления динамических массивов с определенным количеством размеров, но без начальных границ: Dim array1 (Any), array2 (Any, Any)
[*]Все результаты функций сейчас могут быть проигнорированы в месте вызова
[*]ByVal As String теперь работает должным образом
[*]NEW / DELETE сейчас работает с типом STRING
[*]Оператор [] перегружается
[*]Len () теперь может быть перегружена для определяемых пользователем типов
[*]Потокобезопасная версия FB графической библиотеки (libfbgfxmt)


И конечно много исправлений. Весь список ЗДЕСЬ

Скачать новые версии компилятора можно ОТСЮДА или с Оф. сайта


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Понедельник, 15.09.2014, 11:31 | Сообщение # 2
Подполковник
Группа: Пользователи
Сообщений: 124
Репутация: 2
Статус: Offline
Несколько вопросов:

Потокобезопасная версия FB графической библиотеки
Это несколько Screen одновременно, не мешающих друг другу?

ByVal As String теперь работает должным образом
А что было не так?
 
haavДата: Понедельник, 15.09.2014, 12:44 | Сообщение # 3
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
Цитата WQ ()
Потокобезопасная версия FB графической библиотекиЭто несколько Screen одновременно, не мешающих друг другу?

Не думаю. Скорее исправление или изменение библиотеки для автоматической обработки потокобезопасности при использовании встроенной графики FB. Ранее видать были проблемы, хотя я с ними не сталкивался.

 
Цитата
ByVal As String теперь работает должным образом
А что было не так?

Вообще-то передать тип STRING в процедуру можно было только по Byref (по ссылке). Я пробовал раньше передавать его по Byval (по значению), ничего хорошего не получалось (вылетало). Видать данную возможность внедрили и это хорошо! Не всегда нужно, чтобы в процедуре оказывалась реальная строка, чаще нужно чтобы туда передавалась ее копия.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Четверг, 18.09.2014, 20:00 | Сообщение # 4
Майор
Группа: Друзья
Сообщений: 90
Репутация: 3
Статус: Offline
ну что я скажу. поскольку я обладаю x64 системой, вобщем ещё всё в x64 далеко сыро. простой пример с окном, сразу же вылетает с ошибкой на регистрации класса окна.
библиотек для winapi почти нету. приходится из mingw x64 таскать.
а я то надеялся, свои часики откомпилить под x64. мои dll, вродь откомпилировались, а вот с gui огромная проблема. да, кстати, с winsock вообще фигня. я либу то вродь взял, но при считывании данных из инета, fфункция recv мне возвращает не 8192 как я у неё прошу, а вообще 4 миллиарда с чем-то. и соответственно, когда такое в индекс массива попадает, прога падает.
очень жаль, что для x64 они отказались от ассемблера, все компилится в промежжуточный c код.

Добавлено (18.09.2014, 20:00)
---------------------------------------------
короче, попробовал я сделать консольную прогу для своей dll говорящих часиков, нет не заговорили. где-то спотыкаются на поиске файлов. есть там у меня функция, которая ищет файлы голосовых данных. вродь, всегда следовал согласно архитектуре, что интегер на разных платформах разный. да ладно мои проги, элементарное окно, как я сказал выше, не работает. из всего пока только MessageBox нормально отрабатывает.
вобщем, наверное не следовало x64 запускать, а может ... так быстрее глюки на обкатках найдут.

 
haavДата: Четверг, 18.09.2014, 21:15 | Сообщение # 5
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
Да я посмотрел в архив. Там вообще нихрена кроме crt и еще нескольких заголовков нет. Нет так кодить, объявляя все сам, точно не захочешь. Кстати ты упомянул про компиляцию, как там происходит на самом деле? Промежуточный код - это что-то типа сишного? Я поглядел в папку BIN , вроде файлы ассемблера присутствуют... Если компилятор их не использует, тогда зачем их туда запихали?
С другой стороны это только первая версия 64х битного компилятора... Москва не сразу строилась. Постепенно будут дополнять заголовками, и хорошо, что админ сказал, что хочет выпускать версии чаще.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Пятница, 19.09.2014, 01:17 | Сообщение # 6
Майор
Группа: Друзья
Сообщений: 90
Репутация: 3
Статус: Offline
Да, там именно промежуточный c код. такого же на x86 можно добиться набрав в командной строке опцию -gen gcc.
для чего лежит ассемблер, думаю для того, чтоб cc1.exe перегнал промежуточный код в ассемблер, а ассемблер делал уже объектные файлы.
в x64 версии лежит в папке бин папка libexec. вот там лежит cc1.exe.
по поводу заголовочных файлов, тут если всё грамотно построить, конкретно под x64 отдельные не нужны, а вот либы - вот тут оно конечно надо.
будем ждать, я то думал, ща либов надёргаю и буду радоваться жизни, но пока баги ещё есть, главное начало положено.
 
haavДата: Пятница, 19.09.2014, 07:52 | Сообщение # 7
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
Я попробовал на виртуалке 64х битную систему и 64х битный компиль. У меня регистрация класса проходит, но окно не создается, ошибка 1400. Вот этот код я пробовал (отпишись как он у тебя работает):


Код
Type Point
     x As Long
     y As Long
End Type

type MSG
     hwnd as Long
     message as Long
     wParam as Long
     lParam as Long
     time as Long
     pt as POINT
end Type

type WNDCLASSEX
     cbSize as Long
     style as Long
     lpfnWndProc as Long Ptr
     cbClsExtra as Long
     cbWndExtra as Long
     hInstance as Long
     hIcon as Long
     hCursor as Long
     hbrBackground as Long
     lpszMenuName as ZString Ptr
     lpszClassName as ZString Ptr
     hIconSm as Long
end Type

declare function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (byval as LONG, byval as ZString ptr, byval as ZString ptr, byval as LONG, byval as LONG, byval as LONG, byval as LONG, byval as LONG, byval as LONG, byval as LONG, byval as LONG, byval as Long PTR) as Long PTR
declare function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal As ZString ptr) As Long
declare sub PostQuitMessage Lib "user32" Alias "PostQuitMessage"(byval as long)
declare function DefWindowProc Lib "user32" alias "DefWindowProcA" (byval as LONG, byval as LONG, byval as LONG, byval as LONG) as LONG
declare function RegisterClassEx Lib "user32" alias "RegisterClassExA" (byval as WNDCLASSEX ptr) as Long
declare function GetMessage Lib "user32" alias "GetMessageA" (byval as MSG ptr, byval as LONG, byval as LONG, byval as LONG) as Long
declare function DispatchMessage Lib "user32" Alias "DispatchMessageA" (byval as MSG ptr) as LONG

Dim msg As MSG  
Dim As WNDCLASSEX wc  
Dim As String NameClass="MyClass"
Dim As Long Hinst=GetModuleHandle(0)  

Function wndproc(hwnd As LONG, msg As Long,_
          wparam As LONG, lparam As LONG) As Long
     Select Case msg
         Case 2
             PostQuitMessage(0)
     End Select
     Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function

With wc
     .cbSize=SizeOf(WNDCLASSEX)
     .style=2 Or 1
     .lpfnWndProc=@WndProc
     .hInstance=Hinst
     .hIcon=0
     .hCursor=0
     .hbrBackground=6
     .lpszClassName=StrPtr(NameClass)
     .hIconSm=.hIcon
End With

If RegisterClassEx(@wc)=0 Then
     Print "Register error, press any key"
     Sleep
     End
Endif

CreateWindowEx(0,NameClass,"",_
&h10000000 Or &hcf0000,100,100,300,300,0,0,Hinst,0)

While GetMessage(@msg,0,0,0)
     DispatchMessage(@msg)
Wend

На x86 этот код работает, но на x64 никак не хочет. Может дело в том, что я на виртуалке тестирую.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Воскресенье, 21.09.2014, 18:19 | Сообщение # 8
Майор
Группа: Друзья
Сообщений: 90
Репутация: 3
Статус: Offline
неа, у меня регистрация класса не проходит. странно, в данном коде вродь непосредственно к dll обращения идут, без всяких связующих библиотек, но всё-равно падает.
 
AlecДата: Понедельник, 22.09.2014, 11:17 | Сообщение # 9
Лейтенант
Группа: Друзья
Сообщений: 73
Репутация: 1
Статус: Offline
Про обновление заголовков для 64-битных систем товарищ dkl говорил, что они не будут обновлены, так как это довольно трудоёмкая работа для одного человека, а он почти один трудился над этой версией. Т.е. он сразу предупредил, что так будет и нужна помощь сообщества в этом.

В любом случает радует, что ФБ больше не ребёнок, он стал взрослым (пока молодым и зелёным  smile ), как я писал на офиц. сайте. Так как у меня 64-бит. система. мне тоже интересно потестить новую версию.


WorldSim3D - 3D движок для FreeBasic, для PC. Мощная 3D графика и простота программирования. Ознакомиться.
 
haavДата: Понедельник, 22.09.2014, 18:17 | Сообщение # 10
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
В общем на оф. сайте мне подсказали кое-что. Я еще далек от полного понимания  компиляции и работы 64х приложений.  Все хендлы, а так же некоторые (возможно все) указатели должны быть 64х битные. Вообще конечно по хорошему надо как следует вглядываться в 64х битные заголовки на других компиляторах. Но вот кусок кода, который у меня запускает окно , после компиляции 64х битного компилятора:


Код
Type Point
     x As Long
     y As Long
End Type

type MSG
     hwnd As Integer
     message as Long
     wParam as Integer
     lParam as Integer
     time as Long
     pt as POINT
end Type

type WNDCLASSEX
     cbSize as Long
     style as Long
     lpfnWndProc as Integer Ptr
     cbClsExtra as Long
     cbWndExtra as Long
     hInstance as Integer
     hIcon as Integer
     hCursor as Integer
     hbrBackground as Long
     lpszMenuName as ZString Ptr
     lpszClassName as ZString Ptr
     hIconSm as Integer
end Type

declare function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (byval as LONG, byval as ZString ptr, byval as ZString ptr, byval as LONG, byval as LONG, byval as LONG, byval as LONG, byval as LONG, byval as integer, byval as integer, byval as integer, byval as integer) as integer
declare function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal As ZString ptr) As Integer
declare sub PostQuitMessage Lib "user32" Alias "PostQuitMessage"(byval as long)
declare function DefWindowProc Lib "user32" alias "DefWindowProcA" (byval as integer, byval as LONG, byval as integer, byval as Integer) as LONG
declare function RegisterClassEx Lib "user32" alias "RegisterClassExA" (byval as WNDCLASSEX ptr) as Long
declare function GetMessage Lib "user32" alias "GetMessageA" (byval as MSG ptr, byval as integer, byval as LONG, byval as LONG) as Long
declare function DispatchMessage Lib "user32" Alias "DispatchMessageA" (byval as MSG ptr) as LONG

Dim msg As MSG  
Dim As WNDCLASSEX wc  
Dim As String NameClass="MyClass"  
Dim As Long Hinst=GetModuleHandle(0)  

Function wndproc(hwnd As LONG, msg As Long,_
          wparam As LONG, lparam As LONG) As Long
     Select Case msg
         Case 2
             PostQuitMessage(0)
     End Select
     Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function

With wc
     .cbSize=SizeOf(WNDCLASSEX)
     .style=2 Or 1
     .lpfnWndProc=@WndProc
     .hInstance=Hinst
     .hIcon=0
     .hCursor=0
     .hbrBackground=6
     .lpszClassName=StrPtr(NameClass)
     .hIconSm=.hIcon
End With

If RegisterClassEx(@wc)=0 Then
     Print "Register error, press any key"
     Sleep
     End
Endif

CreateWindowEx(0,NameClass,"",_
&h10000000 Or &hcf0000,100,100,300,300,0,0,Hinst,0)

While GetMessage(@msg,0,0,0)
     DispatchMessage(@msg)
Wend
 
Вполне возможно, что где-то продекларировал неправильно, мне неохота скачивать GCC и смотреть как там идет декларация для функций и структур.
Получается, что компилятор не сырой, это мы еще плохо понимаем специфику 64х битных приложений. Если объявить все правильно, то получается вполне работоспособное приложение smile


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Вторник, 23.09.2014, 16:14 | Сообщение # 11
Майор
Группа: Друзья
Сообщений: 90
Репутация: 3
Статус: Offline
так, у меня этот пример заработал. я ведь глядел, заголовочные файлы, ну по крайней мере объявляемые декларации везде одинаковые. мож конечно, handle объявлен не так, в 32 битной он объявлен как any ptr, соответственно, в 32 битной системе указатель 4 байта, в 64 8 байт.
integer - на платформах разный, на старых 16 битных системах он 16 бит, на 32 - 32 бита, на 64 - 64 бита.
микрософты всех запутали с переопределением типов, теперь разбирайся с этим.
вобщем, буду пробовать потихоньку переделывать заголовки, если оно возможно, чтоб и там и там работали, думаю микрософты не дураки, и предусмотрели то, что когда-то придется портировать и на другие платформы.
тут конечно вручную убьёшься, можно swik заюзать. конечно ручками потом пройтись придется, будем пробовать. если получится, обязательно надо чтоб они включили заголовки в следующий релиз. ну или выпустили обновление, например, 1.0.1.
попробую существующие глянуть, базовые типы, и т.д.

Добавлено (23.09.2014, 15:41)
---------------------------------------------
как в воду глядел поповоду того, что нас микрософт с типами запутал. вот сегодня статьи нашёл:
http://msdn.microsoft.com/ru-ru/library/dd335933.aspx
прямо оттуда начинаем читать, и идем потом по приведённым там ссылкам на доп статьи

Добавлено (23.09.2014, 16:14)
---------------------------------------------
кажется допёрло. ща я это проверю. вот что там пишут:
В общем, если не считать нескольких исключений, все типы, отличные от указателей и size_t, совершенно одинаковы, что в старой Win32, что в новой Win64. То есть у 64-битного указателя размер 8 байтов, а у int, long, DWORD и HANDLE остался прежний размер - 4 байта.

во Freebasic везде хэндл определён как указатель any ptr, теперь, получается, надо просто базовые типы uint, handle, dword переписать s uinteger на ulong, хендл с указателя на long.
да, ну видимо и с ними hinstance, hmenu, hbrush и т.д.
хотя в mingw64 всё осталось так же как было. либо там идет переопределение, хотя, как можно переопределить void *. блин, не думал что будет уж так всё замороченно с этим WinApi на x64.

 
haavДата: Вторник, 23.09.2014, 16:59 | Сообщение # 12
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
Если есть сомнения, то выгоднее поставить minGW 64х битный. И там простенький код проверки размера типа ,  аналог FB:

print sizeof(integer)
print sizeof(handle)
...

Так например переписываешь заголовок, видишь тип HINSTANGE , хрен его знает сколько он в размере на 64х, а тут забил его в С++ код и проверил. Я бы может помог чем-то, но на виртуалке 64х битная система тормозит жутко (работать вообще невозможно) , более того, там часто синий экран . Я тот код замучался запускать и править... А на винт ставить демо или пиратку не хочу.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Вторник, 23.09.2014, 19:54 | Сообщение # 13
Майор
Группа: Друзья
Сообщений: 90
Репутация: 3
Статус: Offline
да, оно верно. я до sizeof даже и не додумался. бывает. компиль стоит, ща глянем.

Добавлено (23.09.2014, 18:34)
---------------------------------------------
ну чтож. проверил, как бы не так, но хендл 8 байт, а вот тип int в c - 4 байта! не может быть! но факт.
вот что на mail люди пишут:

Цитата
тип int не 4 и не 8 байт :), все ответы неправильные. модификаторы типа short и long тоже не ничего не говорят о размере. Невероятно, но факт - C++ не стандартизирует размер целочисленных типов, на разных платформах, это могут быть совершенно разные значения sizeof(int), 16 бит (2 байта) , 32 бита (4 байта) - мы привыкли к этому, 64 бита - 8 байт, размер занимаемой памяти устанавливается не стандартом C++, а, компилятором, по-идее можно сделать и другие значения (типа дурацких 6 байтов) . Стандарт гарантирует только отношение : sizeof char <= sizeof short <= sizeof int <= sizeof long . На win64 msvc++ sizeof int = 4 байтам, т. е. нет, он не занимает 8 байт в виндовсе64, на некоторых linux 64 платформах - да, занимает 8 байт.


получается, gcc тоже 4 байта, а значит, в заголовках все integer надо поправить на long, uinteger на ulong.
и теперь почти на 100 процентов уверен в том, что ошибки не в параметрах передаваемых функциям, а в неправильных размерах структур из-за этой путанницы, что микрософтам в винде захотелось тип int оставить 32 битным, а во FreeBasic integer 64.
почему не может быть ошибок в параметрах к функциям?
дело в том, что даже если в параметр функции передать тип short, в зависимости от платформы, он все-равно передастся в параметр как 32 битный, если система 32 бита, или 64 битный если система 64 бита.
простой пример:
компилируем как 32 бита

Код
sub test(byval a as short,byval b as byte)
print a,b
end sub
test(321,34)
]

теперь поглядим что нам сделал асм

Код
.globl _TEST@8
_TEST@8:
push ebp
mov ebp, esp
.Lt_0004:
push 2
movzx eax, word ptr [ebp+8]
push eax
push 0
call _fb_PrintShort@12
push 1
movzx eax, byte ptr [ebp+12]
push eax
push 0
call _fb_PrintByte@12
.Lt_0005:
mov esp, ebp
pop ebp
ret 8
.balign 16

.globl _main
_main:
push ebp
mov ebp, esp
and esp, 0xFFFFFFF0
sub esp, 4
mov dword ptr [ebp-4], 0
call ___main
push 0
push dword ptr [ebp+12]
push dword ptr [ebp+8]
call _fb_Init@12
.Lt_0002:
push 34
push 321
call _TEST@8
.Lt_0003:
push 0
call _fb_End@4
mov eax, dword ptr [ebp-4]
mov esp, ebp
pop ebp
ret


поглядим функцию тест по внимательней:

Код
_TEST@8:
push ebp
mov ebp, esp
.Lt_0004:
push 2
movzx eax, word ptr [ebp+8]
push eax
push 0
call _fb_PrintShort@12
push 1
movzx eax, byte ptr [ebp+12]
push eax
push 0
call _fb_PrintByte@12
.Lt_0005:
mov esp, ebp
pop ebp
ret 8


командой
movzx eax, word ptr [ebp+8]
мы забираем первый параметр функции
movzx eax, byte ptr [ebp+12]
мы забираем второй параметр, по логике должно быть так:
movzx eax, byte ptr [ebp+10]
вот вам доказательство того, что все параметры передаваемые функциям имеют  размер в зависимости от архитектуры.
в x64 системах, вообще первые 4 параметра функций записываются не в стек, а в специальные 64 битные регистры, и неважно что задумано кодером, байт или long, параметр будет занимать 64 бита.
несмотря на то, что в стек они не записываются, всё-равно под эти 4 параметра стек надо резервировать, ибо если понадобятся эти регистры для других целей, то можно будет без проблем скопировать параметры из регистров в стек, и использовать регистры.

Добавлено (23.09.2014, 19:54)
---------------------------------------------
поглядел повнимательнее, не всё надо на long заменять, в общем где стоят директивы типа:
#ifdef _win64
тут в mingw как правило объявляются указатели, и они должны уже быть не long ptr а longint ptr ну или integer ptr
не заменить тупо на as long, а сначала просматривать файлы на предмет кросс-платформ компиляции, а потом уже что-то заменять.
во FreeBasic директива __FB_WIN32__, работает на двух платформах.
видимо придется делать так:
#ifdef __FB_WIN32
#ifdef __FB_64BIT__
инструкции для x64
#else
инструкции для x86
#endif
#else
не поддерживаемая платформа
#endif
обидно, если так сделаем, а потом они введут директиву __FB_64__.
переписать минутное дело, но народ сначала обломается.

 
IvanMailovДата: Понедельник, 27.10.2014, 11:29 | Сообщение # 14
Рядовой
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Offline
haav, ты же PureBasic вроде когда-то крутил? Сдери структуры и константы из его 64 версии и конвертируй под FB. Делов на час максимум.
 
haavДата: Понедельник, 27.10.2014, 13:13 | Сообщение # 15
Генерал-лейтенант
Группа: Администраторы
Сообщений: 768
Репутация: 33
Статус: Offline
Цитата IvanMailov ()
haav, ты же PureBasic вроде когда-то крутил? Сдери структуры и константы из его 64 версии и конвертируй под FB. Делов на час максимум.


Нет личной заинтересованности в данном вопросе по причине отсутствия 64х битной версии Windows.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » Freebasic » Вопросы по языку FreeBasic » Вышла новая версия компилятора FreeBasic (1.00.0) (Вышла новая версия компилятора FreeBasic (1.00.0))
Страница 1 из 11
Поиск: