Полезная функция для программирования на Си

Everything you can't fit into other forums
  • Это шутка?
  • ppk-center, это не скомпилится. Как думаешь, почему? :)
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • GerdtR wrote:ppk-center, это не скомпилится. Как думаешь, почему? :)
    Компилятора под рукой нет, но должно быть правильно:

    Code: Select all

    // тут объявить переменные
    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/
  • ppk-center wrote:
    GerdtR wrote:ppk-center, это не скомпилится. Как думаешь, почему? :)
    Компилятора под рукой нет, но должно быть правильно:

    Code: Select all

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

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • Image
    http://en.wikibooks.org/wiki/C_Programm ... _and_style
    http://en.wikibooks.org/wiki/C_Programming/Variables

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

    Даже если считать, что код написан на диалекте JavaScript или псевдокоде (что противоречит названию темы), всё равно не ясно, почему в случае истинности условия функция сразу же завершает работу.
  • Однажды, когда я учился в 7 классе средней общеобразовательной школы, у меня не было никаких компьютеров, но это не мешало мне "писать" программы проигрывающие "мелодию" на ZX-Spectrum, посредством инструкции BEEP с параметрами, на ВАСИКе. Они даже интерпретировались и запускались и даже (о, чудо!) издавали звуковой ряд, но впоследствии я узнал страшную тайну, которую родители тщательно скрывали от меня. Еще в детстве из лесу пришел северный полярный лис пиз.. песец медведь и оттоптал мне все уши... и с тех пор я не пишу программы на языке C, С++ и C--. Особенно я не пишу их без использования компилятора этих языков, которого у меня нет.
    Last edited by Mario_r4 on Tue Jun 10, 2014 10:20 am, edited 1 time in total.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Он, наверное, хотел соорудить что-то наподобие http://en.wikipedia.org/wiki/Higher-order_function
    Можно в качестве примера привести qsort и bsearch из libc.

    Code: Select all

    void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

    Code: Select all

    void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
  • Вообще что-то похожее я использовал у себя во fNav и TopPanel.

    Например, сама функция:

    Code: Select all

    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: Select all

            push   dword labels
            push   dword 4
            push   dword PrintLabel
            call   with.array.of.dwords
    А это у меня был тестовый пример целиком:
    Spoiler:

    Code: Select all

    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_:
  • Или вот ещё нашёл, но здесь немного по-другому.

    Сама функция:

    Code: Select all

    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: Select all

            push   dword labels
            push   dword (4 * 3)
            push   dword 4
            push   dword PrintLabel
            call   with.array
    Весь пример:
    Spoiler:

    Code: Select all

    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_:
  • SoUrcerer wrote: Не говоря о том, что совершенно не ясно, как передавать condition через переменную в данном конкретном случае.
    Даже если считать, что код написан на диалекте JavaScript или псевдокоде (что противоречит названию темы), всё равно не ясно, почему в случае истинности условия функция сразу же завершает работу.
    condition - не совсем условие, а переменная, которая может вернуть истину или ложь.
    Насчет ассемблера очень рад, что уже есть что-то похожее, но я пытаюсь написать на Си.
    Конечно, в идеале это следует реализовывать в виде псевдокода, но моих скудных знаний не хватает даже для функции. Именно поэтому и обратился к вам за помощью!
    The motto of the wise is: be prepared for surprised http://vlampochke.esy.es/
  • Я никак не могу понять, что делает эта функция. Судя по коду, она возвращает какой-то элемент из массива, если функция возвращает истину. Но зачем возвращать массив, если в нём только одна ячейка будет заполнена?

    Если я правильно понял, то на питоне эта функция будет выглядеть так (выведет 7):

    Code: Select all

    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))
  • eAndred, нет, не угадал. Condition не вызывается, так что это не функция, а переменная.
  • SoUrcerer wrote:eAndred, нет, не угадал. Condition не вызывается, так что это не функция, а переменная.
    Ну тогда совсем ничего не понятно. Если вызвать с true, то вернётся почти пустой массив, где первый элемент == первому элементу из исходного массива, иначе вообще ничего не вернётся.
  • Думаю, по замыслу автора там всё же должна была быть функция. А сама конструкция, как мне кажется, предназначена для копирования части массива, до тех пор, пока не будет выполнено какое-либо условие.
  • Who is online

    Users browsing this forum: No registered users and 8 guests