Board.KolibriOS.org

Official KolibriOS board
It is currently Fri Jun 05, 2020 12:38 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 24 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Mon Jun 09, 2014 8:54 pm 
Offline
User avatar

Joined: Mon Apr 22, 2013 5:24 pm
Posts: 119
Данная функция помогает сократить количество кода
Code:
function ForIf(array, count, condition) {
  for (i = 0; i < count; i++) {
    if (condition) {
      array2 = (array[i]);
      return array2;
    }
  }
}

array - исходный массив
count - количество прогона цикла
condition - условие
array2 - переработанный массив

_________________
The motto of the wise is: be prepared for surprised http://vlampochke.esy.es/


Top
   
PostPosted: Tue Jun 10, 2014 12:04 am 
Offline

Joined: Mon Jun 02, 2014 4:16 pm
Posts: 15
Это шутка?


Top
   
PostPosted: Tue Jun 10, 2014 2:56 am 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 459
ppk-center, это не скомпилится. Как думаешь, почему? :)

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
PostPosted: Tue Jun 10, 2014 8:08 am 
Offline
User avatar

Joined: Mon Apr 22, 2013 5:24 pm
Posts: 119
GerdtR wrote:
ppk-center, это не скомпилится. Как думаешь, почему? :)

Компилятора под рукой нет, но должно быть правильно:
Code:
// тут объявить переменные
function ForIf(karray, kcount, kcondition) {
  for (i = 0; i < kcount; i++) {
    if (kcondition == true) {
      karray2[i] = karray[i];
      return karray2;
    }
  }
}

_________________
The motto of the wise is: be prepared for surprised http://vlampochke.esy.es/


Top
   
PostPosted: Tue Jun 10, 2014 9:15 am 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1407
ppk-center wrote:
GerdtR wrote:
ppk-center, это не скомпилится. Как думаешь, почему? :)

Компилятора под рукой нет, но должно быть правильно:
Code:
// тут объявить переменные
function ForIf(karray, kcount, kcondition) {
  for (i = 0; i < kcount; i++) {
    if (kcondition == true) {
      karray2[i] = karray[i];
      return karray2;
    }
  }
}

у тебя лажа в каждой строчке (кроме последних трёх)

_________________
Узкий специалист подобен флюсу: полнота его - односторонняя.
Козьма Прутков


Top
   
PostPosted: Tue Jun 10, 2014 10:15 am 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Image
http://en.wikibooks.org/wiki/C_Programm ... _and_style
http://en.wikibooks.org/wiki/C_Programming/Variables

Не говоря о том, что совершенно не ясно, как передавать condition через переменную в данном конкретном случае.

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


Top
   
PostPosted: Tue Jun 10, 2014 10:18 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Однажды, когда я учился в 7 классе средней общеобразовательной школы, у меня не было никаких компьютеров, но это не мешало мне "писать" программы проигрывающие "мелодию" на ZX-Spectrum, посредством инструкции BEEP с параметрами, на ВАСИКе. Они даже интерпретировались и запускались и даже (о, чудо!) издавали звуковой ряд, но впоследствии я узнал страшную тайну, которую родители тщательно скрывали от меня. Еще в детстве из лесу пришел северный полярный лис пиз.. песец медведь и оттоптал мне все уши... и с тех пор я не пишу программы на языке C, С++ и C--. Особенно я не пишу их без использования компилятора этих языков, которого у меня нет.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Last edited by Mario_r4 on Tue Jun 10, 2014 10:20 am, edited 1 time in total.

Top
   
PostPosted: Tue Jun 10, 2014 10:20 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Он, наверное, хотел соорудить что-то наподобие http://en.wikipedia.org/wiki/Higher-order_function
Можно в качестве примера привести qsort и bsearch из libc.
Code:
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
Code:
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));


Top
   
PostPosted: Tue Jun 10, 2014 10:49 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Вообще что-то похожее я использовал у себя во fNav и TopPanel.

Например, сама функция:
Code:
align 4 
with.array.of.dwords:
%define array      [esp + 12]
%define item_count [esp + 8]
%define array_sub  [esp + 4 + 1*4]
        cmp    item_count, dword 0
        je     .done
        push   dword array
        call   array_sub
        dec    dword item_count
        add    array, dword 4
        jmp    with.array.of.dwords
align 4       
.done:       
        ret    12
%undef array
%undef item_count
%undef array_sub

Её вызов:
Code:
        push   dword labels
        push   dword 4
        push   dword PrintLabel
        call   with.array.of.dwords

А это у меня был тестовый пример целиком:
Spoiler: Show
Code:
ORG 0
BITS 32
; ---------------------------------------------------------------------------- ;
STACK_SIZE     equ 256
; ---------------------------------------------------------------------------- ;
MENUET01       db 'MENUET01'
version        dd 1
program.start  dd start_
program.end    dd end_
program.memory dd end_ + STACK_SIZE
program.stack  dd end_ + STACK_SIZE
program.params dd 0
program.path   dd 0
; ---------------------------------------------------------------------------- ;
sz_caption       db "test",0
sz_1  db "first string",0
sz_2  db "second string",0
sz_3  db "third string",0
sz_4  db "fourth string",0
; ---------------------------------------------------------------------------- ;
struc LABEL
        .x:    resd 1
        .y:    resd 1
        .text: resd 1
endstruc
; ---------------------------------------------------------------------------- ;
labels_: ; x, y, text
.1:
dd 10
dd 15
dd sz_1
.2:
dd 10
dd 25
dd sz_2
.3:
dd 10
dd 35
dd sz_3
.4:
dd 10
dd 45
dd sz_4

labels:
dd labels_.1
dd labels_.2
dd labels_.3
dd labels_.4


; ---------------------------------------------------------------------------- ;
%define array      [esp + 12]
%define item_count [esp + 8]
%define array_sub  [esp + 4 + 1*4]
with.array.of.dwords:
        cmp    item_count, dword 0
        je     .done
        push   dword array
        call   array_sub
        dec    dword item_count
        add    array, dword 4
        jmp    with.array.of.dwords
.done:       
        ret    12
%undef array
%undef item_count
%undef array_sub
; ---------------------------------------------------------------------------- ;
PrintLabel:
        mov    eax, [esp + 4]
        mov    eax, [eax]
        mov    edx, [eax + LABEL.text]
        mov    ebx, [eax + LABEL.x]
        shl    ebx, 16
        or     ebx, [eax + LABEL.y]       
        mov    eax, 4
        mov    ecx, 0xC0000000
        mov    edi, 0x00CCDDEE
        int    64
        ret    4
; ---------------------------------------------------------------------------- ;
start_:
; set.event:
        mov    eax, 40
        mov    ebx, 5 ; redraw + button
        int    64
on_redraw:
; redraw.start
        mov    eax, 12
        mov    ebx, 1
        int    64
; draw.window
        xor    eax, eax
        mov    ebx, 200
        mov    ecx, 100
        mov    edx, 0x34CCDDEE
        mov    edi, sz_caption
        int    64
; ----------------------------------
        push   dword labels
        push   dword 4
        push   dword PrintLabel
        call   with.array.of.dwords
; ----------------------------------
; redraw.finish
        mov    eax, 12
        mov    ebx, 2
        int    64
; wait.event
        mov    eax, 10
        int    64
        dec    eax
        jz     on_redraw
; program.terminate:
        or     eax, -1
        int    64
; ---------------------------------------------------------------------------- ;
end_:


Top
   
PostPosted: Tue Jun 10, 2014 11:04 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Или вот ещё нашёл, но здесь немного по-другому.

Сама функция:
Code:
align 4
with.array:
%define array      [esp + 16]
%define item_size  [esp + 12]
%define item_count [esp + 8]
%define array_sub  [esp + 4 + 1*4]
        cmp    item_count, dword 0
        je     .done
        push   dword array
        call   array_sub       
        mov    eax, item_size
        dec    dword item_count
        add    array, eax
        jmp    with.array
align 4
.done:       
        ret    16
%undef array
%undef item_size
%undef item_count
%undef array_sub
Её вызов:
Code:
        push   dword labels
        push   dword (4 * 3)
        push   dword 4
        push   dword PrintLabel
        call   with.array
Весь пример:
Spoiler: Show
Code:
ORG 0
BITS 32
; ---------------------------------------------------------------------------- ;
STACK_SIZE     equ 256
; ---------------------------------------------------------------------------- ;
MENUET01       db 'MENUET01'
version        dd 1
program.start  dd start_
program.end    dd end_
program.memory dd end_ + STACK_SIZE
program.stack  dd end_ + STACK_SIZE
program.params dd 0
program.path   dd 0
; ---------------------------------------------------------------------------- ;
sz_caption       db "test",0
sz_1  db "first string",0
sz_2  db "second string",0
sz_3  db "third string",0
sz_4  db "fourth string",0
; ---------------------------------------------------------------------------- ;
struc LABEL
        .x:    resd 1
        .y:    resd 1
        .text: resd 1
endstruc
; ---------------------------------------------------------------------------- ;
labels: ; x, y, text
dd 10
dd 15
dd sz_1
dd 10
dd 25
dd sz_2
dd 10
dd 35
dd sz_3
dd 10
dd 45
dd sz_4
; ---------------------------------------------------------------------------- ;
%define array      [esp + 16]
%define item_size  [esp + 12]
%define item_count [esp + 8]
%define array_sub  [esp + 4 + 1*4]
with.array:
        cmp    item_count, dword 0
        je     .done
        push   dword array
        call   array_sub       
        mov    eax, item_size
        dec    dword item_count
        add    array, eax
        jmp    with.array
.done:       
        ret    16
%undef array
%undef item_size
%undef item_count
%undef array_sub
; ---------------------------------------------------------------------------- ;
PrintLabel:
        mov    eax, [esp + 4]
        mov    edx, [eax + LABEL.text]
        mov    ebx, [eax + LABEL.x]
        shl    ebx, 16
        or     ebx, [eax + LABEL.y]       
        mov    eax, 4
        mov    ecx, 0xC0000000
        mov    edi, 0x00CCDDEE
        int    64
        ret    4
; ---------------------------------------------------------------------------- ;
start_:
; set.event:
        mov    eax, 40
        mov    ebx, 5 ; redraw + button
        int    64
on_redraw:
; redraw.start
        mov    eax, 12
        mov    ebx, 1
        int    64
; draw.window
        xor    eax, eax
        mov    ebx, 200
        mov    ecx, 100
        mov    edx, 0x34CCDDEE
        mov    edi, sz_caption
        int    64
; ----------------------------------
        push   dword labels
        push   dword (4 * 3)
        push   dword 4
        push   dword PrintLabel
        call   with.array
; ----------------------------------
; redraw.finish
        mov    eax, 12
        mov    ebx, 2
        int    64
; wait.event
        mov    eax, 10
        int    64
        dec    eax
        jz     on_redraw
; program.terminate:
        or     eax, -1
        int    64
; ---------------------------------------------------------------------------- ;
end_:


Top
   
PostPosted: Tue Jun 10, 2014 1:48 pm 
Offline
User avatar

Joined: Mon Apr 22, 2013 5:24 pm
Posts: 119
SoUrcerer wrote:
Не говоря о том, что совершенно не ясно, как передавать condition через переменную в данном конкретном случае.
Даже если считать, что код написан на диалекте JavaScript или псевдокоде (что противоречит названию темы), всё равно не ясно, почему в случае истинности условия функция сразу же завершает работу.

condition - не совсем условие, а переменная, которая может вернуть истину или ложь.
Насчет ассемблера очень рад, что уже есть что-то похожее, но я пытаюсь написать на Си.
Конечно, в идеале это следует реализовывать в виде псевдокода, но моих скудных знаний не хватает даже для функции. Именно поэтому и обратился к вам за помощью!

_________________
The motto of the wise is: be prepared for surprised http://vlampochke.esy.es/


Top
   
PostPosted: Tue Jun 10, 2014 3:40 pm 
Offline
User avatar

Joined: Sat Oct 05, 2013 9:32 pm
Posts: 386
Я никак не могу понять, что делает эта функция. Судя по коду, она возвращает какой-то элемент из массива, если функция возвращает истину. Но зачем возвращать массив, если в нём только одна ячейка будет заполнена?

Если я правильно понял, то на питоне эта функция будет выглядеть так (выведет 7):
Code:
def for_if(arr, cond):
   for x in arr:
      if cond(x):
         return x
         
def my_condition(x):
   if x * x == 49:
      return True
   return False
         
my_array = {3, 4, 5, 6, 7, 8, 9}
print(for_if(my_array, my_condition))


Top
   
PostPosted: Tue Jun 10, 2014 3:52 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
eAndred, нет, не угадал. Condition не вызывается, так что это не функция, а переменная.


Top
   
PostPosted: Tue Jun 10, 2014 3:58 pm 
Offline
User avatar

Joined: Sat Oct 05, 2013 9:32 pm
Posts: 386
SoUrcerer wrote:
eAndred, нет, не угадал. Condition не вызывается, так что это не функция, а переменная.

Ну тогда совсем ничего не понятно. Если вызвать с true, то вернётся почти пустой массив, где первый элемент == первому элементу из исходного массива, иначе вообще ничего не вернётся.


Top
   
PostPosted: Tue Jun 10, 2014 5:56 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Думаю, по замыслу автора там всё же должна была быть функция. А сама конструкция, как мне кажется, предназначена для копирования части массива, до тех пор, пока не будет выполнено какое-либо условие.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 24 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited