PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вернуть два или три параметра из функции


Вернуть два или три параметра из функции

Сообщений 1 страница 27 из 27

1

часто бывает нужно вернуть два параметра, например размеры, ширина и высота
если оба числа положительные, то можно так
отрицательные числа так неполучается вернуть, или одно или оба кривые возвращаются
может кто найдёт решение для отрицательных чисел, чтобы координаты можно было в зад вертать

так два числа 0-65535

Код:
Procedure u()
Protected w.u, h.u
w=1; число 0-65535
h=5
ProcedureReturn w+h*65536
EndProcedure

; здесь обязательно тип .U
w1.u=u()
h1.u=u()>>16
Debug ""+w1+"  "+h1

так три числа 0-255

Код:
Procedure a()
Protected r.a, g.a, b.a
r=17; число 0-255
g=0
b=254
ProcedureReturn r+g*256+b*65536
EndProcedure

; здесь обязательно тип .A
r1.a=a()
g1.a=a()>>8
b1.a=a()>>16
Debug ""+r1+"  "+g1+"  "+b1

возможны и другие варианты на этой основе, надобности нет, не пробовал

0

2

Привет.
Самый простой способ - это расшарить переменные внутри процедуры. Или сделать эту пару переменных глобальными (не рекомендуется).
Можно чуть больше заморочиться и сделать по сишному - передавать в процедуру ссылки памяти на переменные. 
Если нужны конкретные примеры, напишите.

0

3

Если всё же имеется ввиду именно возвращать, то можно, например, возвращать параметры строкой:
"w=15;h=-20" или проще "15;-20"
Можно воспользоваться массивом или листом. В общем, варианты разные существуют.

0

4

Создаем структуру и через нее возвращаем все что нужно.

Код:
Structure Ret
  s.s
  l.l
EndStructure

Procedure Test(*s.Ret)
  If *s
    *s\s = "Текст"
    *s\l = 1234
  EndIf
EndProcedure

Ret.Ret
Test(Ret)
Debug Ret\s
Debug Ret\l

0

5

newJS написал(а):

часто бывает нужно вернуть два параметра

Вернуть, это значит результат должен участвовать в выражении, например

If F1(1) <> F2(1) : .... : Endif

PureBasic не даёт возможности использовать множественные результаты, а значит и смысла в возврате их нет от слова совсем.

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

useful (jobless)
p.s. если нужны подробности, приведи реальный пример где в это понадобилось.

0

6

Я всё никак не мог задать вопрос по структуре, пока пишу вроде разобрался, потом опять забыл. В общем да со структурой идеально, можно создать любого типа параметры и имея адрес структуры всегда имеем все элементы структуры. Но задавался вопросом как удалить структуру после использования, очистить занимаемую память. И видимо пришёл к выводу, регистрируя переменные мы ведь не очищаем их они всегда занимают некую ширину в памяти, кроме строк. Строки мы приравниваем к пустой строке "" и она занимает меньше память, хотя вопрос освобождает ли PureBasic эту память до нужной длины, думаю да. И элементу структуры с типом строка в структуре тоже находится только адрес строки, и получается поле строки приравнять к пустой строке, будет тот же результат. Поэтому я перестал заморачиваться со структурой понимая что создав их в виде переменных я также не освобожу от них память, что они в структуре, что в отдельных переменных. И конечно адреса переменных в общем не так много занимают памяти, кроме как строки. Допустим я в коде оставляю несоколько строк такого вида

Код:
WriteValue(#HKEY_CLASSES_ROOT, "*\shell\" + ProgFName$.....
WriteValue(#HKEY_CLASSES_ROOT, "*\shell\" + ProgFName$.....

у меня на каждый "*\shell\" создаётся собственный указатель на эти данные, то есть сделаю я вызов 30 раз, у меня будет в exe-файле в чистом виде 30 раз строки "*\shell\", то логичнее мне создать переменную shell$ = "*\shell\" и использовать переменную в место явных текстов, то есть в exe-файле у меня будет 1 раз "*\shell\". Вот тут действительно я сэкономлю на размере кода и памяти во много раз больше чем если бы создал 30 переменных размером в 1-8 байт по сравнению с  30 явных текстов имеющих на каждую букву 1 и более байт.

Отредактировано AZJIO (15.08.2020 14:09:48)

0

7

Structure SSS
  a.i
  b.i
  c.i
EndStructure
;SSS пока не занимает память совсем
;а SizeOf возвращает размер типа SSS
Debug SizeOf(SSS)

Define *pSSS.SSS
; указатель занимает память
Debug SizeOf(*pSSS)
; получаем нужный кусок
*pSSS = AllocateMemory(SizeOf(SSS))

*pSSS\a = 1
*pSSS\b = 2
*pSSS\c = 3
Debug "-------------"
Debug *pSSS\a
Debug *pSSS\b
Debug *pSSS\c

; Со времён самых древних ассемблеров конструкции аналогичные структурам
; всего лишь описывают смещения и размеры составных элементов от какого то условного
; стартового адреса но не занимают память
; А в последующем эти стартовые адреса могут меняться и их может быть больше чем один

Define *pZZZ.SSS
*pZZZ = AllocateMemory(SizeOf(SSS))
*pZZZ\a = *pSSS\a + 10
*pZZZ\b = *pSSS\b + 20
*pZZZ\c = *pSSS\c + 30
Debug "-------------"
Debug *pZZZ\a
Debug *pZZZ\b
Debug *pZZZ\c
;освобождаем
FreeMemory(*pSSS)
FreeMemory(*pZZZ)

;AllocateMemory(SizeOf(SSS)) можно заменить *Item.StructureName = AllocateStructure(StructureName) и FreeStructure(*Item)

Отредактировано useful (15.08.2020 15:25:26)

0

8

AZJIO написал(а):

Но задавался вопросом как удалить структуру после использования, очистить занимаемую память. И видимо пришёл к выводу, регистрируя переменные мы ведь не очищаем их они всегда занимают некую ширину в памяти, кроме строк.

Не только строк, но массивов и списков. Тогда очистку нужно производить функцией ClearStructure или ResetStructure https://www.purebasic.com/documentation … tions.html
Локальные экземпляры структур очищает компилятор при выходе из процедуры.
Кроме того можно создавать и освобождать структуры функциями AllocateStructure и FreeStructure

AZJIO написал(а):

у меня будет в exe-файле в чистом виде 30 раз строки "*\shell\"

Это строковая константа. Нет смысла хранить в исполняемом файле много одинаковых строк. Поэтому компилятор исключает лишние.

Код:
Debug @"*\shell\"
Debug @"*\shell\"
Debug @"*\shell\"
Debug @"*\shell\"

0

9

AZJIO написал(а):

у меня будет в exe-файле в чистом виде 30 раз строки "*\shell\"

не не будет
тоже как то заморочился этим, написал разные гаджеты с одинаковым текстом, сгенерил экзешник и просмотрел его, нашлась только одна строка
как Пётр сказал, компилятор выкинул лишние

Timon написал(а):

возвращать параметры строкой:

ну это каменный век, да и разница работы со строками или с числом

useful написал(а):

p.s. если нужны подробности, приведи реальный пример где в это понадобилось.

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

0

10

newJS
Если это временные значения, можно создать 2-3 переменных tmp1, tmp2...tmpN; tmp1$, tmp2$...tmpN$, хотя код с ними неудобно читать или надо привыкать. И это экономит буквально байты, но меньше имён переменных на каждый чих. Ну и плюс вышеупомянутая структура по указателю AllocateStructure а брать поля можно по смещению. Но опять же это не тот универсальный случай, то есть надо читать спецификацию возвращаемых данных, не то чтобы выложить инклуд и чел просто вызвав получил данные, то есть в примерах показывать как извлекать данные.

0

11

не совсем правильно сделал изначальный пример
так правильней

Код:
Procedure two()
Protected w.u, h.u
w=14567; числа 0-65535
h=53333
ProcedureReturn w+h<<16; или *65536
EndProcedure


Procedure getTwo()
Protected n, w.u, h.u
n=two()
w=n
h=n>>16

Debug ""+w+"  "+h

w=two()
Debug w

h=two()>>16
Debug h

EndProcedure


getTwo()

и сравните со своими предложениями, особо строки порадовали
недостаток способа, это обязательное использование правильных переменных

useful написал(а):

Вернуть, это значит результат должен участвовать в выражении, например

то что ты имеешь ввиду предполагает возврат одного параметра, и только одного
и какой термин ты предлагаешь в этом случае использовать?

0

12

Оставим пока терминологию.
Я другого не пойму, т.е. откуда вообще проблема множественного возврата у тебя появилась.
Вот из переведённой справки
;Пример: Статический, динамический массив и передача структуры в процедуру

Код:
  Structure Whatever
    a.l
    b.l[2]          ; Статический массив не изменяемого размера (стандарт C), с 2 значениями b [0] и b [1].
    Array c.l(3,3)  ; Динамический массив с 16 значениями от c(0,0) до c(3,3), изменяемый с помощью ReDim()
  EndStructure

  Define MyVar.Whatever

  Procedure MyProcedure(*blahblah.Whatever)
    *blahblah\a = 5
    *blahblah\b[0] = 1
    *blahblah\b[1] = 2
    *blahblah\c(3,3) = 33
  EndProcedure

  MyProcedure(@MyVar)
  Debug MyVar\a
  Debug MyVar\b[0]
  Debug MyVar\b[1]
  Debug MyVar\c(3,3)

Демонстрирует, что передать можно сколько угодно и по завершению ( вместо "вернуть" ) иметь доступ к ультра разнообразным результатам работы процедуры
И вариантов обеспечения доступа к исходным данным и результатам их обработки почти бесконечность.

Просто PB далёк от академичности Сишной с типизированными указателями и параметрами передаваемыми [по ссылке] / [по значению] других языков, но через указатели на структуры, в том числе простейшие для одного значения типа
Structure ascii
a.a
EndStructure
Можно передать на обработку и обеспечить доступ к её результатам почти безграничного количества вариантов.

Код:
Define po_znacheniyu_1.a
Define po_znacheniyu_2.a
;...
Define po_znacheniyu_N.a

Define po_ssylke_1.Ascii
Define po_ssylke_2.Ascii
;...
Define po_ssylke_N.Ascii

Procedure tst_pzps(pz1.a,pz2.a,pzn.a, *ps1.Ascii,*ps2.Ascii,*psN.Ascii) 
  *ps1\a = pz1 + 10
  *ps2\a = pz2 + 10
  *psN\a = pzN + 10
EndProcedure 

po_znacheniyu_1=1
po_znacheniyu_2=2
po_znacheniyu_N=9 

po_ssylke_1\a = 0
po_ssylke_2\a = 0
po_ssylke_N\a = 0

Debug po_ssylke_1\a
Debug po_ssylke_2\a
Debug po_ssylke_N\a

tst_pzps(po_znacheniyu_1,po_znacheniyu_2,po_znacheniyu_N,@po_ssylke_1,@po_ssylke_2,@po_ssylke_N)

Debug po_ssylke_1\a
Debug po_ssylke_2\a
Debug po_ssylke_N\a

Отредактировано useful (16.08.2020 07:07:24)

0

13

useful
по ссылке я уже выкладывал свой вариант

Код:
EnableExplicit

Procedure.s TrimRight(*a, n)
	Protected *p.string = @*a
	*p\s = Left(*p\s, Len(*p\s) - n)
EndProcedure

Procedure.s TrimLeft(*a, n)
	Protected *p.string = @*a
	*p\s = Right(*p\s, Len(*p\s) - n)
EndProcedure

Define x.s = "Привет"
TrimRight(@x, 2)
Debug x

0

14

Похоже, мы не правильно понимаем автора. Он не ищет других вариантов. Ему надо, что бы его же код, выложенный в первом посте работал с отрицательными значениями.
Если так, тогда вот:

Код:
Procedure u()
Protected w.w, h.w
w=15; число 0-65535
h=-20
ProcedureReturn w+h*65536
EndProcedure

; здесь обязательно тип .U ---- НЕТ, ТИП W для отрицательных значений
w1.w=u()
h1.w=u()>>16
Debug ""+Str(w1)+"  "+Str(h1)

0

15

Строки в PB это особый случай и ваш пример хорош до тех пор пока Фред не изменит внутреннюю структуру хранения строк, в которой сейчас хранится указатель на область памяти ограниченную нулём, а если вдруг решит хранить длину по паскалевски?
Для базовых типов имеем структуры
Byte
Ascii
Character
Word
Unicode
Long
Integer
Float
Quad
Double
String

Код:
Define po_znacheniyu_1.s
Define po_znacheniyu_2.s
;...
Define po_znacheniyu_N.s

Define po_ssylke_1.String
Define po_ssylke_2.String
;...
Define po_ssylke_N.String

Procedure tst_pzps(pz1.s,pz2.s,pzn.s, *ps1.String,*ps2.String,*psN.String) 
  *ps1\s = pz1 + "10"
  *ps2\s = pz2 + "10"
  *psN\s = pzN + "10"
EndProcedure 

po_znacheniyu_1="1"
po_znacheniyu_2="2"
po_znacheniyu_N="9"

po_ssylke_1\s = "_"
po_ssylke_2\s = "_"
po_ssylke_N\s = "_"

Debug po_ssylke_1\s
Debug po_ssylke_2\s
Debug po_ssylke_N\s

tst_pzps(po_znacheniyu_1,po_znacheniyu_2,po_znacheniyu_N,@po_ssylke_1,@po_ssylke_2,@po_ssylke_N)

Debug po_ssylke_1\s
Debug po_ssylke_2\s
Debug po_ssylke_N\s

0

16

Нет, правильно так:

Код:
; Возврат из процедуры двух координат, значения каждой могут быть -32768 to +32767
; Но можно и расширить диапазон значений
Procedure u()
  Protected w.w, h.w, res.l
  w=32767;
  h=-32768
  PokeW (@res, w)
  PokeW (@res+2, h)
  ProcedureReturn res
EndProcedure

result.l=u()

Debug PeekW (@result)
Debug PeekW (@result+2)

В предыдущем примере оператор сдвига не подходит.

+1

17

useful написал(а):

Я другого не пойму, т.е. откуда вообще проблема множественного возврата у тебя появилась.
Вот из переведённой справки
;Пример: Статический, динамический массив и передача структуры в процедуру

ну и нахрена весь этот огород? если можно сделать проще? без передачи параметров, без структур, вообще ни чего лишнего

useful написал(а):

Демонстрирует, что передать можно сколько угодно и по завершению ( вместо "вернуть" ) иметь доступ к ультра разнообразным результатам работы процедуры
И вариантов обеспечения доступа к исходным данным и результатам их обработки почти бесконечность.

нередко нужно возвращать два параметра, ширину/высоту, координаты из своих мелких функций
а там где нужно много параметров, там структура с глобальной переменной, мне так удобней
в апи этот фокус используется, так что идея не моя

Timon написал(а):

Похоже, мы не правильно понимаем автора. Он не ищет других вариантов.

да, я выложил ещё один свой вариант, а всё предложенное мне известно и не устраивает в конкретных случаях

Timon написал(а):

Ему надо, что бы его же код, выложенный в первом посте работал с отрицательными значениями.
Если так, тогда вот:

если бы так работало, было бы хорошо, но не работает, даже про апи пишут, этот фокус только для положительных чисел
поробуй -15 и -20, получишь -15 и -21

Timon написал(а):

; Возврат из процедуры двух координат, значения каждой могут быть -32768 to +32767 ; Но можно и расширить диапазон значений

а так работает, и возможности большие, спасибо, будем использовать

0

18

И всё таки присмотрись и по пробуй понять моё недоумение.
Мой вариант заведомо проще и условно "правильнее" (условно, потому что все работающие программы правильны )

Код:
Procedure u(*pw.Unicode,*ph.Unicode)
  *pw\u = 1
  *ph\u = 5
EndProcedure

Define w.u = 0
Define h.u = 0
u(@w,@h)
Debug ""+w+"  "+h
Код:
Procedure a(*pr.Ascii,*pg.Ascii,*pb.Ascii)
*pr\a=17
*pg\a=0
*pb\a=254
EndProcedure

Define r.a = 0
Define g.a = 0
Define b.a = 0

a(@r,@g,@b)

Debug ""+r+"  "+g+"  "+b

Или например так

Код:
Structure _WH_
  w.u
  h.u
EndStructure
Procedure GetWH(*pwh._WH_)
  *pwh\w = 1
  *pwh\h = 5
EndProcedure
Define wh._WH_
GetWH(@wh)

Debug wh\w
Debug wh\h

Отредактировано useful (17.08.2020 16:16:41)

0

19

useful написал(а):

И всё таки присмотрись и по пробуй понять моё недоумение.

а ты моё
ну почему я должен создавать структуру, потом при каждом вызове функции передавать эту структуру в качестве параметра
зачем? если можно обойтись и без структуры и без передачи параметров
при большом количестве вызовов сколько лишнего кода будет
ещё раз напомню, речь о возврате двух чисел и винда сей фокус использует
вот стало интересно, а в чём столь жуткий недостаток предложенного мною способа? ты так усердно пытаешься его запинать ногами :D

------

тут вот непонятка вылезла, растолкуйте
при выходе из процедуры переменная res.l будет уничтожена, а значит занимаемая её память будет возвращена системе и может быть затёрта
или я неправ?

Timon написал(а):

; Возврат из процедуры двух координат, значения каждой могут быть -32768 to +32767 ;
Но можно и расширить диапазон значений
Procedure u()
Protected w.w, h.w, res.l
w=32767;
h=-32768 PokeW (@res, w)
PokeW (@res+2, h)
ProcedureReturn res
EndProcedure
result.l=u()
Debug PeekW (@result)
Debug PeekW (@result+2)

0

20

newJS
да, res.l будет возвращена системе. Такая концепция, локальные переменные уничтожаются.

0

21

newJS написал(а):

...
ну почему я должен создавать структуру, потом при каждом вызове функции передавать эту структуру в качестве параметра
зачем?

Присмотрись ещё раз!

Структуры не создаются и не уничтожаются. У тебя в принципе пробел в понимании сути языков программирования.
Когда то в программировании речь шла о том, что нужное лежит по адресу, а следующее со смещением таким то от этого адреса, а зная размер каждого нужного мы можем вычислять смещение по номеру или наоборот номер по смещению.
Так вот структуры и по разному называющиеся аналогичные приёмы ещё с древних ассемблеров (этим они отличались от автокодов) всего лишь позволяют описать наглядно участок памяти состоящий из элементов и глядя на это описание не человек а ассемблер/компилятор/транслятор в состоянии вычислить размеры и смещения. Причём одна и таже программа для разных архитектур(в Си и самих процессоров) преобразуется в разные коды.

newJS написал(а):

...
сколько лишнего кода будет...

В моём случае как раз кода (РЕЗУЛЬТИРУЮЩЕГО) а не в исходнике заведомо меньше и он качественнее.
У тебя в представлениях перепутан исходник с кодом.

Я не понимаю, зачем сопротивляться против очевидного

Код:
Procedure u(*w.Word,*h.Word)
  *w\w =  32767
  *h\w = -32767
EndProcedure
Define w.w,h.w
u(@w,@h)
Debug w
Debug h

p.s. И даже если действительно есть необходимость упаковать в один базовый тип несколько других размером по меньше для этого существует StructureUnion а не упаковка-распаковка.

Отредактировано useful (27.08.2020 17:52:18)

0

22

Объявление структуры хоть и не имеет данных, пока структура не создана, а только обозначены её поля, она всё равно на каждый элемент данных должна иметь смещение, то есть в структуре 8 полей, значит на чтение этих полей должно быть минимум 8 смещений, ну или 7 если первое смещение всегда 0. Содержимое полей имеет в среднем тот же размер, что и размер выделяемый на смещения. Думаю что функционал для взятия данных из структуры не сложнее чем объединять числа в двойное слово. Если в коде использовать координаты в виде переменных, что мешает их использовать всегда в виде структур.

0

23

useful написал(а):

Структуры не создаются и не уничтожаются. У тебя в принципе пробел в понимании сути языков программирования.

пробел? да не, там их целая толпа, и я об этом знаю

useful написал(а):

В моём случае как раз кода (РЕЗУЛЬТИРУЮЩЕГО) а не в исходнике заведомо меньше и он качественнее.
У тебя в представлениях перепутан исходник с кодом.

ну да, не люблю лишнюю писанину, и именно это имел ввиду

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

AZJIO написал(а):

да, res.l будет возвращена системе. Такая концепция, локальные переменные уничтожаются.

вот и я про это, сей код ошибочный

useful написал(а):

Мой вариант заведомо проще и условно "правильнее" (условно, потому что все работающие программы правильны )

значит мой вариант тоже правильный, так чё вы упираетесь?
уже спрашивал, ещё раз спрашиваю, в чём неправильность моего варианта?

0

24

newJS

вот и я про это, сей код ошибочный

Если бы он был так

Код:
ProcedureReturn @res

то да, но он так

Код:
ProcedureReturn res

res уничтожается, но передаёт содержимое в точку вызова. А проблема @res в том, что когда res уничтожается указатель недействительный.

0

25

Из последней русифицированной справки.

Код:
Structure RGBA   ;  Создаём шаблон Структуры RGBA (тип RGBA, назовите тип как Вам удобно),
  StructureUnion ;  и вкладываем в него Структурное Объединение,
    color.l      ;  в котором объединяем переменную 'color' с типом Long (4 байта),
    byte.a[4]    ;  и статический массив с типом ASCII (1 байт), элементы массива накладываются на байты переменной 'color'.
  EndStructureUnion
EndStructure

col.RGBA  ; Создаём экземпляр структуры RGBA, в виде переменной col с типом RGBA.

col\color = RGBA(255, 200, 150, 100)  ; Присваиваем полю 'color' значение RGBA. 
Debug "Красный:   " + col\byte[0]     ; Считываем значение из нужного элемента массива (он же байт переменной 'color').
Debug "Зелёный:   " + col\byte[1]     ; Так можно объединять и разделять много-компонентные значения на составляющие.
Debug "Синий:     " + col\byte[2]     ; В данном случае получилось разделение, но если записать компонентные значения по  
Debug "Прозрачность:  " + col\byte[3] ; элементам массива, то значение считанное из col\color - будет полным значением RGBA.

Главное, что во всех твоих вариантах лишнее - это упаковка и распаковка на этапе исполнения, я и другие показывают варианты в которых компилятор организует код в котором не требуется упаковка и распаковка а действия сразу происходят с фрагментами но возвращается целое

И нет упирающихся, есть упирающийся )))

offtopic:
Маленькая историческая иллюстрация того, что структуры специально придуманы для манипулирования "кусками" памяти целиком если нужно или ими же по частям

Изделие 171 https://www.vpk-news.ru/articles/36177 в части системы обнаружения и наведения начинали испытывать в КапЯре в середине 80х прошлого века.
Телеметрический кадр постоянно менялся и была вечно переписываемая с более 50% из за этого мёртвого кода программа на ассемблере, которая мне и досталась по наследству.
Разбираться в чужом на скорую руку многократно переписанном коде без документации на ассемблере, то ещё развлечение. И как часто бывает в таких случаях сроки поджимают.

Что нужно сделать? Из за дефицита битности, те кто ставил датчики извращались как могли, однажды при подготовке к конференции по унификации и стандартизации мы насчитали 16 способов представления отрицательного 16-рязрядного числа.
Из телеметрического кадра разбитого на битовые фрагменты нужно было извлечь осмысленные значения датчиков с привязкой с службе единого-времени учитывая ещё при этом что автономный таймер-генератор самой рлс всё время куда то плыл.

И тут я вспомнил, что в PL/1 есть во первых возможность в так называемых базированных структурах описывать произвольные участки памяти с точностью до бита, а не байта а плюс к этому оператор BY NAME https://progi.pro/naznachenie-strukturi … ii-6451384
т.е. в последующем нужно было только описывать исходную структуру в соответствии с ТЗ, накладывать на буфер в памяти для чтения с исходной ленты, описывать результирующую структуру с осмысленными числовыми полями для записи на другую ленту и делать в цикле
Структура.Результат = Структура.Исходник BY NAME вместо постоянного переписывания асмовского кода. Я по семейным на Камчатку не поехал, был только в командировке сдавая им свой вариант.
Потом слышал, что эта простейшая программа проработала до смерти последней большой ЕС-ки в Ключах лет восемь-девять.

Отдельной строкой нужно упомянуть, что был бит(фигурально) в курилке, когда поняли, что моя программа ещё и асинхронно по вводу выводу с двумя лентами работала и могла трансформацию BY NAME в несколько потоков делать. Т.е. если она запускалась, то все терминалы у всех переставали "жить". С тех пор я с улыбкой читаю всякие НОВОСТИ с упоминанием слова АСИНХРОННО. )))

https://www.etoretro.ru/data/media/258/13661852515d9.jpg

На фото меня нет, просто место-время совпадают.

Отредактировано useful (28.08.2020 09:00:47)

0

26

useful
там нет особой упаковки и распаковки, там битовый сдвиг и обнуление. Например числа 541 и 679 записываются как одно число 541679, потом методом сдвига получаем 541679->41679->1679->679.

0

27

AZJIO написал(а):

useful
там нет особой упаковки и распаковки, там битовый сдвиг и обнуление. Например числа 541 и 679 записываются как одно число 541679, потом методом сдвига получаем 541679->41679->1679->679.

Это я всё прекрасно понимаю, но зачем? Если есть десяток штатных способов этого не делать.
Я понял бы если бы фрагменты были не кратны базовым типам, я выше описал ситуацию из истории.
====================
Заварил кофе, открыл habr по листать и чуть клаву не залил.....
https://habr.com/ru/company/plarium/blog/516944/

Отредактировано useful (28.08.2020 14:45:49)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вернуть два или три параметра из функции