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
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
Думаю, по замыслу автора там всё же должна была быть функция. А сама конструкция, как мне кажется, предназначена для копирования части массива, до тех пор, пока не будет выполнено какое-либо условие.