Skip to content

Commit b38c48b

Browse files
committed
fixed array concate issue
1 parent a671f36 commit b38c48b

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

FFI/ffi_examples

8.87 KB
Binary file not shown.

FFI/ffi_examples.hs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ foreign import ccall "intToString" c_intToString :: CInt -> CString
2121
foreign import ccall "bubbleSort" c_bubbleSort :: Ptr CInt -> CInt -> IO()
2222
foreign import ccall "toUpper" c_toUpper :: CString -> IO()
2323
foreign import ccall "addTwoArrays" c_addTwoArrays:: Ptr CInt -> CInt -> Ptr CInt -> Int -> IO (Ptr CInt)
24+
foreign import ccall "addThreeArrays" c_addThreeArrays:: Ptr CInt -> CInt -> Ptr CInt -> Int -> Ptr CInt -> Int -> IO (Ptr CInt)
2425

2526
swapTwoNums :: Int -> Int -> (Int,Int)
2627
swapTwoNums x y = unsafePerformIO $ do
@@ -53,13 +54,31 @@ toUpper str = do
5354
withCString str $ \str2 -> do
5455
c_toUpper str2
5556

57+
addThreeArrays :: [Int32] -> [Int32] -> [Int32] -> [Int32]
58+
addThreeArrays xs ys zs = unsafePerformIO $ do
59+
let len1 = length xs
60+
let len2 = length ys
61+
let len3 = length zs
62+
allocaBytes (len1*4) $ \ptr1 -> do
63+
pokeArray ptr1 xs
64+
allocaBytes (len2*4) $ \ptr2 -> do
65+
pokeArray ptr2 ys
66+
allocaBytes (len3*4) $ \ptr3 -> do
67+
pokeArray ptr3 zs
68+
arrPtr <- c_addThreeArrays (castPtr ptr1) (fromIntegral len1) (castPtr ptr2) (fromIntegral len2) (castPtr ptr3) (fromIntegral len3)
69+
foreignPtr <- newForeignPtr p_free arrPtr
70+
array <- withForeignPtr foreignPtr $ \ptr -> peekArray (len1+len2+len3) (castPtr ptr)
71+
return array
72+
5673
addTwoArrays :: [Int32] -> [Int32] -> [Int32]
5774
addTwoArrays xs ys = unsafePerformIO $ do
5875
let len1 = length xs
5976
let len2 = length ys
60-
alloca $ \ptr1 -> do
77+
allocaBytes (len1*4) $ \ptr1 -> do
6178
pokeArray ptr1 xs
62-
alloca $ \ptr2 -> do
79+
print $ unsafePerformIO $ peek (plusPtr ptr1 8 :: Ptr Int32)
80+
print $ unsafePerformIO $ peek ptr1
81+
allocaBytes (len2*4) $ \ptr2 -> do
6382
pokeArray ptr2 ys
6483
arrPtr <- c_addTwoArrays (castPtr ptr1) (fromIntegral len1) (castPtr ptr2) (fromIntegral len2)
6584
foreignPtr <- newForeignPtr p_free arrPtr
@@ -88,4 +107,5 @@ main = do
88107
-- toUpper
89108
toUpper "tushar"
90109
-- merge array
91-
print $ addTwoArrays [4,5,6,45,76,57] [2,3,3]
110+
print $ addTwoArrays [1,2,3] [4,5,6]
111+
print $ addThreeArrays [1,2,3] [4,5,6] [7,8,9]

FFI/ffi_examples_c.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,32 @@ char* intToString(int x){
3636
return num;
3737
}
3838

39-
40-
int* addTwoArrays(int* arr1,int n1,int* arr2,int n2){
41-
int num = n1+n2;
39+
int* addThreeArrays(int* arr1,int n1,int* arr2,int n2,int* arr3,int n3){
40+
int num = n1+n2+n3;
4241
int* arr = malloc(num*sizeof(int*));
4342
int k =0;
44-
43+
for(int i = 0;i < n1;i++){
44+
arr[k++] = arr1[i];
45+
}
4546
for(int i = 0;i < n2;i++){
4647
arr[k++] = arr2[i];
4748
}
49+
for(int i = 0;i < n3;i++){
50+
arr[k++] = arr3[i];
51+
}
52+
return arr;
53+
}
54+
55+
int* addTwoArrays(int* arr1,int n1,int* arr2,int n2){
56+
int num = n1+n2;
57+
int* arr = malloc(num*sizeof(int*));
58+
int k =0;
4859
for(int i = 0;i < n1;i++){
4960
arr[k++] = arr1[i];
5061
}
62+
for(int i = 0;i < n2;i++){
63+
arr[k++] = arr2[i];
64+
}
5165
return arr;
5266
}
5367

0 commit comments

Comments
 (0)