Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Циклы, объекты, потоки

  1. #1 Циклы, объекты, потоки 
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    Предисловие
    Возможно, и даже более вероятно, что все нижеизложенное есть "Филькина грамота", не несущая в себе никакой ценности,
    т.к. все уже давно известно или просто таких проблем нет в принципе, однако, в интернете на это тему ничего не нашел,
    поэтому пишу на случай, если кому-то понадобится.
    (Извините за мои "термины", возможно, не соответствующие общепринятым)



    Здравствуйте.

    Как-то раз мне в голову пришла одна идея: "Объекты и потоки, объекты и потоки... - это же идеально совмещается!". Но
    не тут-то было: FreeBasic не поддерживает такую взаимосвязь во всех ее проявлениях. Но, т.к. компилятор FB умеет
    оставлять asm-листинг (или как-то так), а также позволяет вставлять в программу asm-куски, думаю, в этом всем можно
    навести свой порядок.


    Начал я разбираться во всем этом с циклов. Сколько раз я упирался в то, что нельзя в качестве
    счетчика использовать элемент массива или свойство объекта. Судя по всему, другие языки тоже в счетчике цикла видят
    только обычную переменную, без всяких наворотов.
    Код
    FreeBasic Code:
    1. dim i(1 to 1) as integer
    2. for i(1) = 1 to 2
    3. next i

    Такой код вылетает с ошибкой " Expected scalar counter, before 'i' in 'For i(1)=1 To 2' "
    Могу вам представить то, что я написал по циклам. Особой скорости, конечно, ждать не приходится, но что смог, сделал:
    Код
    FreeBasic Code:
    1. Sub mFor naked Cdecl(ByRef x As Integer, y As Integer, z As Integer)
    2. Asm
    3. 'устанавливаем счетчик в начальное положение
    4. mov eax, [esp+8]  'берем из стека начальное положение
    5. mov ebx, [esp+4]  'берем из стека указатель на счетчик
    6. mov [ebx], eax
    7. '[esp]-[esp+12]-здесь отныне и до конца цикла хранятся данные цикла (при "выравненном" стеке)
    8.  
    9. 'пропускаем удаление параметров данное процедуры
    10. Add dword Ptr [esp], 3
    11.  
    12. 'возвращаемся в родительский процесс
    13. jmp [esp]
    14. End Asm
    15. End Sub
    16.  
    17. Sub mNext naked Cdecl()
    18. Asm
    19. 'забираем из стека адрес возврата
    20. pop ecx
    21.  
    22. 'инкрементируем счетчик
    23. mov eax, [esp+4]
    24. inc dword Ptr [eax]
    25.  
    26. 'сравниваем счетчик с конечным значением
    27. mov ebx, [esp+12]
    28. cmp dword Ptr [eax], ebx
    29.  
    30. 'новая итерация или выход из процедуры - конец цикла
    31. jg .MFOR
    32. jmp [esp]
    33. .MFOR:
    34.  
    35. 'освобождаем память от данных стека - смещаем вершину стека.
    36. Add esp, 16
    37.  
    38. 'возвращаемся
    39. jmp ecx
    40. End Asm
    41. End Sub
    42.  
    43. dim i as integer, j as integer
    44. mFor (i, 1, 10)
    45.     mFor(j, 1, 2)
    46.         print i, j
    47.     mNext()
    48. mNext()



    После я начал разбираться с методами, долго мудрил, оказалось, что ведет себя метод как обычная процедура, первый
    параметр которой (т.е. верхний в стеке) - указатель на объект. Поэтому запуск метода в поток выглядит как_бы так:
    Код
    FreeBasic Code:
    1. ...
    2. dim probe as obj
    3. threadcreate (@probe.method, @probe)

    т.к. единственный параметр, которым может передавать в процедуру threadcreate - это указатель. Проблема здесь в том,
    что просто так "@probe.method" получить адрес на метод не получится. Компиляция прервется с ошибкой " Syntax error ",
    дескать, найдите процедуру получше. Один из способов это исправить заключается в получении адреса метки
    подпрограммы (в нашем случае, метода), к примеру, таким образом:
    Код
    FreeBasic Code:
    1. Type obj
    2. x As Integer
    3. Declare Sub pr()
    4. End Type
    5.  
    6. Dim t As obj
    7. Asm
    8. mov eax, offset __ZN3OBJ2PREv@4
    9. push 1
    10. push eax
    11. push 0
    12. Call _fb_PrintInt@12
    13. End Asm
    14. Sleep
    15.  
    16. Sub obj.pr()
    17. End Sub

    Минус этого способа в том, что либо нужно хорошо знать алгоритм формирования меток методов, либо постоянно
    просматривать asm-листинг программы. Чтобы хоть как-то автоматизировать процесс получения адреса, я написал
    следующее:
    Код
    FreeBasic Code:
    1. Dim Shared p As Any Ptr
    2. Dim Shared inithreadcreate As Integer
    3.  
    4. Sub initialbegin naked Cdecl()
    5. Asm
    6. pop ebx  'берем адрес возврата
    7. mov eax, offset _INITHREADCREATE   'устанавливаем в глобальной переменной значение 1
    8. mov dword Ptr [eax], 1
    9. jmp ebx  'возвращаемся
    10. End Asm
    11. End Sub
    12.  
    13. Sub initialend naked Cdecl()
    14. Asm
    15. pop ebx   'берем адрес возврата
    16. mov eax, offset _INITHREADCREATE   'устанавливаем в глобальной переменной значение 0
    17. mov dword Ptr [eax], 0
    18. jmp ebx  'возвращаемся
    19. End Asm
    20. End Sub
    21.  
    22. Sub getoffset naked Cdecl(x As Integer)
    23. Asm
    24. pop eax  'получаем адрес возврата
    25. mov edx, offset _INITHREADCREATE 'проверяем значение в глобальной переменной
    26. cmp dword Ptr [edx], 1
    27. jl .Thcrcontinue  'если 0, то пропустить все, иначе - продолжить выполнение процедуры
    28. mov ecx, eax  'копируем адрес возврата
    29. Sub ecx, [esp] 'вычитаем из последнего параметр
    30. mov ebx, offset _P  'в глобальную переменную p переносим адрес для вызова метода
    31. mov dword Ptr [ebx], ecx
    32. .Thcrcontinue:
    33. jmp eax  'возвращаемся
    34. End Asm
    35. End Sub
    36.  
    37. Type obj
    38. x As Integer
    39. Declare Sub pr()
    40. End Type
    41.  
    42. Dim t As obj
    43. Asm 'напечатаем проверочное значение предыдущим способом
    44. mov eax, offset __ZN3OBJ2PREv@4
    45. push 2
    46. push eax
    47. push 0
    48. Call _fb_PrintInt@12
    49. End Asm
    50. initialbegin() 'объявляем о начале получения адресов
    51. t.pr()   'вызовем метод для получения его адреса
    52. initialend()   'объявляем о конце получения адресов
    53. Print p
    54. Sleep
    55.  
    56. Sub obj.pr()
    57. getoffset(10): If inithreadcreate Then Exit Sub  'если в глобальной переменной значение 1 (т.е. указание на получение адреса), то пропустить выполнение метода
    58. End Sub

    К сожалению, полностью автоматического алгоритма у меня не получилось: в последнем случае в параметре процедуры
    getoffset не всегда будет 10. Если у метода есть свои внутренние переменные, то значение уже будет 13. Т.к. я не знаю
    точно всех возможных ситуаций, могу предложить лишь такой метод универсального узнавания нужного параметра:
    Код
    FreeBasic Code:
    1. Asm
    2. mov eax, offset __ZN1T3PR0Ev@4  'вместо __ZN1T... написать метку метода, подсмотренную в asm-листинге
    3. mov ebx, offset .Lt_000E                                        'вместо .Lt_000E написать вторую метку метода
    4. Sub ebx, eax
    5. push 1
    6. push ebx
    7. push 0
    8. Call _fb_PrintInt@12
    9. End Asm

    Запустив такой код в программе (лучше будет, если написать этот фрагмент в начале и после него поставить sleep: end),
    мы получим число, которое следует сложить с 7 и написать как параметр. Например:
    Программа
    FreeBasic Code:
    1. Type obj
    2. x As Integer
    3. Declare Sub pr()
    4. End Type
    5.  
    6. Sub obj.pr()
    7.  
    8. End Sub

    ASM-листинг
    .intel_syntax noprefix

    #example.bas' compilation started at 17:17:12 (FreeBASIC 0.90.0)

    .section .text
    .balign 16

    .globl __ZN3OBJ2PREv@4
    __ZN3OBJ2PREv@4:многабукаф;это первая метка метода
    push ebp
    mov ebp, espмногабукафмногабу;обычно здесь еще написано несколько строк
    .Lt_0004:многабукафмногабукафм;это вторая метка метода
    многабукафмногабукафмногабукаф;здесь располагается код метода, в данном случае, метод пустой
    .Lt_0005:
    mov esp, ebp
    pop ebp
    ret 4
    .balign 16

    .globl _main
    _main:
    push ebp
    mov ebp, esp
    and esp, 0xFFFFFFF0
    sub esp, 4
    mov dword ptr [ebp-4], 0
    call ___main
    push 0
    push dword ptr [ebp+12]
    push dword ptr [ebp+8]
    call _fb_Init@12
    .Lt_0002:
    .Lt_0003:
    push 0
    call _fb_End@4
    mov eax, dword ptr [ebp-4]
    mov esp, ebp
    pop ebp
    ret
    #example.bas' compilation took 0.0001819358243322355 secs

    Исходя из этого, дописываем в программу:
    Код
    FreeBasic Code:
    1. Type obj
    2. x As Integer
    3. Declare Sub pr()
    4. End Type
    5. Asm
    6. mov eax, offset __ZN3OBJ2PREv@4
    7. mov ebx, offset .Lt_0004
    8. Sub ebx, eax
    9. push 1
    10. push ebx
    11. push 0
    12. Call _fb_PrintInt@12
    13. End Asm
    14. sleep
    15. Sub obj.pr()
    16.  
    17. End Sub

    Узнаем значение 3, складываем с 7, записываем:
    Код
    FreeBasic Code:
    1. Type obj
    2. x As Integer
    3. Declare Sub pr()
    4. End Type
    5. Dim Shared p As Any Ptr
    6. Dim Shared inithreadcreate As Integer
    7. Declare Sub initialbegin naked Cdecl()
    8. Declare Sub initialend naked Cdecl()
    9. Declare Sub getoffset naked Cdecl(x As Integer)
    10. Dim t As obj
    11. initialbegin()
    12. t.pr()
    13. initialend()
    14. Print p
    15. Sleep
    16.  
    17. Sub obj.pr()
    18. getoffset(10)
    19. End Sub
    20.  
    21. Sub initialbegin naked Cdecl()
    22. Asm
    23. pop ebx
    24. mov eax, offset _INITHREADCREATE
    25. mov dword Ptr [eax], 1
    26. jmp ebx
    27. End Asm
    28. End Sub
    29.  
    30. Sub initialend naked Cdecl()
    31. Asm
    32. pop ebx
    33. mov eax, offset _INITHREADCREATE
    34. mov dword Ptr [eax], 0
    35. jmp ebx
    36. End Asm
    37. End Sub
    38.  
    39. Sub getoffset naked Cdecl(x As Integer)
    40. Asm
    41. pop eax
    42. mov ecx, eax
    43. Sub ecx, [esp]
    44. mov ebx, offset _P
    45. mov dword Ptr [ebx], ecx
    46. jmp eax
    47. End Asm
    48. End Sub

    Из глобальной переменной p можно записать адрес куда-нибудь еще.


    Как демонстрацию всего вышеизложенного, представлю эту программу:
    Код
    FreeBasic Code:
    1. Dim Shared p As Any Ptr
    2. Dim Shared inithreadcreate As Integer
    3. Declare Sub initialbegin naked Cdecl()
    4. Declare Sub initialend naked Cdecl()
    5. Declare Sub getoffset naked Cdecl(x As Integer)
    6. Declare Sub mFor naked Cdecl(ByRef x As Integer, y As Integer, z As Integer)
    7. Declare Sub mNext naked Cdecl()
    8.  
    9. Type t
    10. x As Integer
    11. i As Integer
    12. Declare Sub pr0()
    13. Declare Sub pr1()
    14. End Type
    15.  
    16. ScreenRes 1024, 768, 32, 1, 8
    17.  
    18. Dim As Any Ptr p0, p1
    19. Dim probe0 As t
    20. Dim probe1 As t
    21. Dim probe2 As t
    22. probe0.x=255
    23. probe1.x=128
    24. probe2.x=192
    25. initialbegin()
    26. probe0.pr0()
    27. p0=p
    28. probe0.pr1()
    29. p1=p
    30. initialend()
    31. ThreadCreate(p1, @probe0)
    32. ThreadCreate(p0, @probe1)
    33. ThreadCreate(p0, @probe2)
    34. ThreadCreate(p1, @probe2)
    35. Sleep
    36.  
    37. Sub initialbegin naked Cdecl()
    38. Asm
    39. pop ebx
    40. mov eax, offset _INITHREADCREATE
    41. mov dword Ptr [eax], 1
    42. jmp ebx
    43. End Asm
    44. End Sub
    45.  
    46. Sub initialend naked Cdecl()
    47. Asm
    48. pop ebx
    49. mov eax, offset _INITHREADCREATE
    50. mov dword Ptr [eax], 0
    51. jmp ebx
    52. End Asm
    53. End Sub
    54.  
    55. Sub getoffset naked Cdecl(x As Integer) 'x=7 - lbl sub begin; x=10 - no var; x=13 - var; x>13 - ?
    56. Asm
    57. pop eax
    58. mov edx, offset _INITHREADCREATE
    59. cmp dword Ptr [edx], 1
    60. jl .Thcrcontinue
    61. mov ecx, eax
    62. Sub ecx, [esp]
    63. mov ebx, offset _P
    64. mov dword Ptr [ebx], ecx
    65. .Thcrcontinue:
    66. jmp eax
    67. End Asm
    68. End Sub
    69.  
    70. Sub mFor naked Cdecl(ByRef x As Integer, y As Integer, z As Integer)
    71. Asm
    72. 'set counter to start state
    73. mov eax, [esp+8]  'take start state from stack
    74. mov ebx, [esp+4]  'take counter's offset
    75. mov [ebx], eax
    76. '[esp]-[esp+12]-loop memory
    77.  
    78. 'skip FreeBasic's deleting proc stack
    79. Add dword Ptr [esp], 3
    80.  
    81. 'return to parent process
    82. jmp [esp] 'return to parent process
    83. End Asm
    84. End Sub
    85.  
    86. Sub mNext naked Cdecl()
    87. Asm
    88. 'get return offset
    89. pop ecx
    90.  
    91. 'increase counter
    92. mov eax, [esp+4]
    93. inc dword Ptr [eax]
    94.  
    95. 'compare counter and finish state
    96. mov ebx, [esp+12]
    97. cmp dword Ptr [eax], ebx
    98.  
    99. 'jump to loop lebel or complete
    100. jg .MFOR
    101. jmp [esp]
    102. .MFOR:
    103.  
    104. 'free loop memory from stack
    105. Add esp, 16
    106.  
    107. 'return
    108. jmp ecx
    109. End Asm
    110. End Sub
    111.  
    112. Sub t.pr0()
    113. 'pr(13): If inithreadcreate Then Exit Sub
    114. getoffset(11): If inithreadcreate Then Exit Sub
    115. 'pr(7): If inithreadcreate Then Exit Sub
    116. 'Dim i As Integer
    117. mFor (i, 1, 100)
    118. PSet(i, x), RGB(x, x, x)
    119. Sleep 10
    120. mNext()
    121. End Sub
    122.  
    123. Sub t.pr1()
    124. 'pr(13): If inithreadcreate Then Exit Sub
    125. getoffset(11): If inithreadcreate Then Exit Sub
    126. 'pr(7): If inithreadcreate Then Exit Sub
    127. 'Dim i As Integer
    128. mFor (i, 1, 100)
    129. PSet(100-i, x), RGB(x, x, x)
    130. Sleep 10
    131. mNext()
    132. End Sub

    Можно заметить, что средняя линия не получается непрерывной, причина тому - свойство i объекта probe2
    инкрементируется сразу двумя циклами в методах: pr0 и pr1. (Иногда застревает - плохо пользуюсь
    mutex-ами плохо.)
    Ответить с цитированием  
     

  2. 3 пользователя(ей) сказали cпасибо:

    Kakos_nonos (16.09.2014), stabud (05.09.2014), Абадябер (31.08.2014)

  3. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,822
    Сказал(а) спасибо
    1,808
    Поблагодарили 933 раз(а) в 795 сообщениях
    Записей в блоге
    1
    Good.Morning, жесть ты какую мутишь... Даже не знаю, что сказать по этому поводу, ООП не юзаю, ибо нет
    потребности, асм пока смотрел мельком, но во внутреннюю структуру сгенеренного кода и не полез бы...

    FreeBASIC 0.90.0
    Обновись кстати. Т.к. тебе это нужнее.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  4. #3  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    768
    Сказал(а) спасибо
    319
    Поблагодарили 339 раз(а) в 268 сообщениях
    Записей в блоге
    6
    Good.Morning молодец.
    Ответить с цитированием  
     

  5. #4  
    Заблокирован
    Регистрация
    14.10.2013
    Сообщений
    18
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Цитата Сообщение от Good.Morning Посмотреть сообщение
    Как-то раз мне в голову пришла одна идея: "Объекты и потоки, объекты и потоки... - это же идеально совмещается!".
    Не вижу прямой взаимосвязи. Объекты это одно, а потоки совсем другое. Они независимы, т. е. объекты могут обходится без потоков, а потоки без объектов.
    В чем преимущество использования методов перед процедурами/функциями?
    Судя по написанному, одни недостатки и лишний код.
    Это из разряда.
    Не мала баба клопоту — купила порося.
    Ответить с цитированием  
     

  6. #5  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    объекты могут обходится без потоков, а потоки без объектов
    Конечно, могут. Об этом я и говорил здесь:
    FreeBasic не поддерживает такую взаимосвязь во всех ее проявлениях.
    В чем преимущество использования методов перед процедурами/функциями?
    Вот небольшой код:
    Код
    FreeBasic Code:
    1. Type point_
    2. x As Integer
    3. y As Integer
    4. Declare Sub mo()
    5. End Type
    6.  
    7. Type line_
    8. p0 As point_
    9. p1 As point_
    10. Declare Constructor (x0 As Integer, y0 As Integer, x1 As Integer, y1 As Integer)
    11. Declare Sub dr()
    12. Declare Sub mo()
    13. End Type
    14.  
    15. ScreenRes 742, 100, 32, 1, 8
    16. Dim STime As Double
    17. Dim lin(1 To 30) As line_={line_( 65, 12,  14, 12), line_( 14, 12,  14, 80), line_( 14, 48,  38, 48),_
    18.    line_( 82, 43,  82, 84), line_( 82, 57, 110, 42), line_(130, 40, 160, 40),_
    19.    line_(130, 40, 130, 80), line_(130, 80, 160, 80), line_(130, 60, 145, 60),_
    20.    line_(180, 40, 180, 80), line_(180, 80, 210, 80), line_(180, 60, 195, 60),_
    21.    line_(180, 40, 210, 40), line_(300, 12, 300, 84), line_(300, 12, 336, 34),_
    22.    line_(335, 38, 300, 46), line_(300, 46, 337, 69), line_(338, 72, 300, 82),_
    23.    line_(372, 38, 385, 47), line_(383, 38, 398, 84), line_(361, 80, 390, 65),_
    24.    line_(372, 38, 361, 80), line_(442, 35, 421, 55), line_(421, 55, 442, 70),_
    25.    line_(442, 70, 420, 84), line_(471,  4, 471, 16), line_(471, 41, 471, 86),_
    26.    line_(523, 50, 491, 40), line_(491, 40, 495, 86), line_(495, 86, 523, 72)  }
    27. For k As Integer=1 to 200
    28. STime=Timer
    29. ScreenLock
    30. Cls
    31. For i As UByte=1 To 30
    32. lin(i).dr()
    33. lin(i).mo()
    34. Next
    35. ScreenUnLock
    36. Sleep 17+Timer-STime
    37. Next
    38. Sleep
    39.  
    40. Constructor line_ (x0 As Integer, y0 As Integer, x1 As Integer, y1 As Integer)
    41. p0.x=x0
    42. p0.y=y0
    43. p1.x=x1
    44. p1.y=y1
    45. End Constructor
    46.  
    47. Sub line_.dr()
    48. Line(p0.x, p0.y)-(p1.x, p1.y)
    49. End Sub
    50.  
    51. Sub point_.mo()
    52. x+=1
    53. End Sub
    54.  
    55. Sub line_.mo()
    56. p0.mo()
    57. p1.mo()
    58. End Sub

    То, что здесь выглядит так:
    FreeBasic Code:
    1. lin(i).dr()
    2. lin(i).mo()

    , в процедурах выглядело, к примеру, так:
    FreeBasic Code:
    1. dr(@lin(i))
    2. mo(@lin(i))

    лично мне это не кажется удобным.
    Если не использовать объекты, тогда все выглядит еще прозаичней: массивы координат, хитрые вызовы процедур, типа:
    FreeBasic Code:
    1. dr(a(i*4), a(i*4+1), a(i*4+2), a(i*4+3))
    2. 'или
    3. dr(a(i, 1, 1), a(i, 1, 2), a(i, 2, 1), a(i, 2, 2))

    Но, конечно, личное дело каждого - оформлять код, использовать какие-либо алгоритмы (если это программа одного
    автора), лишь бы работало.
    Ответить с цитированием  
     

  7. #6  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    Самое главное забыл сказать:
    Основная идея была использования в потоках вместо переменных процедур свойств объектов.
    Ответить с цитированием  
     

  8. #7  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,822
    Сказал(а) спасибо
    1,808
    Поблагодарили 933 раз(а) в 795 сообщениях
    Записей в блоге
    1
    Если не использовать объекты
    Good.Morning, то, что ты из ООП перечислил вообще не делает погоды. Его основная методология заключается
    в соединении кода и данных, в более целостном представлении, по аналогии с тем, как это представлено в
    реальном мире. Но это мотодология, а ради чего его юзают? Ради всяких абстракций и перегрузки классов,
    чтобы можно было не писать код самому, а тырить, тырить и ещё раз тырить, грубо обрабатывая напильником.
    И бейсик тут как бы вообще не вариант, он изначально создавался для более простого клепания линейных прог,
    т.е. ВУ логики, как и Паскаль и Фортран и другие...

    Если думаешь, что скорость разработки серьёзно возрастёт или сложность разработки, поспешу огорчить -
    не возрастёт. Оно возрастает только за счёт готовых инструментов и удобства среды разработки.
    FB как ни крути сейчас это гибрид 3GL-4GL.

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

    dr(@lin(i))
    FB позволяет структурировать через CAST. Это такая дикая имба, если изловчиться...
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  9. #8  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    Параметры вообще можно не отправлять, если они в глобалках лежат, зачем стек мутузить?
    По логике, работа со стеком быстрее, разве не так? Не зря все локальные переменные хранятся там.
    Его основная методология заключается
    в соединении кода и данных, в более целостном представлении, по аналогии с тем, как это представлено в
    реальном мире.
    Я бы сказал, его основная идеология заключается в структурировании данных и алгоритмов.
    не возрастёт
    Но у меня же возрастает. Правда, я могу что-то делать не так...
    FB как ни крути сейчас это гибрид 3GL-4GL.
    Чем же это плохо? Судя по статье [Ссылки могут видеть только зарегистрированные пользователи. ],
    3-4 поколения - лучший вариант. Вообще, чем так FreeBasic отличается от того же C# или С++, что
    бейсик тут как бы вообще не вариант
    ?
    FB позволяет структурировать через CAST.
    Структурировать? Cast, на сколько мне известно, преобразовывает типы. И как это относится к "dr(@lin(i))"?
    Ответить с цитированием  
     

  10. Пользователь сказал cпасибо:

    ur_naz (26.12.2015)

  11. #9  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,822
    Сказал(а) спасибо
    1,808
    Поблагодарили 933 раз(а) в 795 сообщениях
    Записей в блоге
    1
    По логике, работа со стеком быстрее, разве не так?
    Работа со стеком это лишние такты. Инструкции проца могут адресовать напрямую из глобалки.
    Зачем пропихивать данные через стек, когда можно напрямую утянуть?
    Да стек работает быстрее чем память, работал по крайней мере реньше(давно это было), сейчас уже фиг
    знает, процы совершенствуются, всяко может быть.

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

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

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

    FreeBasic Code:
    1. '$Lang: "FBLite"
    2. TYPE MyTp FIELD = 1
    3.   A AS INTEGER
    4.   B AS SINGLE
    5.   C AS DOUBLE
    6. END TYPE
    7.  
    8. DIM SHARED  PoiTst AS ANY POINTER
    9.  
    10. PoiTst = CAST(MyTp POINTER, ALLOCATE ( 1000 ))
    11.  
    12. *PoiTst->B = 3.5
    13.  
    14. PRINT *PoiTst->B
    15. SLEEP


    Хе хе, ну и лоссось же я... жесть какая. Ну, значит тогда нет никакой имбы... терпим...
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  12. #10  
    Разбирающийся
    Регистрация
    13.10.2013
    Сообщений
    53
    Сказал(а) спасибо
    52
    Поблагодарили 34 раз(а) в 22 сообщениях
    структурировать алгоритмы - это какое-то странное понятие
    Да, сказанул я, конечно. Имел в виду принадлежность методов к каким-либо классам.
    Алгоритм это доскональная последовательность шагов, ключевое слово
    последовательность.
    Если речь не идет о взаимодействующих потоках. Даже само понятие синхронизации
    говорит об этом.
    алгоритм даже в случае многопоточности абсолютно линеен
    Смотря что подразумевать под линейностью.
    Чё то всегда думал, что можно нагло вот так сделать
    Так вроде работает. Или имеется в виду что-то другое?
    FreeBasic Code:
    1. '$lang: "FBLite"
    2. TYPE MyTp FIELD = 1
    3.   A AS INTEGER
    4.   B AS SINGLE
    5.   C AS DOUBLE
    6. END TYPE
    7.  
    8. DIM SHARED  PoiTst AS mytp POINTER
    9.  
    10. PoiTst = New MyTp [1000]
    11.  
    12. PoiTst[0].B = 3.5
    13.  
    14. Print PoiTst[0].B
    15. Sleep
    Ответить с цитированием  
     

Страница 1 из 2 12 ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Задача на объекты, С++, visual studio
    от Аделина в разделе C/C++
    Ответов: 3
    Последнее сообщение: 25.04.2014, 11:20
  2. Задача на объекты, С++, visual studio
    от Аделина в разделе Архив
    Ответов: 3
    Последнее сообщение: 25.04.2014, 11:20
  3. QBasic. Циклы.
    от Николай Павлов в разделе QBasic
    Ответов: 6
    Последнее сообщение: 11.06.2013, 23:57
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •