FreeBasic
Главная
Вход
Регистрация
Суббота, 20.04.2024, 08:03Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Исходники » класс Array (массивы, разные переменные + сортировка)
класс Array
кПДата: Воскресенье, 16.02.2020, 10:52 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
вероятно будет полезно
блин как тут архивы вставлять ?

ссылка Array
Прикрепления: ar.zip (16.4 Kb)


Сообщение отредактировал кП - Воскресенье, 16.02.2020, 10:59
 
haavДата: Воскресенье, 16.02.2020, 14:13 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Небольшой пример бы не помешал.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
кПДата: Воскресенье, 16.02.2020, 14:30 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
в readmi справка по методам с пояснениями
пример:

#include "ar\Array.bi"

sub ssub()
    ? "SUB"
end sub

dim ar as Array
ar[0] = "qwerty"
ar[1] = 1233
ar[2] = @ssub
ar.toString
ar.sort(16)
ar.printall

dim t as Array
t.name_ = "T"

t[0] = ar
t.printall
print t[0][0]

sleep

Добавлено (16.02.2020, 14:43)
---------------------------------------------
пример:

#include "ar\Array.bi"

sub ssub()
    ? "SUB"
end sub

function fun(s as Array)as integer
    ? "FUNCTION"
    return 1
end function 

dim iptr as integer ptr = @fun

dim ar as Array
ar[0] = @ssub
ar[1] = @fun
ar[2] = @iptr

ar.printall

dim  su as sub() = ar[0]
dim fu as function(as Array)as iteger = ar[1]
dim ptrr as integer ptr = ar[2]

sleep

Добавлено (19.02.2020, 13:23)
---------------------------------------------
Просьба, если встретите ошибки отписаться в личку. Ну и предложения\пожелания по коду, тоже в личку.

 
ntvgjhfnjДата: Пятница, 04.11.2022, 10:06 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Не могу понять в чём причина вылета программы?

Код

/'
    array.bi
'/

#Ifndef __ARRAY__
#Define __ARRAY__
'
Enum atype
Undefined    = 0

aString  = 1
aPtr
End Enum

Dim Shared As UInteger num    =-1  ' íóìåðàöèÿ ìàññèâîâ

Type Array
    Declare Constructor()
    
    Declare Operator []( index_ As Integer ) ByRef As Array
    
    Declare Operator Let( rhs As String )
    Declare Operator Let( rhs As Any ptr )
    
    Declare Operator Cast() As String
    Declare Operator Cast() As Sub()
    
    ad(Any)As String    '
    td(Any)As byte
    As UInteger i,ii    ' èíäåêñû ìàññèâà
    
End Type

Constructor Array()
    Static As UInteger count
    count = num
    count += 1
    num = count
    
    ReDim ad(0) As String
    reDim td(0) As Byte
End Constructor

Operator Array.[]( index_ As Integer ) ByRef As Array
    'switch = true
    If index_ <= 0 Then index_ = 0

    'If triger Then ii = index : triger = false Else i = index_ : triger = true
    i = index_

    If index_ >= UBound(ad) Then
  ReDim Preserve ad(index_ +1) As String
  ReDim Preserve td(index_ +1) As byte
    EndIf

    'If typeData(index_) = aArray Or typeData(index_) = aPointer Then
    '    Return *(CPtr( Array Ptr, cInt(*ad(index_))))
    '    'Return toArray(ad(index_))
    'Else
  Return This
    'EndIf
End Operator

Operator Array.Let( rhs As String )
    If @This <> @rhs Then
  ad(i) = rhs
  td(i) = aString
  ? "Let ";i,ad(i)
    EndIf
End Operator

Operator Array.Let( rhs As Any Ptr )
    If @This <> @rhs Then
  ad(i) = Str(@rhs)
  td(i) = aPtr
  ? "Let ";i,ad(i)
    EndIf
End Operator

Operator Array.Cast() As String
    If td(i) = aArray Then
  ? "Cast 0 ";i,"AD"
  Return "AD"
    Else
  ? "Cast 1 ";i,ad(i)
  Return ad(i)
    EndIf
End Operator

Operator Array.Cast() As Sub()
    ? "Cast 1 ";i,ad(i)
    Return CPtr( Sub() , cast( Integer , ad(i)))
End Operator

#EndIf
__ARRAY__

#Ifdef __FB_MAIN__
'
Dim As Array a
a[0] = "wer"
? a[0]

Sub su()
    ? "SUB"
End Sub

a[1] = @su
Dim s As Sub() = a[1]
? a[1]

s() ' здесь зависает программа
sleep
#endif



Причём в этом коде всё работает:
Код

Sub cm( )
    ? "SUB"
End Sub

? @cm

Dim s(3) As String  
s(0) = Str(@cm)
? s(0)

Dim su As Sub() = CPtr( Sub() , cast( Integer , s(0) ))
? @su : ?

su()

Sleep


polopok
 
haavДата: Пятница, 04.11.2022, 14:35 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
@ntvgjhfnj

Что у вас вообще такое? У меня это даже не компилируется.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ntvgjhfnjДата: Пятница, 04.11.2022, 20:51 | Сообщение # 6
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
в том то и дело не компилируется , а должно.

s() ' здесь зависает программа - !!! эту строку закоментировать, будет компелироваться .


polopok
 
haavДата: Пятница, 04.11.2022, 21:14 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата ntvgjhfnj ()
в том то и дело не компилируется , а должно.

s() ' здесь зависает программа - !!! эту строку закоментировать, будет компелироваться .


Дело не в этой строчке , тут другие ошибки. Пример не полный.

Цитата
FBTEMP.bas(82) error 42: Variable not declared, aArray in 'If td(i) = aArray Then'
FBTEMP.bas(82) error 3: Expected End-of-Line, found 'aArray' in 'If td(i) = aArray Then'
FBTEMP.bas(85) error 117: ELSE without IF, found 'Else' in 'Else'
FBTEMP.bas(88) error 129: Expected 'END OPERATOR', found 'EndIf' in 'EndIf'


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ntvgjhfnjДата: Пятница, 04.11.2022, 21:17 | Сообщение # 8
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Вот рабочий вариант сделал ( ! не все методы проверил )
ссылка https://transfiles.ru/i60nm

Dim su As Sub() = @b[1] решение выделил жирным , в верхнем примере такой подход не проходит ( правда там не String Ptr )
su()

Добавлено (04.11.2022, 21:25)
---------------------------------------------

Цитата haav ()
Дело не в этой строчке , тут другие ошибки. Пример не полный.


Enum atype
Undefined = 0
aArray это надо добавить
aString = 1
aPtr
End Enum

's() ' здесь зависает программа Это закоментировать ( сама проблемма )


polopok

Сообщение отредактировал ntvgjhfnj - Пятница, 04.11.2022, 21:19
 
haavДата: Суббота, 05.11.2022, 05:46 | Сообщение # 9
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Код
Operator Array.Let( rhs As Any Ptr )
    If @This <> @rhs Then
  ad(i) = Str(@rhs) ' <- здесь что присваивается? Убери собаку и будет работать.
  td(i) = aPtr
  ? "Let ";i,ad(i)
    EndIf
End Operator


Вникать в код полностью вообще не хочется , но текущую ошибку я нашел.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ntvgjhfnjДата: Суббота, 05.11.2022, 06:53 | Сообщение # 10
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Точно, исправил , помогло, заработало. благодарю ! ( видать сам себя запутал )

/К сожалению так до конца работу с указателями не понимаю , часто путаюсь./

P.S. Рекомендую добавить ='[!'],'],,,0 в группу [Block] в файле FbEdit.ini .
Это сворачивает лишний код , но исполняет. Да и структуру поддерживает ( правда иногда лагает при разворачивании, но исправляется автоформатом )


polopok
 
haavДата: Суббота, 05.11.2022, 07:01 | Сообщение # 11
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата
Рекомендую добавить ='[!'],'],,,0 в группу [Block] в файле FbEdit.ini


Я уже давно не пользуюсь FbEdit по 2 причинам:

1) Большую часть времени пишу в линуксе , даже если программа для линукса и винды
2) Задолбали вот такие штуки: ' íóìåðàöèÿ ìàññèâîâ


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ntvgjhfnjДата: Суббота, 05.11.2022, 15:39 | Сообщение # 12
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Цитата haav ()
1) Большую часть времени пишу в линуксе , даже если программа для линукса и винды


А я вот ни как не осмелюсь, просто много барахла заточено под Винду
FbEdit !? - просто привык


polopok
 
zamabuvaraeuДата: Понедельник, 07.11.2022, 18:39 | Сообщение # 13
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
FbEdit — красиво, но как только начинается применение на практике, оказывается неюзабельным.
К тому же оно больше десяти лет назад не развивается.

В настоящее время использую Visual Studio Code, всем доволен. Там даже отлаживать можно мышкой.
А чтобы посмотреть на скорую руку — это Far Manager или Notepad++.
 
ntvgjhfnjДата: Вторник, 08.11.2022, 19:26 | Сообщение # 14
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
подкиньте примеры с использованием макроса в типе , если такое возможно !

Код

type p
declare sub d()
#macro hit() 'вот тутова
#endmacro
end type

sub p.d()
end sub

p.hit()  что-то вроде этого

dim as p tt
tt.hit() чтоб вызов макроса был как процедуры



Добавлено (09.11.2022, 11:42)
---------------------------------------------
ссылка https://transfiles.ru/b6uq7 переработанный код с примерами

Добавлено (14.11.2022, 00:04)
---------------------------------------------
Ссылка https://transfiles.ru/qatxk обновлённый исправленный. Примеры в самом низу Array.bi раскоментировать и ... .Читать readmy .
Сортировку не делал кому надо сам допилит, думаю.
Всем респект!

Добавлено (14.11.2022, 20:43)
---------------------------------------------
Забыл добавить в тип:
Код

Type Array extends object

. . .

'[ Other
    Declare function  notnone    () As Array


в методы:

Код

'[ Other
function Array.notnone() As Array
    Dim at As Array
    
    If This.lenght = 1 Then
  If this.td(0)= aUndefined Then
   ReDim ad(0) As string
   ReDim td(0) As byte
  EndIf
    ElseIf This.lenght > 1 Then
  Dim j As Integer, k As Integer = 0 : num-=1
  
  For j = 0 To This.lenght - 1
   If this.td(j) <> aUndefined Then
    at[k] = This[j] : k+=1
   EndIf
  Next
  
  This = at
    Else
  ReDim ad(0) As string
  ReDim td(0) As byte
    EndIf
    
    Return at
End Function


В Readmy :
Notnone - удаляет из данного массива все неопределённые Undefined элементы и возвращает как новый массив. Arr = Ar.Notnone


polopok

Сообщение отредактировал ntvgjhfnj - Понедельник, 14.11.2022, 20:44
 
ntvgjhfnjДата: Пятница, 09.12.2022, 16:20 | Сообщение # 15
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Всё в одном файле Array.bi и примеры в нём .
Последняя редакция на момент :
Прикрепления: Array.rar (8.2 Kb)


polopok

Сообщение отредактировал ntvgjhfnj - Пятница, 09.12.2022, 16:21
 
Форум » Freebasic » Исходники » класс Array (массивы, разные переменные + сортировка)
  • Страница 1 из 1
  • 1
Поиск: