Аватар для Argus19
1438 / 455 / 78
Регистрация: 24.09.2017
Сообщений: 2,535
Записей в блоге: 24

Twin Basic

27.10.2024, 20:05. Показов 29472. Ответов 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
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
17.12.2024, 18:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
я правильно понял?
Да, но надо еще учитывать, что GoSub использует стек, который наверное можно переполнить, если рекурсивно вызывать GoSub
0
Вернулся
 Аватар для HackerVlad
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
17.12.2024, 18:37
Я всегда писал отдельные процедуры, а тут можно обойтись без отдельной процедуры получается, с помощью такой конструкции через GoSub

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

Добавлено через 3 минуты
Функция поиска файлов на винчестере через FindFirstFile, FindNextFile это у меня наверное единственный код который использует рекурсию. Больше нигде и никогда мне рекурсия не требовалась вообще.
1
 Аватар для Mikle Quits
781 / 298 / 17
Регистрация: 21.01.2023
Сообщений: 512
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
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
17.12.2024, 18:51
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Звучит на первый взгляд сумасбродно, но я проверил, рекурсия в GoSub работает!
А разве должна была не рабоатть?

Добавлено через 29 секунд
Я сразу поверил что работает, даже не проверяя. testuser2 не будет оманывать народ.
1
 Аватар для Mikle Quits
781 / 298 / 17
Регистрация: 21.01.2023
Сообщений: 512
17.12.2024, 18:54
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я сразу поверил что работает, даже не проверяя. testuser2 не будет оманывать народ.
Причём тут "обманывать"? testuser2 написал "наверное можно переполнить, если рекурсивно вызывать GoSub", фраза построена, как предположение, я и проверил.
0
Вернулся
 Аватар для HackerVlad
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
17.12.2024, 19:25
Mikle Quits, ладно, извини
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18312 / 14235 / 5369
Регистрация: 17.03.2014
Сообщений: 28,905
Записей в блоге: 1
17.12.2024, 21:32
Цитата Сообщение от HackerVlad Посмотреть сообщение
стек у меня не переполнился даже после 2 млн. вызовов такой рекурсии. У меня список полный всех файлов на винчестере это 2 млн. файлов.
Количество файлов тут не имеет значения. Максимальная глубина вложенности папок - вот что важно.
1
Вернулся
 Аватар для HackerVlad
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
18.12.2024, 02:04
Mikle Quits, ладно, извини
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Максимальная глубина вложенности папок - вот что важно.
Мб, не важно, короче стек у меня никогда не переполнялся, я даже представить себе не могу такую ситуацию. А глубинна вложенности большой прям не может быть, в файловой системе, чтобы прям переполнить стек...
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
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
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
22.12.2024, 18:41
Попробовал сегодня сделать стандартную процедурную библиотеку на tB и.. сделал. Просто создаешь "стандартную" библиотеку и к функциям и процедурам добавляешь аттрибут [DllExport]. Память во внутренних переменных библиотеки сохраняется между вызовами процедур, что порадовало. Думаю, можно делать псевдо-классы в такой библиотеке, а может быть даже и сom-классы, чего не проверял..
0
Вернулся
 Аватар для HackerVlad
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
22.12.2024, 19:05
testuser2, ну молодец, молодец

Добавлено через 44 секунды
Twin Basic сейчас ещё очень недоделан, например нет горячих клавши в пунктах меню, я написал об этиом на иностранном форме, а там меня просто проигнорили
1
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
22.12.2024, 19:20
HackerVlad, регайся на Гитхабе и делай там исьюе или фиче реквест.
0
Модератор
10060 / 3905 / 884
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
22.12.2024, 21:18
Цитата Сообщение от testuser2 Посмотреть сообщение
Думаю, можно делать псевдо-классы в такой библиотеке, а может быть даже и сom-классы, чего не проверял..
COM классы не очень дружат с обычными DLL. К примеру создал ты объект и передаешь куда-то там, а потом к примеру твой код поработал с DLL и ты решил ее выгрузить - крах. Обычные DLL не предоставляют механизм чтобы узнать можно ли выгружать в данный момент библиотеку. Для ActiveX DLL ввели функцию DllCanUnloadNow которая как раз следит за всеми объектами которые созданы и репортует о том что нельзя выгружать в данный момент.
1
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
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
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
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
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
24.12.2024, 15:46
Цитата Сообщение от testuser2 Посмотреть сообщение
она прописана как Function в единственном экземпляре
Да, это ошибка документации, она просто не полная документация. Mid, на самом деле, ни только функция, но ещё и процедура. Вот смотри:

Visual Basic
1
2
3
    A = "ABCDEF"
    Mid$(A, 2, 2) = "34"
    MsgBox A
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
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
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
24.12.2024, 16:15
Mid это загадка)))
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
24.12.2024, 16:40
Но я не думаю, что, конечно, что это очень уж важная загадка. Фактически это странно использовать вариант в таких функциях как instr, strcomp, strconv, split. Главное понять как делать не "странно", а правильно, кое что уже прояснилось. Кстати, я InStr тоже маленько изобретал намедни.
0
 Аватар для Argus19
1438 / 455 / 78
Регистрация: 24.09.2017
Сообщений: 2,535
Записей в блоге: 24
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru