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

Twin Basic

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

Студворк — интернет-сервис помощи студентам
Несмотря на то, что проект 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 и Visual studio это не одно и тоже? если нет то в чём разница, по мимо оформления?

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

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

335
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
17.12.2024, 18:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
я правильно понял?
Да, но надо еще учитывать, что GoSub использует стек, который наверное можно переполнить, если рекурсивно вызывать GoSub
0
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
17.12.2024, 18:37
Я всегда писал отдельные процедуры, а тут можно обойтись без отдельной процедуры получается, с помощью такой конструкции через GoSub

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

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

Добавлено через 29 секунд
Я сразу поверил что работает, даже не проверяя. testuser2 не будет оманывать народ.
1
 Аватар для Mikle Quits
1019 / 309 / 17
Регистрация: 21.01.2023
Сообщений: 535
17.12.2024, 18:54
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я сразу поверил что работает, даже не проверяя. testuser2 не будет оманывать народ.
Причём тут "обманывать"? testuser2 написал "наверное можно переполнить, если рекурсивно вызывать GoSub", фраза построена, как предположение, я и проверил.
0
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
17.12.2024, 19:25
Mikle Quits, ладно, извини
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18362 / 14292 / 5370
Регистрация: 17.03.2014
Сообщений: 28,970
Записей в блоге: 1
17.12.2024, 21:32
Цитата Сообщение от HackerVlad Посмотреть сообщение
стек у меня не переполнился даже после 2 млн. вызовов такой рекурсии. У меня список полный всех файлов на винчестере это 2 млн. файлов.
Количество файлов тут не имеет значения. Максимальная глубина вложенности папок - вот что важно.
1
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
18.12.2024, 02:04
Mikle Quits, ладно, извини
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Максимальная глубина вложенности папок - вот что важно.
Мб, не важно, короче стек у меня никогда не переполнялся, я даже представить себе не могу такую ситуацию. А глубинна вложенности большой прям не может быть, в файловой системе, чтобы прям переполнить стек...
0
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 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
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
22.12.2024, 18:41
Попробовал сегодня сделать стандартную процедурную библиотеку на tB и.. сделал. Просто создаешь "стандартную" библиотеку и к функциям и процедурам добавляешь аттрибут [DllExport]. Память во внутренних переменных библиотеки сохраняется между вызовами процедур, что порадовало. Думаю, можно делать псевдо-классы в такой библиотеке, а может быть даже и сom-классы, чего не проверял..
0
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
22.12.2024, 19:05
testuser2, ну молодец, молодец

Добавлено через 44 секунды
Twin Basic сейчас ещё очень недоделан, например нет горячих клавши в пунктах меню, я написал об этиом на иностранном форме, а там меня просто проигнорили
1
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
22.12.2024, 19:20
HackerVlad, регайся на Гитхабе и делай там исьюе или фиче реквест.
0
Модератор
10065 / 3910 / 885
Регистрация: 22.02.2013
Сообщений: 5,860
Записей в блоге: 79
22.12.2024, 21:18
Цитата Сообщение от testuser2 Посмотреть сообщение
Думаю, можно делать псевдо-классы в такой библиотеке, а может быть даже и сom-классы, чего не проверял..
COM классы не очень дружат с обычными DLL. К примеру создал ты объект и передаешь куда-то там, а потом к примеру твой код поработал с DLL и ты решил ее выгрузить - крах. Обычные DLL не предоставляют механизм чтобы узнать можно ли выгружать в данный момент библиотеку. Для ActiveX DLL ввели функцию DllCanUnloadNow которая как раз следит за всеми объектами которые созданы и репортует о том что нельзя выгружать в данный момент.
1
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 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
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
24.12.2024, 15:46
Цитата Сообщение от testuser2 Посмотреть сообщение
она прописана как Function в единственном экземпляре
Да, это ошибка документации, она просто не полная документация. Mid, на самом деле, ни только функция, но ещё и процедура. Вот смотри:

Visual Basic
1
2
3
    A = "ABCDEF"
    Mid$(A, 2, 2) = "34"
    MsgBox A
0
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
24.12.2024, 16:15
Mid это загадка)))
0
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
24.12.2024, 16:40
Но я не думаю, что, конечно, что это очень уж важная загадка. Фактически это странно использовать вариант в таких функциях как instr, strcomp, strconv, split. Главное понять как делать не "странно", а правильно, кое что уже прояснилось. Кстати, я InStr тоже маленько изобретал намедни.
0
 Аватар для Argus19
1728 / 472 / 78
Регистрация: 24.09.2017
Сообщений: 2,561
Записей в блоге: 25
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 - Visual Basic
Помогите пожалуйста! В среде VB написать программу вычисления значений функции двух переменных....

Скачать Visual Basic 6.0
Киньте ссылочку,плз,откуда можна скачать сабж!

[Visual Basic]операторы циклов, помогите с прогой:)
Нада в VB сбацать прогу, используя операторы циклов: Дана произвольной длины последовательность...

Помогите написать программу на Visual Basic!
Люди, срочно нужна ваша помощь!!! Никак не могу написать программу на Visual Basic, по причине...

Диалекты Basic
Пожалуйста, подскажите, какие бывают диалекты Basic'а, какие их основные особенности и с какого из...


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

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru