FreeBasic
Главная
Вход
Регистрация
Пятница, 19.04.2024, 14:58Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Разные типы массивов чисел в функцию
Разные типы массивов чисел в функцию
sashasoldДата: Воскресенье, 24.01.2021, 22:38 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 41
Репутация: 0
Статус: Offline
Собственно вот:
Код
Sub podprogramma_1(a As Double)
   Print a
End Sub

Dim As Byte b
b=5
podprogramma_1(b)
Print "---"

Sub podprogramma_2(a() As Double)
   Print a(1)
End Sub

Dim As Double massiv_d(1 To 1)
massiv_d(1)=5
podprogramma_2(massiv_d())

Dim As Byte massiv_c(1 To 1)
massiv_c(1)=5
podprogramma_2(massiv_c())

Sleep

можно передавать различные числовые типы в числовую переменную, но не работает для массивов wacko

Вопрос как, это сделать?
И возможно ли передавать любые типы, а потом распознавать их внутри функции при необходимости?


Сообщение отредактировал sashasold - Воскресенье, 24.01.2021, 22:42
 
haavДата: Понедельник, 25.01.2021, 08:36 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
С массивами все строго типизировано, поэтому передавать в одном параметре разные типы как с числовыми переменными не получится.

Как варианты , можно:

1) Использовать перегрузку функций

Код
sub A overload(bArray() as byte)
    
    ? "Array Byte"
    
    for i as Long = 0 to Ubound(bArray)
  
  ? bArray(i)
  
    Next
   
End Sub

sub A overload(dArray() as Double)
    
    ? "Array Double"
    
    for i as Long = 0 to Ubound(dArray)
  
  ? dArray(i)
  
    Next
   
End Sub

dim as Byte bArray(2) = {1,2,3}

dim as Double dArray(3) = {0.0757,0.2324,1.4846235 , 456.23455}

A(bArray())
A(dArray())

Sleep


2) Передавать по указателю

Код
sub A(pArray as any ptr , bType as Byte , iSize as Long)
    
    if bType = 1 then
  
  ? "Array Byte , size="; iSize
  
  for i as Long = 0 to iSize - 1
   
   ? cast(byte ptr , pArray)[i]
   
  Next  
  
    elseif bType = 2 then    
  
  ? "Array Double , size="; iSize
  
  for i as Long = 0 to iSize - 1
   
   ? cast(double ptr , pArray)[i]
   
  Next  
  
    EndIf

End Sub

dim as Byte bArray(2) = {1,2,3}

dim as Double dArray(3) = {0.0757,0.2324,1.4846235 , 456.23455}

A(@bArray(0),1,3)
A(@dArray(0),2,4)

Sleep


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
sashasoldДата: Понедельник, 25.01.2021, 23:58 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 41
Репутация: 0
Статус: Offline
хм.. интересно. Не изучала как то перегруз, ассоциации с этим словом другие =)
Вообщем костыли какие-то. Тогда уж через макрос проще =) Вот жаль FBEdit не показывает списком параметры входящие в него, и не находит объявление через f2
 
zamabuvaraeuДата: Понедельник, 08.02.2021, 09:01 | Сообщение # 4
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Если нужен полиморфный тип данных, попробуйте VARIANT из библиотеки автоматизации:

#include "windows.bi"
#include "win\oleauto.bi"

Dim v As VARIANT

' Указываем тип данных, который будем там хранить:
v.vt = VT_I4 ' Четырёхбайтовое знаковое целое, то есть Long
' Записываем данные
v.lVal = 4

В VARIANT можно положить числа разной битности и дробности, строки (BSTR), массивы (SafeArray), структуры, указатели, объекты автоматизации и экзотику вроде NULL и Empty.
 
Форум » Freebasic » Вопросы по языку FreeBasic » Разные типы массивов чисел в функцию
  • Страница 1 из 1
  • 1
Поиск: