Page 1 of 2

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

Posted: Mon Jun 09, 2014 8:54 pm
by ppk-center
Данная функция помогает сократить количество кода

Code: Select all

function ForIf(array, count, condition) {
  for (i = 0; i < count; i++) {
    if (condition) {
      array2 = (array[i]);
      return array2;
    }
  }
}
array - исходный массив
count - количество прогона цикла
condition - условие
array2 - переработанный массив

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

Posted: Tue Jun 10, 2014 12:04 am
by R0bur
Это шутка?

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

Posted: Tue Jun 10, 2014 2:56 am
by GerdtR
ppk-center, это не скомпилится. Как думаешь, почему? :)

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

Posted: Tue Jun 10, 2014 8:08 am
by 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;
    }
  }
}

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

Posted: Tue Jun 10, 2014 9:15 am
by art_zh
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;
    }
  }
}
у тебя лажа в каждой строчке (кроме последних трёх)

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

Posted: Tue Jun 10, 2014 10:15 am
by SoUrcerer
Image
http://en.wikibooks.org/wiki/C_Programm ... _and_style
http://en.wikibooks.org/wiki/C_Programming/Variables

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

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

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

Posted: Tue Jun 10, 2014 10:18 am
by Mario_r4
Однажды, когда я учился в 7 классе средней общеобразовательной школы, у меня не было никаких компьютеров, но это не мешало мне "писать" программы проигрывающие "мелодию" на ZX-Spectrum, посредством инструкции BEEP с параметрами, на ВАСИКе. Они даже интерпретировались и запускались и даже (о, чудо!) издавали звуковой ряд, но впоследствии я узнал страшную тайну, которую родители тщательно скрывали от меня. Еще в детстве из лесу пришел северный полярный лис пиз.. песец медведь и оттоптал мне все уши... и с тех пор я не пишу программы на языке C, С++ и C--. Особенно я не пишу их без использования компилятора этих языков, которого у меня нет.

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

Posted: Tue Jun 10, 2014 10:20 am
by 0CodErr
Он, наверное, хотел соорудить что-то наподобие 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 *));

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

Posted: Tue Jun 10, 2014 10:49 am
by 0CodErr
Вообще что-то похожее я использовал у себя во 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_:

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

Posted: Tue Jun 10, 2014 11:04 am
by 0CodErr
Или вот ещё нашёл, но здесь немного по-другому.

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

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_:

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

Posted: Tue Jun 10, 2014 1:48 pm
by ppk-center
SoUrcerer wrote: Не говоря о том, что совершенно не ясно, как передавать condition через переменную в данном конкретном случае.
Даже если считать, что код написан на диалекте JavaScript или псевдокоде (что противоречит названию темы), всё равно не ясно, почему в случае истинности условия функция сразу же завершает работу.
condition - не совсем условие, а переменная, которая может вернуть истину или ложь.
Насчет ассемблера очень рад, что уже есть что-то похожее, но я пытаюсь написать на Си.
Конечно, в идеале это следует реализовывать в виде псевдокода, но моих скудных знаний не хватает даже для функции. Именно поэтому и обратился к вам за помощью!

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

Posted: Tue Jun 10, 2014 3:40 pm
by e-andrew
Я никак не могу понять, что делает эта функция. Судя по коду, она возвращает какой-то элемент из массива, если функция возвращает истину. Но зачем возвращать массив, если в нём только одна ячейка будет заполнена?

Если я правильно понял, то на питоне эта функция будет выглядеть так (выведет 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))

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

Posted: Tue Jun 10, 2014 3:52 pm
by SoUrcerer
eAndred, нет, не угадал. Condition не вызывается, так что это не функция, а переменная.

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

Posted: Tue Jun 10, 2014 3:58 pm
by e-andrew
SoUrcerer wrote:eAndred, нет, не угадал. Condition не вызывается, так что это не функция, а переменная.
Ну тогда совсем ничего не понятно. Если вызвать с true, то вернётся почти пустой массив, где первый элемент == первому элементу из исходного массива, иначе вообще ничего не вернётся.

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

Posted: Tue Jun 10, 2014 5:56 pm
by SoUrcerer
Думаю, по замыслу автора там всё же должна была быть функция. А сама конструкция, как мне кажется, предназначена для копирования части массива, до тех пор, пока не будет выполнено какое-либо условие.