Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.00/1: Рейтинг темы: голосов - 1, средняя оценка - 4.00
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22

Twin Basic

27.10.2024, 20:05. Показов 27913. Ответов 330
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Несмотря на то, что проект Twin Basic по словам авторов в заключительной стадии "бета", скачал и попробовал.
Непривычный интерфейс.
Открыл проект, созданный в IDE Visual Basic 6.0, скомпилировал и 32 и 64 разрядные версии. По объёму результирующего кода получилось больше. Может быть нет оптимизации кода.
Кто-нибудь из форумчан может что-то сказать об этой IDE ?
3
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.10.2024, 20:05
Ответы с готовыми решениями:

Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ?
Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net

Вычисление значений функции двух переменных в Visual Basic - Visual Basic
Помогите пожалуйста! В среде VB написать программу вычисления значений функции двух переменных. Ориентировочный вид окна программы и...

Visual Basic 6 и Visual Basic .NET - в чем различия?
Visual Basic и Visual studio это не одно и тоже? если нет то в чём разница, по мимо оформления?

330
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,578
Записей в блоге: 1
17.12.2024, 18:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
я правильно понял?
Да, но надо еще учитывать, что GoSub использует стек, который наверное можно переполнить, если рекурсивно вызывать GoSub
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.12.2024, 18:37
Я всегда писал отдельные процедуры, а тут можно обойтись без отдельной процедуры получается, с помощью такой конструкции через GoSub

Добавлено через 2 минуты
Рекурсивно я не вызываю) А про переполнение стека в рекурсии меня давно уже пугали этими страшилками, но реального примера таких переполнений я ещё не видел. Когда я например писал рекурсивную функцию поиска файлов, абсолютно всех файлов, на винчестере, то стек у меня не переполнился даже после 2 млн. вызовов такой рекурсии. У меня список полный всех файлов на винчестере это 2 млн. файлов.

Добавлено через 3 минуты
Функция поиска файлов на винчестере через FindFirstFile, FindNextFile это у меня наверное единственный код который использует рекурсию. Больше нигде и никогда мне рекурсия не требовалась вообще.
1
 Аватар для Mikle Quits
764 / 281 / 17
Регистрация: 21.01.2023
Сообщений: 435
17.12.2024, 18:48
Цитата Сообщение от testuser2 Посмотреть сообщение
рекурсивно вызывать GoSub
Звучит на первый взгляд сумасбродно, но я проверил, рекурсия в GoSub работает!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option Explicit
 
Private Sub Form_Click()
  Dim i As Long
 
  GoSub MySub
  
  Exit Sub
MySub:
  MsgBox i
  i = i + 1
  If i < 5 Then GoSub MySub
  Return
End Sub
Добавлено через 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
А про переполнение стека в рекурсии меня давно уже пугали этими страшилками, но реального примера таких переполнений я ещё не видел.
Сделай рекурсивную заливку пиксельного изображения, быстро уткнёшься в переполнение.
2
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.12.2024, 18:51
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Звучит на первый взгляд сумасбродно, но я проверил, рекурсия в GoSub работает!
А разве должна была не рабоатть?

Добавлено через 29 секунд
Я сразу поверил что работает, даже не проверяя. testuser2 не будет оманывать народ.
1
 Аватар для Mikle Quits
764 / 281 / 17
Регистрация: 21.01.2023
Сообщений: 435
17.12.2024, 18:54
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я сразу поверил что работает, даже не проверяя. testuser2 не будет оманывать народ.
Причём тут "обманывать"? testuser2 написал "наверное можно переполнить, если рекурсивно вызывать GoSub", фраза построена, как предположение, я и проверил.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.12.2024, 19:25
Mikle Quits, ладно, извини
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18272 / 14195 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
17.12.2024, 21:32
Цитата Сообщение от HackerVlad Посмотреть сообщение
стек у меня не переполнился даже после 2 млн. вызовов такой рекурсии. У меня список полный всех файлов на винчестере это 2 млн. файлов.
Количество файлов тут не имеет значения. Максимальная глубина вложенности папок - вот что важно.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.12.2024, 02:04
Mikle Quits, ладно, извини
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Максимальная глубина вложенности папок - вот что важно.
Мб, не важно, короче стек у меня никогда не переполнялся, я даже представить себе не могу такую ситуацию. А глубинна вложенности большой прям не может быть, в файловой системе, чтобы прям переполнить стек...
0
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,578
Записей в блоге: 1
18.12.2024, 15:31
Цитата Сообщение от HackerVlad Посмотреть сообщение
Twin Basic - это очень хорошая вещь, очень удобные подсказки в IDE
Тоже бы хотел отметить такой момент, что в Твин Бейсике как бы более явно видишь те моменты, которые в VB не замечал, и даже узнаешь больше про VB. Смотришь дапутим, Split - возвращает Variant, и Split$ нету. VB это также. Это значит, что в приведенном ниже случае будет дополнительное преобразование (Variant - String):
Visual Basic
1
sAr$() = Split("sfsdfas sfsfasfsf faffafdfds", " ")
А правильней видим так (на TB):
Visual Basic
1
2
3
4
5
6
7
    Public DeclareWide PtrSafe Sub MovePtr Lib "<hiddenmodule>" Alias "#116" (dest As Any, source As Any) 'Alias "vbaAryMove"
    '****    
    sAr$() = VarToStrArr(Split("sfsdfas sfsfasfsf faffafdfds", " "))
    '***
    Function VarToStrArr(vAr As Variant) As String()
        MovePtr VarToStrArr, ByVal VarPtr(vAr) + 8
    End Function
В TB я узнал такое слово как "Definition" - щелкаешь по функции правой кнопкой "Go To Definition" и попадаешь в объявление этой функции (или переменной). В VB также есть это слово, но я не знал и не пользовался, а это очень удобная штука.
0
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,578
Записей в блоге: 1
22.12.2024, 18:41
Попробовал сегодня сделать стандартную процедурную библиотеку на tB и.. сделал. Просто создаешь "стандартную" библиотеку и к функциям и процедурам добавляешь аттрибут [DllExport]. Память во внутренних переменных библиотеки сохраняется между вызовами процедур, что порадовало. Думаю, можно делать псевдо-классы в такой библиотеке, а может быть даже и сom-классы, чего не проверял..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
22.12.2024, 19:05
testuser2, ну молодец, молодец

Добавлено через 44 секунды
Twin Basic сейчас ещё очень недоделан, например нет горячих клавши в пунктах меню, я написал об этиом на иностранном форме, а там меня просто проигнорили
1
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,578
Записей в блоге: 1
22.12.2024, 19:20
HackerVlad, регайся на Гитхабе и делай там исьюе или фиче реквест.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
22.12.2024, 21:18
Цитата Сообщение от testuser2 Посмотреть сообщение
Думаю, можно делать псевдо-классы в такой библиотеке, а может быть даже и сom-классы, чего не проверял..
COM классы не очень дружат с обычными DLL. К примеру создал ты объект и передаешь куда-то там, а потом к примеру твой код поработал с DLL и ты решил ее выгрузить - крах. Обычные DLL не предоставляют механизм чтобы узнать можно ли выгружать в данный момент библиотеку. Для ActiveX DLL ввели функцию DllCanUnloadNow которая как раз следит за всеми объектами которые созданы и репортует о том что нельзя выгружать в данный момент.
1
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,578
Записей в блоге: 1
23.12.2024, 17:34
Вот что мне получилось сделать с помощью стандартной библиотеки: передать строку по ссылке в "left side" функцию.
В библиотеке делаем такой проп
Visual Basic
1
2
3
4
5
6
    [DllExport]
    Property Let TestProp(ByVal pStr As LongPtr)
        Dim s$
        PutMemPtr VarPtr(s), pStr 
        MsgBox s & vbCr & pStr
    End Property
Во втором тестировочном проекте такой код
Visual Basic
1
2
3
4
5
6
7
8
9
10
    Private Delegate Property Let TestProp_Deleg (ByVal Inp As String)
    Private Sub TestPropLet()
        Dim prop As TestProp_Deleg
        Dim lib As LongPtr = LoadLibrary("E:\TwinProjects\StandartDll\Build\StandartDll_win32.dll")
        
        Dim s As String = "Hello World!"
        Debug.Print StrPtr(s)
        prop = GetProcAddress(lib, "TestProp")
        prop() = s 
    End Sub
С помощью текущего функционала TB нельзя получить ссылку на Porperty Let (AddressOf)
Миниатюры
Twin Basic  
0
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,578
Записей в блоге: 1
24.12.2024, 15:41
Тепер о главном. Для чего же мне был нужен этот "left-side". "Мечта детства" так сказать сделать свою реализаию функции Mid, понять как это работает. Может быть это не самый быстрый вариант Mid-а.. Ведь как уже было выяснено в др. теме, функция мид может быть быстрее CopyMemory в отдельных случаях. Но, черт подери, у нее 3й параметр - "variant" ... Зачем? Я сделал с нормальным 3им параметром. Была одна загвоздка, компилятор чихнул на дубликат имени в Property Let
Code
1
[LINKER] FAILED duplicate [DLLExport] functions detected named 'Mid2'
Пришлось переименовать левый Mid2 в Mid2_. И я все-таки не понял, как работает настоящий Mid. В дефинициях, что на VB, что на TB она прописана как Function в единственном экземпляре. Там нет отдельного левого мида (или я плохо смотрел?).
В модуле стандартной библиотеки
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    [DllExport]
    Property Get Mid2(Str As String, ByVal Start As Long, Optional ByVal length As Long) As String
        Start -= 1
        Dim MaxLen As Long = Len(Str) - Start
        If length > 0 AndAlso length <= MaxLen Then
        ElseIf length = 0 OrElse length > MaxLen Then
            length = MaxLen
        Else: Exit Property
        End If
        Dim Sz As Long = length * 2
        Dim pMem As LongPtr = AllocMem(Sz + 6)
        PutMem4 pMem, Sz: pMem += 4: PutMem2 pMem + Sz, 0%
        vbaCopyBytes(length * 2, pMem, StrPtr(Str) + Start * 2)
        PutMemPtr VarPtr(Mid2), pMem
    End Property
    [DllExport]
    Property Let Mid2_(Str As String, ByVal Start As Long, Optional ByVal length As Long, ByVal pSrc As LongPtr)
        Start -= 1
        Dim MaxLen As Long = Len(Str) - Start
        If length > 0 AndAlso length <= MaxLen Then
        ElseIf length = 0 OrElse length > MaxLen Then
            length = MaxLen
        Else: Exit Property
        End If
        Dim Sz As Long = length * 2
        Dim SzInp As Long
        GetMem4 pSrc - 4, SzInp 'получение размера входной строки       
        If SzInp > Sz Then SzInp = Sz
        vbaCopyBytes(SzInp, StrPtr(Str) + Start * 2, pSrc)
    End Property

Использование
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
    Private DeclareWide PtrSafe Property Get Mid2 Lib "StandartDll_win32.dll" (Str As String, ByVal Start As Long, Optional ByVal length As Long) As String
    Private DeclareWide PtrSafe Property Let Mid2 Lib "StandartDll_win32.dll" Alias "Mid2_" (Str As String, ByVal Start As Long, Optional ByVal length As Long, ByVal pSrc As String)
    Private Sub testMid2()
        Dim s1$, s2$= "fafazzze"
        s1 = Mid2(s2, 4)
    End Sub
    Private Sub TestLeftMid2()
        Dim s1$, s2$
        s1 = "fasfsaf"
        s2 = "ddddddd"
        Mid2(s1, 4) = s2
    End Sub


Добавлено через 9 минут
В VB данная функция будет работать правильно только если ее задекларировать в TLB. При обычной декларации будет мешать 2ное преобразование строки. Хотя можно использовать так
Mid2(ByVal VarPtr(s1), 4) = StrPtr(s2)
Еще одни лайвхак проверил - работает - если в каталог с проектом поместить символическую ссылку на библиотеку, то ее можно использовать по краткому имени (как в примере), хотя эта библиотека у меня на другом диске.

Добавлено через 17 минут
Кстати, если кто не заметил, я в этой функции использовал новые операторы "короткого замыкания" AndAlso и OrElse. Это как правильные And и Or. Хотя старые And и Or, работающие как побитовые операции, были оставлены для обратной совместимости. На Гит-хабе последние дни развернулся целый тред из 40+ сообщений. Одному китайцу не понравились эти AndAlso и OrElse и он упорно приводил доводы, почему они не нужны.. Но я думаю это от недостатка опыта, когда он более вникнет в работу языка, он изменит свою точку зрения.

Добавлено через 2 часа 26 минут
Я кажется, кстати понял, почему 3й парамтр у Mid Variant, похоже он используется для приема "правого" аргумента, но, опять же, он может использоваться и в левом положении.. загадка все-таки
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.12.2024, 15:46
Цитата Сообщение от testuser2 Посмотреть сообщение
она прописана как Function в единственном экземпляре
Да, это ошибка документации, она просто не полная документация. Mid, на самом деле, ни только функция, но ещё и процедура. Вот смотри:

Visual Basic
1
2
3
    A = "ABCDEF"
    Mid$(A, 2, 2) = "34"
    MsgBox A
0
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,578
Записей в блоге: 1
24.12.2024, 16:03
Цитата Сообщение от HackerVlad Посмотреть сообщение
Да, это ошибка документации, она просто не полная документация. Mid, на самом деле, ни только функция, но ещё и процедура. Вот смотри:
Да, но в VB для этого отдельный класс процедур - Property. Хотя на самом деле левосторонней может бы и функция и процедура, я проверил. С помощью Delegate в Твин бейсике очень удобно проверять такие вещи, потому, что делегаты работают как Declare-функции. Вот допустим, делаем делегат как Property Let, но указатель подсовываем от функции, и функция начинает работать как Property Let.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
    Private Delegate Property Let TestLeftSideDeleg (ByVal inp As String)
    Private Sub TestLeftSideTest()
        Dim fn As TestLeftSideDeleg
        fn = AddressOf TestLeftSide
        Dim s1 As String = "fasdf"       
        Debug.Print StrPtr(s1)
        fn() = s1        
    End Sub
    Private Function TestLeftSide(ByVal inp As LongPtr) As LongPtr       
        Debug.Print inp
    End Function
НО, все еще не понятно как работает Mid, потому что если функция Mid вызвать как Porperty Let, то 3й аргумент будет использован как "правый" аргумент, но у Mid 3й аргумент доступен и в левом положении и можно в нем передать длину..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.12.2024, 16:15
Mid это загадка)))
0
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,578
Записей в блоге: 1
24.12.2024, 16:40
Но я не думаю, что, конечно, что это очень уж важная загадка. Фактически это странно использовать вариант в таких функциях как instr, strcomp, strconv, split. Главное понять как делать не "странно", а правильно, кое что уже прояснилось. Кстати, я InStr тоже маленько изобретал намедни.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
24.12.2024, 20:25  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Фактически это странно использовать вариант в таких функциях как instr, strcomp, strconv, split
Полностью согласен с предыдущим оратором.
"Некрософт" в своё время накосячил. И до сих пор не поправил. Куча недокументированных функций, нет описания, как генерируются хэндлы библиотеки gdi+, этож почти вся графика. Проще говоря, етить этот "некрософт" во все его физиологические подробности.
В этой ветке всего несколько реально дотошный людей. Начинающих уже нет. И мне откровенно приятно читать, что пусть несколько человек, но думают. За остальных думает ИИ. В стране всё меньше людей, которыми можно гордиться.
testuser2, HackerVlad, The trick, Спасибо вам за всё.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2024, 20:25
Помогаю со студенческими работами здесь

Отличия версий Visual Basic 6.0 от Visual Basic 6.5?
У меня 3 вопроса: 1.Чем отличается версия Visual Basic 6.0 от Visual Basic 6.5? 2.Можно ли запустить проект созданный раннее в Visual...

что лучше MSI R6870 Twin Frozr II или MSI N570GTX Twin Frozr II/OC, 1.3Гб?
выбор между PCI-E 2.1 MSI R6870 Twin Frozr II, 1Гб, GDDR5, Ret и PCI-E 2.0 MSI N570GTX Twin Frozr II/OC, 1.3Гб, GDDR5, OC, Ret ...

не могу настроить twin frozr 3
подскажите!я в железе не очень!купил видюху twin frozr 3,говорят видушка достаточно мощная захотел протестить на игре кризис 2 на полных...

MSI N560GTX-Ti Twin Frozr II/OC
Столкнулся с такой проблемой, в игре начали появляться непонятные полосы, расплываться объекты (см. скриншоты), пока заметил такую проблему...

MSI GTX480 twin frozr
Всем привет, такая проблема- как обычно видеокарта не дает компу стартануть и бросает его в ребут по циклу, разобрал карту нашел скол на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru