Форум программистов, компьютерный форум, киберфорум
Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/78: Рейтинг темы: голосов - 78, средняя оценка - 4.86
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

Изучение основ FreeBasic в сравнении с PowerBasic

10.10.2022, 22:17. Показов 21974. Ответов 218

Студворк — интернет-сервис помощи студентам
Всем добра и мира!

К сожалению, PowerBasic прекратил своё развитие вследствие смерти его создателя и главного (а скорее всего, единственного) разработчика Роберта Зейла в 2012-ом году. К настоящему времени последние надежды на его развитие окончательно угасли. В связи с этим я решил приступить к изучению основ FreeBasic'а.

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

Как говорится, всё познаётся в сравнении. Ну вот и буду изучать FreeBasic, опираясь на определённый опыт ЛЮБИТЕЛЬСКОГО программирования на PowerBasic'е.

Буду очень благодарен за любую помощь.

Итак, первый возникший у меня вопрос.

Каким образом в структурах FreeBasic'а появилась возможность использовать динамические строки?
В PowerBasic'е это строго запрещено. Можно использовать только строки фиксированной длины.

Вот 2 работающих (с одним и тем же результатом на консоли) кода для сравнения:

FreeBasic
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TYPE Persons
    Name AS STRING
    Surname AS STRING
    Age AS BYTE = 35
END TYPE
 
DIM Vpersons AS Persons
 
Vpersons.Name="Richard"
Vpersons.Surname="Black"
 
? Vpersons.Name
? Vpersons.Surname
? Vpersons.Age
Sleep
PowerBasic
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#COMPILE EXE
#DIM ALL
 
TYPE Persons
  Name AS STRING*10       'если здесь написать "Name AS STRING", компилятор бастует
  Surname AS STRING*10   'если здесь написать "Surname AS STRING", компилятор бастует
  Age AS BYTE           'значение по умолчанию здесь присвоить не получится
END TYPE
 
FUNCTION PBMAIN () AS LONG
DIM Vpersons AS Persons
 
  Vpersons.Name="Richard"
  Vpersons.Surname="Black"
  Vpersons.Age = 35
 
  ? Vpersons.Name
  ? Vpersons.Surname
  ? Vpersons.Age
 
  SLEEP 5000    'если SLEEP без указания продолжительности, компилятор бастует
END FUNCTION
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2022, 22:17
Ответы с готовыми решениями:

Перегрузка методов (изучение основ)
Добрый день! Вот я добрался до перегрузки методов и быстренько накидал вот такой пример: using System; namespace...

Сколько в среднем часов уходит на изучение основ C++?
1) Если с нуля 2) Если после паскаля или чего то в этом духе

Групповое изучение программирование с основ без преподавателя
Суть: Студенты 3 курса Специальность: информационно вычислительная техника, после третьего курса "Аналитики" С с божьей...

218
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,009
Записей в блоге: 7
31.10.2022, 01:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Power_Basic Посмотреть сообщение
А вот интересно, в PureBasic вставится без проблем?
Статически через импорт из lib файла.
PureBasic
1
2
3
4
5
Import "User32.lib"
  MessageBoxW(Window, Body.p-unicode, Title.p-unicode, Flags.l = 0)
EndImport
 
MessageBoxW(0, "Hello", "World")
Или динамически
PureBasic
1
2
3
4
If OpenLibrary(0, "User32.dll")
  CallFunction(0, "MessageBoxW", 0, @"Hello", @"World", 0)
  CloseLibrary(0)
EndIf
Или тоже через прототип.
PureBasic
1
2
3
4
5
6
7
8
9
Prototype MessageBox(Window, Body.p-unicode, Title.p-unicode, Flags.l = 0)
 
If OpenLibrary(0, "User32.dll")
  MessageBox.MessageBox = GetFunction(0, "MessageBoxW")
  If MessageBox
    MessageBox(0, "Hello", "World")
  EndIf
  CloseLibrary(0)
EndIf
Имея только dll, получить lib файл можно с помощью утилиты polib.exe из папки Compilers.
Разве PowerBasic не создает lib файл?
Вложения
Тип файла: zip dll_test.zip (6.1 Кб, 13 просмотров)
2
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
31.10.2022, 16:55
Что‐то у вас гигантские екзешники получаются.
Вот DLL размером 2560 байт и исполняемый файл 5632 байта:
Название: 0171.png
Просмотров: 182

Размер: 4.7 Кб
Вложения
Тип файла: zip dll.zip (6.6 Кб, 6 просмотров)
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
31.10.2022, 17:04  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Или динамически

PureBasic
1
2
3
4
If OpenLibrary(0, "User32.dll")
  CallFunction(0, "MessageBoxW", 0, @"Hello", @"World", 0)
  CloseLibrary(0)
EndIf
Попробовал таким же способом "подкинуть" свою далалайку, не получилось. Похоже, во всех трёх способах без lib-файла никак не обойтись.

Цитата Сообщение от locm Посмотреть сообщение
Имея только dll, получить lib файл можно с помощью утилиты polib.exe из папки Compilers.
Ну всё равно это дополнительные заморочки. VB-то по какой-то причине "кушает" в режиме "как оно есть"

Цитата Сообщение от locm Посмотреть сообщение
Разве PowerBasic не создает lib файл?
По умолчанию точно нет. Ну по крайней мере, где-то рядом в папке с новорожденной далалайкой не появляется автоматически новая либка
Да и в логе про это ничего не говорится:

PowerBASIC 10 for Windows
Copyright (c) 1996-2012 PowerBasic Inc.
Englewood, Florida USA
All Rights Reserved

Primary source: D:\Ssd_Stol\111111111111111\Addone.bas {6 total lines}
Target compilation: Addone.dll
Compile time: 0.1 seconds, at 7200 lines/minute

576 bytes compiled code, 2100 bytes RTLibrary,
0 bytes string literals, and 2644 bytes dgroup.
DLL does not require stack allocation.
Disk image: 6144 bytes Memory image: 4744 bytes.

Component Files:
----------------
D:\Ssd_Stol\111111111111111\Addone.bas


Code Extracted:
---------------
<NONE>
Миниатюры
Изучение основ FreeBasic в сравнении с PowerBasic   Изучение основ FreeBasic в сравнении с PowerBasic  
0
31.10.2022, 17:05

Не по теме:

Цитата Сообщение от Замабувараев Посмотреть сообщение
Что‐то у вас гигантские екзешники получаются.
Посмотрите эту тему и не забудьте отписаться в ней Мои 1е проги на C# сложнее Hello World

0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,009
Записей в блоге: 7
31.10.2022, 17:15
Цитата Сообщение от Power_Basic Посмотреть сообщение
Попробовал таким же способом "подкинуть" свою далалайку, не получилось.
PureBasic
1
2
3
4
5
6
If OpenLibrary(0, "ADDONE.dll")
  MessageRequester("Результат", ""+CallFunction(0, "AddOne", 20))
  CloseLibrary(0)
Else
  MessageRequester("Ошибка", "Нет dll")
EndIf
Цитата Сообщение от Power_Basic Посмотреть сообщение
Ну всё равно это дополнительные заморочки.
lib файл должен создаваться при компиляции dll. Если PowerBasic этого не делает, то заморочки из-за него.

Судя по скринам используете PureBasic x64, а dll x86.
Разрядность exe и dll должна быть одинаковой. Соберите в PowerBasic x64 dll или используйте x86 версию PureBasic.
Вложения
Тип файла: zip dll.zip (5.8 Кб, 4 просмотров)
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
31.10.2022, 17:37
Цитата Сообщение от Power_Basic Посмотреть сообщение
VB-то по какой-то причине "кушает" в режиме "как оно есть"
Во‐первых, вы ему тоже руками все декларации прописываете.
Во‐вторых, VB6 загружает все библиотеки из Declare динамически, с тем же успехом можно в тексте прописывать LoadLibrary + GetProcAddress.
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
31.10.2022, 17:50  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
PureBasic
1
2
3
4
5
6
If OpenLibrary(0, "ADDONE.dll")
  MessageRequester("Результат", ""+CallFunction(0, "AddOne", 20))
  CloseLibrary(0)
Else
  MessageRequester("Ошибка", "Нет dll")
EndIf
Ну дык получается, что всё-таки можно обходиться без либ-файла?!
При запуске вашего эксешника выскакивает сообщение "21".

Хотя мне этот фокус повторить почему-то не удаётся. Вроде бы компилирую тот же самый исходник, потом запускаю эксешник из той же самой папки, а мне пишут "нет dll". Наверно, у нас настройки разные.

Цитата Сообщение от locm Посмотреть сообщение
lib файл должен создаваться при компиляции dll. Если PowerBasic этого не делает, то заморочки из-за него.
Увы, Боб Зейл скончался ровно 10 лет назад. Возможно это у него было в планах, которым не суждено было осуществиться

Добавлено через 4 минуты
Цитата Сообщение от locm Посмотреть сообщение
Судя по скринам используете PureBasic x64, а dll x86. Разрядность exe и dll должна быть одинаковой.
Ну да, именно так. Ну тогда понятно, почему у нас получаются разные результаты
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,009
Записей в блоге: 7
31.10.2022, 18:10
Цитата Сообщение от Power_Basic Посмотреть сообщение
Ну дык получается, что всё-таки можно обходиться без либ-файла?!
Это загрузка во время исполнения кода. lib файл позволяет добавить функции dll в секцию импорта исполняемого файла загрузка выполняется при старте exe файла.

Цитата Сообщение от Power_Basic Посмотреть сообщение
Хотя мне этот фокус повторить почему-то не удаётся. Вроде бы компилирую тот же самый исходник, потом запускаю эксешник из той же самой папки, а мне пишут "нет dll".
Я выше написал
Цитата Сообщение от locm Посмотреть сообщение
Судя по скринам используете PureBasic x64, а dll x86.
Разрядность exe и dll должна быть одинаковой. Соберите в PowerBasic x64 dll или используйте x86 версию PureBasic.
Чтобы загрузить dll в x64 процесс, у библиотеки должна быть такая же разрядность - x64.
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
01.11.2022, 16:10  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Цитата Сообщение от Power_Basic Посмотреть сообщение
VB-то по какой-то причине "кушает" в режиме "как оно есть"
Во‐первых, вы ему тоже руками все декларации прописываете.
Во‐вторых, VB6 загружает все библиотеки из Declare динамически, с тем же успехом можно в тексте прописывать LoadLibrary + GetProcAddress.
Если я правильно понимаю, вы до этого стремились описать мне идеально оптимизированный (с точки зрения скорости выполнения программы) подход к решению данной задачи. Но вот прямо сейчас в этом нет никакой необходимости. Сейчас надо, чтобы оно просто работало
Быстро или медленно, это пофиг
Я же только-только приступил к изучению самых первых элементов нового для меня языка, можно сказать, в первый класс пошёл
А ВУЗ и академия это уже потом будет.. ну если вообще будет
Динамически, статически... чуть медленнее, чуть быстрее ... да какая мне сейчас разница?!
Хоть как-то работает, ну вот и слава богу

Цитата Сообщение от locm Посмотреть сообщение
Чтобы загрузить dll в x64 процесс, у библиотеки должна быть такая же разрядность - x64.
Да, да, да, всё правильно, это была моя ошибка. И вообще, как я теперь понимаю, х64 надо использовать только в тех редчайших случаях, когда это действительно необходимо.
Ну просто у меня никогда не было возможности программировать в формате х64, ну вот я и дорвался, как говорится
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
10.11.2022, 16:21  [ТС]
У меня начинает складываться впечатление, что FreeBasic гораздо беднее PowerBasic'а относительно своих "внутренних" средств. Ну вот, например, в PowerBasic'е имеется большой набор функций работы с массивами и в частности функции сортировки массивов.

Допустим, у нас имеется некоторый массив строк и мы хотим упорядочить их по алфавиту, ну или массив чисел хотим упорядочить по возрастанию. В PowerBasic'е это делается "лёгким движением руки" с помощью ARRAY SORT. Да там ещё и TAGARRAY можно прицепить, который будет упорядочиваться синхронно с "главным" сортируемым массивом.
Ну то есть, например, имеем массив имён некоторых лиц и массив их возрастов. Оставляем сейчас за рамками обсуждения, что это можно реализовать с помощью структур/UDT. Не хотим и не умеем
Хотим именно два массива. Хотим упорядочить имена по алфавиту, ну и так, чтобы и возраста тоже соответствовали именам. Ну вот, пожалуйста, полный набор инструментов:

Numeric array:
ARRAY SORT darray([index]) [FOR count] [,TAGARRAY tarray()] [,{ASCEND | DESCEND}]

String array:
ARRAY SORT dArray([index]) [FOR count] [,FROM startChar TO endChar] [,COLLATE {UCASE |cstring}] [,TAGARRAY tarray()] [,{ASCEND | DESCEND}]

Custom sort array:
ARRAY SORT darray([index]) [FOR count] [,TAGARRAY tarray()] ,CALL custfunc()
В PowerBasic'е с массивами можно проделывать практически любые манипуляции с помощью именно встроенных средств. А в последней версии (2012) дык ещё и объект появился PowerArray, у которого свойства и методы позволяют с дополнительными удобствами обрабатывать массивы.

А вот в справочной системе FreeBasic'а я ничего подобного не обнаружил. Может быть плохо искал?
Или здесь такая политика, что "внутри" только необходимый минимум, а все "тонкие настройки" выполняются с помощью подключаемых библиотек, так что ли?
Или это у меня ошибочное впечатление?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
10.11.2022, 21:21
Цитата Сообщение от Power_Basic Посмотреть сообщение
Или здесь такая политика, что "внутри" только необходимый минимум
Библиотека только повторяет функции из QBASIC.
Потом туда добавили юникодные строки и цвета с прозрачностью.
Потом добавили ООП, но не всем это понравилось.
А библиотека так и осталась с функциями из QBASIC.
Цитата Сообщение от Power_Basic Посмотреть сообщение
функции сортировки массивов
Можете сортировать массив функцией qsort из библиотеки языка си, отправьте ей нужную функцию‐компаратор:
FreeBASIC
PureBasic
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
31
32
33
34
35
36
37
38
39
40
41
42
43
#include once "crt.bi"
#include once "crt\stdlib.bi"
 
' Функция сравнения
Function CompareLongs(ByVal p As Const Any Ptr, ByVal q As Const Any Ptr) As Long
    Dim x As Long = *CPtr(Long Ptr, p)
    Dim y As Long = *CPtr(Long Ptr, q)
    
    Select Case x
        Case Is < y
            ' Вернуть -1: в порядке возрастания
            ' Вернуть 1: в порядке убывания
            Return -1  
        Case Is > y
            ' Вернуть 1: в порядке возрастания
            ' Вернуть -1: в порядке убывания
            Return 1
        Case Else   
            Return 0
    End Select
    
End Function
 
' Сортировать массив чисел типа Long
Sub SortLongs(a() As Long)
    qsort(@a(LBound(a)), UBound(a) - LBound(a) + 1, SizeOf(Long), @CompareLongs)
End Sub
 
' Массив
Dim Vector(4) As Long
Vector(0) = 5
Vector(1) = 3
Vector(2) = 2
Vector(3) = 1
Vector(4) = 4
 
' Сортируем
SortLongs(Vector())
 
' Вывести на консоль
For i As Integer = 0 To 4
    Print Vector(i)
Next
Так можно любые сложные данные сортировать, например, массивы структур.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
11.11.2022, 09:25
Цитата Сообщение от Power_Basic Посмотреть сообщение
функции сортировки массивов
Вот пример как сортировать массив структур:
PureBasic
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include once "windows.bi"
#include once "crt.bi"
#include once "crt\stdlib.bi"
 
Type Person
    Name As WString * 64
    Surname As WString * 64
    Age As Integer
End Type
 
' Функция сравнения
Function ComparePersons(ByVal p As Const Any Ptr, ByVal q As Const Any Ptr) As Long
    Dim x As Person Ptr = CPtr(Person Ptr, p)
    Dim y As Person Ptr = CPtr(Person Ptr, q)
    
    ' Сравнить фамилии
    Dim resCompareSurname As Long = lstrcmpW(x->Surname, y->Surname)
    
    Select Case resCompareSurname
        Case Is < 0
            Return -1  
        Case Is > 0
            Return 1
        Case Else
            ' Фамилии одинаковые
            ' Сравниваем имена
            Dim resCompareName As Long = lstrcmpW(x->Name, y->Name)
            Select Case resCompareName
                Case Is < 0
                    Return -1  
                Case Is > 0
                    Return 1
                Case Else
                    ' Фамилия и имя одинаковые
                    ' Сортируем по возрасту
                    ' Но это будет ваше домашнее задание
                    Return 0
            End Select
    End Select
    
End Function
 
' Сортировать массив чисел типа Long
Sub SorPersons(a() As Person)
    qsort(@a(LBound(a)), UBound(a) - LBound(a) + 1, SizeOf(Person), @ComparePersons)
End Sub
 
' Массив людей
' Небольшая оптимизация:
' Устанавливая переменной значение Any при объявлении
' Мы убираем инициализацию
Dim Persons(4) As Person = Any ' Небольшая оптимизация
Persons(0).Name = WStr("Анна")
Persons(0).Surname = WStr("Петрова")
Persons(0).Age = 51
 
Persons(1).Name = WStr("Иван")
Persons(1).Surname = WStr("Дергунов")
Persons(1).Age = 20
 
Persons(2).Name = WStr("Сергей")
Persons(2).Surname = WStr("Грачёв")
Persons(2).Age = 43
 
Persons(3).Name = WStr("Елена")
Persons(3).Surname = WStr("Смирнова")
Persons(3).Age = 11
 
Persons(4).Name = WStr("Екатерина")
Persons(4).Surname = WStr("Смирнова")
Persons(4).Age = 45
 
' Сортируем
SorPersons(Persons())
 
' Вывести на консоль
For i As Integer = 0 To 4
    Print Persons(i).Name
    Print Persons(i).Surname
    Print Persons(i).Age
Next
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
11.11.2022, 13:37
Цитата Сообщение от Замабувараев Посмотреть сообщение
Можете сортировать массив функцией qsort из библиотеки языка си
free basic, по сути, это почти тот же си за исключением нескольких плюшек от qbasic.
Цитата Сообщение от Power_Basic Посмотреть сообщение
В PowerBasic'е это делается "лёгким движением руки"
А исходники PowerBasic есть? Если нет, то это мертворожденное дитя.
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
11.11.2022, 17:10  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Библиотека только повторяет функции из QBASIC.
Увы, но мне это ни о чём не говорит. Я не профессионал, я любитель. Я совершенно не знаком с QBasic'ом. Вот с чем я более или менее знаком:

- Basic для МК "Электроника"
- ZX-Spectrum-Basic + немного ассемблера для ускорения работы программ
- древний PowerBasic под MS-DOS
- VisualBasic 5.0 и 6.0
- PowerBasic под Windows

Ну вот собственно и всё

Цитата Сообщение от Замабувараев Посмотреть сообщение
А библиотека так и осталась с функциями из QBASIC.
Мне не понятно, что вы в данном контексте называете "библиотекой". Для меня термин "библиотека" звучит как нечто "левое", нечто стороннее, нечто встраиваемое.
Вот допустим "родная" функция MsgBox в PowerBasic'е. Я устанавливаю на неё курсор, нажимаю F1, и мне высвечивается всё её "жизнеописание"
А когда всё это разбросано по разным "библиотекам", откуда мне знать, что в какой искать и как с найденным обходиться?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Можете сортировать массив функцией qsort из библиотеки языка си
То есть прежде чем приступать к изучению FreeBASIC'а сначала следует изучить Си?

Ну нет, я понимаю, что какие-то сложные сложности (относительно редкие WinAPI функции, COM-программирование) требуют обращения к сторонним средствам.
Ну уж здесь-то такой пустяк, простая сортировка строкового массива по алфавиту. И давай иди побирайся по всем библиотекам?
Я же сейчас изучаю самые-самые основы, и мне не хотелось бы прямо сейчас нырять в такие глубины, чтобы самому себе отбить всякую охоту продолжать изучение.
Я уж тогда лучше простым пузырьковым методом из каменного века массив отсортирую

Цитата Сообщение от Замабувараев Посмотреть сообщение
отправьте ей нужную функцию-компаратор
Я не знаю, что такое функция-компаратор, это опять какие-то "высокие материи", снова высшая математика для первоклассника

Цитата Сообщение от CoderHuligan Посмотреть сообщение
free basic, по сути, это почти тот же си за исключением нескольких плюшек от qbasic.
Ну а тогда какой вообще смысл изучать FreeBASIC, если параллельно всё равно придётся изучать Си?
Не проще ли тогда с него и начать?

Цитата Сообщение от CoderHuligan Посмотреть сообщение
А исходники PowerBasic есть? Если нет, то это мертворожденное дитя.
Это как бы намёк на то, что силами PowerBasic'а, вынужденно прекратившего своё развитие ровно 10 лет назад (в связи с безвременной кончиной Боба Зейла) эту задачу решить не получться?
Да это так же легко как стакан воды выпить. И по внешним библитотекам не надо ходить побираться

Доказательство прилагаю. И обратите внимание, в исходнике нет ни одного инклюда!
Всё выполнено с помощью только встроенных средств самого языка.

PowerBasic
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#COMPILE EXE
#DIM ALL
 
FUNCTION PBMAIN () AS LONG
  Dim arr_str_Name (2) as string   
  Dim arr_lng_Age_of_death (2) as long 
  
  arr_str_Name (0) = "Пушкин"
  arr_str_Name (1) = "Лермонтов" 
  arr_str_Name (2) = "Некрасов"
  
  arr_lng_Age_of_death (0) = 37
  arr_lng_Age_of_death (1) = 26
  arr_lng_Age_of_death (2) = 56 
   
  'сортировка по алфавиту
  array sort arr_str_Name (), TAGARRAY arr_lng_Age_of_death () 
 
 msgbox arr_str_Name (0) & " скончался в возрасте" & str$ (arr_lng_Age_of_death (0)) & " лет" & $crlf & _
        arr_str_Name (1) & " скончался в возрасте" & str$ (arr_lng_Age_of_death (1)) & " лет" & $crlf & _
        arr_str_Name (2) & " скончался в возрасте" & str$ (arr_lng_Age_of_death (2)) & " лет"   
END FUNCTION
Результат:
Изображения
 
Вложения
Тип файла: zip сортировка_массива.zip (10.1 Кб, 6 просмотров)
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,009
Записей в блоге: 7
11.11.2022, 17:32
Цитата Сообщение от Power_Basic Посмотреть сообщение
Всё выполнено с помощью только встроенных средств самого языка.
Не лучше описать структуру с полями Name и Age и создать массив структур?
Это выглядит логичнее чем два массива.
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
11.11.2022, 21:53  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Не лучше описать структуру с полями Name и Age и создать массив структур?
Это выглядит логичнее чем два массива.
Да кто бы спорил-то
Разумеется, гораздо логичнее и проще... с точки зрения относительно продвинутого юзера.
Но я же написал несколькими постами выше:
Цитата Сообщение от Power_Basic Посмотреть сообщение
Ну то есть, например, имеем массив имён некоторых лиц и массив их возрастов. Оставляем сейчас за рамками обсуждения, что это можно реализовать с помощью структур/UDT. Не хотим и не умеем
В целях обучения самого себя новому языку мне хотелось начать именно с самых примитивов.

Для тренировки начал писать на FB самую-самую простую программу, - подсчитываем частоту вхождений различных букв и цифр в любом текстовом файле и выводим результаты на консоль или в другой текстовый файл. Всё уже готово, всё уже работает, и меня даже приятно удивило то, что синтаксисы FB и PB на этом уровне (работа с файлами и со строками) соответствуют друг другу практически один в один.
Но вот остался один последний штрих - вывести результаты не абы как, а в приоритетном порядке, ну то есть наиболее частые символы на самом верху, ну и так далее в порядке убывания. Ну вот и появилась потребность в сортировке массива.

И теперь, как выясняется, для такой рутинной (для PB) задачи в FB надо привлекать на помощь сишные библиотеки.
Ну а сам-то компилятор почему на это не способен?!
У многочисленных разработчиков FB по сравнению с покойным Бобом Зейлом (одиночкой!) была фора аж целых 10 лет. Что они делали всё это время?

Не по теме:

Не будь это бесплатным продуктом, я бы подумал, что они распилили выделенные средства, как сейчас модно это делать :)



Честно говоря, у меня уже начинает складываться впечатление, что я вошёл не в ту дверь
Как сказал бессмертный классик, шёл в комнату, попал в другую
В связи с этим у меня лично к вам вопрос, как к общепризнанному эксперту PureBasic'а. Там в PureBasic'е точно такая же хрень, что по любому пустяку надо бежать за помощью в сторонние библиотеки или же это относительно самодостаточный компилятор, похожий в этом отношении на компилятор PowerBasic'а?
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,009
Записей в блоге: 7
11.11.2022, 22:12
Цитата Сообщение от Power_Basic Посмотреть сообщение
Там в PureBasic'е точно такая же хрень, что по любому пустяку надо бежать за помощью в сторонние библиотеки
Зависит от задачи.
Функции PureBasic перечислены в правой колонке справки https://www.purebasic.com/documentation/
Сортировка есть https://www.purebasic.com/docu... index.html
PureBasic
1
2
3
4
5
6
7
8
9
10
Dim x(10)
 
x(2) = 1234
x(4) = 100
 
SortArray(x(), #PB_Sort_Ascending)
 
For i=0 To ArraySize(x())
  Debug x(i)
Next
Но при необходимости ничего не мешает использовать функцию qsort о которой выше писал Замабувараев.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ImportC ""
  qsort(*arr, CountElement, SizeElement, *SortFunct)
EndImport
 
Procedure Sort(*x.Integer, *y.Integer)
  If *x\i < *y\i
    ProcedureReturn -1
  ElseIf *x\i > *y\i
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
 
Dim x(10)
 
x(2) = 1234
x(4) = 100
 
qsort(@x(), ArraySize(x())+1, SizeOf(Integer), @Sort())
 
For i=0 To ArraySize(x())
  Debug x(i)
Next
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
11.11.2022, 23:03
Цитата Сообщение от Power_Basic Посмотреть сообщение
Мне не понятно, что вы в данном контексте называете "библиотекой"
Вообще библиотека — это набор чего‐то, что можно вызывать и использовать. Обычно под этим подразумевают скомпилированные функции.
Стандартная библиотека — это функции для конкретного языка программирования.
Стандартная библиотека
Цитата Сообщение от Power_Basic Посмотреть сообщение
нечто "левое", нечто стороннее, нечто встраиваемое
Противоречие: встраиваемое не может быть сторонним.
Библиотеки могут быть динамически подгружаемыми. Это значит, что их код находится не в вашем екзешнике.
А могут быть статическими. Это значит, что компоновщик копирует их код в ваш исполняемый файл.
Цитата Сообщение от Power_Basic Посмотреть сообщение
откуда мне знать, что в какой искать
Обычно все вещи уже давно написаны и реализованы в какой‐нибудь библиотеке. Осталось правильно сформировать запрос и отправить поисковой системе.
https://www.gunsmoker.ru/2013/... 3527040567

Цитата Сообщение от Power_Basic Посмотреть сообщение
То есть прежде чем приступать к изучению FreeBASIC'а сначала следует изучить Си?
Чтобы пользоваться функциями из библиотеки языка си не нужно изучать язык си.
Открою секрет: для компилятора нет никакой разницы между вызовом си‐функции и функции из винапи или написанной вами функции, или функции из библиотеки фрибесика. Компилятор просто ставит вызов функции и отправляет ей параметры в установленном порядке. Больше его ничего не заботит и заботить не должно. Вообще, дискриминация и уничижение функций по происхождению очень свойственна людям, однако компилятор лишён таких экзистенциальных размышлений и психологических переживаний вроде «эта функция плохая, потому что она нестандартная», «эта функция написана на другом языке программирования, фу‐фу‐фу» или «вызов функции из чуждого мне языка сделает мой исходный код менее бейсиковым». Потому что на уровне процессора любая функция работает одинаково.

Цитата Сообщение от Power_Basic Посмотреть сообщение
Я уж тогда лучше простым пузырьковым методом из каменного века массив отсортирую
Чем вам не понравился тот пример с сортировкой структур? Не работает?

Цитата Сообщение от Power_Basic Посмотреть сообщение
Я не знаю, что такое функция-компаратор
Это функция, которая принимает два параметра, сравнивает их и возвращает что из них «больше» и что «меньше».
Это вообще стандартная терминология из программирования.
Не нужно выдумывать свою терминологию, можно использовать общепринятую.

Цитата Сообщение от Power_Basic Посмотреть сообщение
Это как бы намёк на то, что силами PowerBasic'а, вынужденно прекратившего своё развитие ровно 10 лет назад (в связи с безвременной кончиной Боба Зейла) эту задачу решить не получться?
Каким образом вы будете развивать компилятор, добавлять что‐то новое и современное, если у вас нет исходного кода? Будете писать его с нуля?

Цитата Сообщение от Power_Basic Посмотреть сообщение
Ну а сам-то компилятор почему на это не способен?!
Некорректно.
Компилятор никакие функции не пишет, компилятор только ставит вызов функции из библиотеки.
Библиотеку функций делают программисты. Они не включили в стандартную библиотеку функцию сортировки потому что:
а) им лень или некогда;
б) функция сортировки уже есть в сишной библиотеке, и дублировать её незачем.

Вы переживаете насчёт того, что в скомпилированный фрибесиком файл попадёт сишная библиотека? Можете не переживать, она всегда туда попадает, потому что сами функции фрибесика написаны на си и вызывают сишные функции внутри себя, стартовая точка программы берётся из сишной библиотеки.

Добавлено через 6 минут
Цитата Сообщение от locm Посмотреть сообщение
ElseIf *x\i > *y\i
А что, в операторе Select выражение Case на purebasic не умеет в диапазоны вроде «больше N», «меньше N»?
1
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,009
Записей в блоге: 7
11.11.2022, 23:28
Цитата Сообщение от Замабувараев Посмотреть сообщение
для компилятора нет никакой разницы между вызовом си‐функции и функции из винапи
Разница есть. У WinAPI соглашение вызова stdcall, а в Си функций - cdecl. Если компилятор это не знает, код нормально работать не будет.

Замабувараев, чем If не понравился?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.11.2022, 09:34
Цитата Сообщение от locm Посмотреть сообщение
Если компилятор это не знает
Компилятор всегда это знает, потому что соглашение о вызове прописано в декларации функции.
Цитата Сообщение от locm Посмотреть сообщение
чем If не понравился?
If подходит только для бинарного выбора по типу Истина и Ложь.
А когда есть какой‐то диапазон и выбор из более двух значений, то логично использовать оператор выбора чемоданов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2022, 09:34

Лабораторная работа на изучение основ работы с debug.exe
Ход работы 1. Запишите в отчет тему и цель. 2. В командной строке наберите debug. У вас должно появиться на экране окно отладчика с...

Лабораторная работа(Изучение основ.Одномерный и двумерный массивы.Процессы)
Ребята, помогите с задачами, дали написать задачи на VBA (ни разу с ним не имел дела), первые 3 задачи делал на python'e может быть Вы...

Проблема с Imagelist в PowerBasic 10
Я хочу в ресурс вставить одно растровое изображение. Затем с помощью графических команд вырезать кусочки в память и добавлять их в...

FreeBASIC
Заметил, что уже имеющиеся на форуме темы в разделах: - QBasic - Visual Basic - VBA - Pure Basic посещаются довольно часто –...

Уйти с freebasic
написал кое как программу с openCL на freebasic там моделируется взfвимодействие частиц через потенциал парного взаимодейстивия ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
25 модель здравосохранения и функциональных требований к пищеблоку: конфликты функциональных требований.
anaschu 22.06.2026
Есть ли данные о том, какие функциональные/ эксплуатационные требования или их сочетания труднее всего учитывать при проектировании зданий? Да, такие данные есть, и они хорошо описаны и в российской,. . .
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru