Change the line hpSwap @[EMAIL PROTECTED]
to hpSwap
@[EMAIL PROTECTED]
(i*4),@[EMAIL PROTECTED]
(m*4). It looks like that Powerbasic does not
understand how to do pointer arithmetic in the way C does it.
And change the lines in hpSwap to:
k = @[EMAIL PROTECTED]
@[EMAIL PROTECTED]
= @[EMAIL PROTECTED]
@[EMAIL PROTECTED]
= k
--
Olaf B
"Anonymous" <r1a@[EMAIL PROTECTED]
> skrev i melding
news:gYfUi.1519$Qr.763@[EMAIL PROTECTED]
> Hello,
>
> I'm trying to convert some piece of C code to PB, but have some trouble
to
> convert C memory manipulation code to its equivalent in PB, which
results
> is incorrect output; from the PB code.See below.
>
> Hopefully someone could have some advice to share.
> Thanks in advance!
> --
>
> #COMPILER PBCC 4.04
> #COMPILE EXE
> #DIM ALL
>
'------------------------------------------------------------------------------------------
> TYPE HeapType
> length AS LONG
> node AS DWORD PTR
> END TYPE
>
'------------------------------------------------------------------------------------------
> FUNCTION fLeft(BYVAL i AS LONG)AS LONG
> ****FT LEFT i,1
> i = i + 1
> fLeft = i
> END FUNCTION
>
'------------------------------------------------------------------------------------------
> SUB hpSwap(BYVAL i AS DWORD PTR,BYVAL j AS DWORD PTR)
> LOCAL k AS DWORD
> k = j
> k= j
> j = i
> i = k
> END SUB
>
'------------------------------------------------------------------------------------------
> SUB Fix_Heap(BYVAL hp AS HeapType PTR,BYVAL i AS LONG)
> REGISTER m AS LONG,h AS LONG
> m = fLeft(i)
> IF m < @[EMAIL PROTECTED]
THEN
> h = m + 1
> IF h < @[EMAIL PROTECTED]
AND @[EMAIL PROTECTED]
> @[EMAIL PROTECTED]
THEN m = h
> IF @[EMAIL PROTECTED]
> @[EMAIL PROTECTED]
> hpSwap @[EMAIL PROTECTED]
> Fix_Heap hp,m
> END IF
> END IF
> END SUB
>
'--------------------------------------------------------------------------------------------
> SUB Fix_Heap_Test()
> DIM hp AS LOCAL HeapType
> LOCAL i AS LONG
> DIM ary(9) AS LOCAL LONG
> ARRAY ASSIGN ary() = 9,2,10,12,7,5,8,1,3,5
> hp.node = VARPTR(ary(1))
> hp.length = UBOUND(ary)-1
> Fix_heap VARPTR(hp),0
> FOR i = 0 TO hp.length
> ? hp.@[EMAIL PROTECTED]
'Output :2,10,12,7,5,8,1,3,5
> NEXT 'Should be:12,10,8, 7,5,2,1,3,5 as in the C code.
> END SUB
>
'------------------------------------------------------------------------------------------
> FUNCTION PBMAIN () AS LONG
>
> Fix_Heap_Test()
> WAITKEY$
>
> END FUNCTION
> '---------------------------END OF PB
> CODE---------------------------------------
>
> //---------------------------START OF C
> CODE---------------------------------------
> #include <string.h>
> #include <memory.h>
> #pragma hdrstop
>
//------------------------------------------------------------------------------------
> typedef struct {
> int len;
> int node[];
> }heap;
>
//----------------------------------------------------------------------------------------int
> fLeft(int i){return (i << 1) + 1;}
>
//----------------------------------------------------------------------------------------
> void Swap(int *i, int *j) { int k = *j; *j = *i; *i =
>
k;}//----------------------------------------------------------------------------------------
> void Fix_heap(heap *hp, int i) { int m = fLeft(i); if (m <
> hp->len){ int h = m + 1; if (h < hp->len && hp->node[h] >
> hp->node[m]) m = h; if (hp->node[m] > hp->node[i]) {
> Swap(hp->node+i, hp->node+m); Fix_heap(hp, m); } } }
>
//---------------------------------------------------------------------------------------
> int main(int argc, char *argv[]) { int i; int ary[]={9, 2, 10, 12,
> 7, 5, 8, 1, 3, 5}; heap *hp = (heap *) malloc(sizeof(int)*10); //9
> elem. + len memcpy(hp, ary, sizeof(ary)); Fix_heap(hp, 0); for
> (i=0; i<hp->len; i++) printf(" %i", hp->node[i]); getch(); return
> ;
}//---------------------------------------------------------------------------
>


|