2009-04-16 47 views

回答

1

jjujuma,

對於您可以使用它來實現像畫一些面向對象的風格程序一個簡單的例子。通過將Circle_Draw或Square_Draw的適當%PADDR分配給Draw過程指針,您可以爲Square的Circle或Square_Draw過程調用Circle_Draw過程。當調用Draw程序指針時,你隱藏你正在調用的程序(Circle_Draw或Square_Draw)。

0

例如,CEEHDLR/CEEHDLU(un)爲當前堆棧(入口)幀註冊用戶編寫的條件處理程序。

+0

那麼這個例子在哪裏? – Neolisk 2012-12-01 22:51:26

1

對於一個實際的例子,這可以在實現回調時使用。常見的回調函數可以在C的qsort()函數中找到。是的,您可以從ILERPG中調用它。

C規範的qsort()是:

#include <stdlib.h> 
void qsort(void *base, size_t num, size_t width, 
      int(*compare)(const void *key, const void *element)); 

RPGLE原型看起來像:

dcl-pr qsort  ExtName('qsort'); 
    array   Pointer value; 
    num    Uns(10) value; 
    width   Uns(10) value; 
    compare   Pointer(*proc) value; 
end-pr; 

下面是一個使用快速排序(一個簡單的程序):

ctl-opt DftActGrp(*No) Actgrp(*New); 

    dcl-pr qsort  ExtProc('qsort'); 
    array   Pointer value; 
    num   Uns(10) value; 
    width   Uns(10) value; 
    compare  Pointer(*Proc) value; 
    end-pr; 

    dcl-s strings Varchar(10) Dim(20); 

    strings(1) = 'Does'; 
    strings(2) = 'this'; 
    strings(3) = 'array'; 
    strings(4) = 'sort'; 
    strings(5) = 'properly?'; 

    qsort(%addr(strings): 5: %size(strings): %paddr(compareStrings)); 

    dsply strings(1); 
    dsply strings(2); 
    dsply strings(3); 
    dsply strings(4); 
    dsply strings(5); 

    return; 

    dcl-proc compareStrings; 
    dcl-pi *n Int(10); 
     key  Like(strings); 
     element Like(strings); 
    end-pi; 

    dcl-s result Int(10); 

    if key < element; 
     result = -1; 
    elseif key = element; 
     result = 0; 
    else; 
     result = 1; 
    endif; 

    return result; 
    end-proc; 

如果你運行它,輸出將是:

DSPLY array  
DSPLY properly? 
DSPLY sort  
DSPLY this  
DSPLY Does