網站開發(fā)工程師培訓seo是什么職業(yè)
這是群友分享的方法,這里只是作為記錄和分享。
有了這個功能,可以很方便的拷貝一下C或者C++代碼直接用到FB上。
既然是混合C語言編譯,當然得有C的代碼。比如隨便去網上找兩個排序:冒泡排序和選擇排序,代碼如下:
1、冒泡排序:(存儲為BubbleSort.c)
void BubbleSort(int arr[],int size)
{int j,i,tem;for (i = 0; i < size-1;i ++)//size-1是因為不用與自己比較,所以比的數(shù)就少一個{int count = 0;for (j = 0; j < size-1 - i; j++) //size-1-i是因為每一趟就會少一個數(shù)比較{if (arr[j] > arr[j+1])//這是升序排法,前一個數(shù)和后一個數(shù)比較,如果前數(shù)大則與后一個數(shù)換位置{tem = arr[j];arr[j] = arr[j+1];arr[j+1] = tem;count = 1;}}if (count == 0) //如果某一趟沒有交換位置,則說明已經排好序,直接退出循環(huán)break; }
}
2、選擇排序:(存儲為SelectSort.c)
void SelectSort(int arr[],int size)
{int i = 0;for (i = 0; i < size-1; i++){int min = i;int j = 0;for (j = i+1; j < size; j++){if (arr[j] < arr[min]){min = j;}}//交換兩個數(shù)if(i != min){int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}
}
3、包含全局變量和頭文件引用的C程序(存儲為Testfunc.c)
#include <stdio.h>int GlobalVar = 666666; //全局變量
int PrintVar = 0;void Testfunc(void) //測試函數(shù)
{printf("the global variable is:%d",PrintVar); //調用printf函數(shù)
}
然后就是設置編譯方式和聲明函數(shù)了。
1、需要設置GCC編譯器,如果使用GAS編譯是不行的。(32位的FB默認使用GAS編譯)
如果是使用VFB來編譯程序,則需要在內核模塊的程序起始塊里來設置,這里設置的代碼會放到所有代碼的最前部,這是我們需要的。用#cmdline來聲明命令(主要是比較方便,也可以在IDE里的工程屬性里的附加編譯選項里設置。)-gen gcc就是指定編譯器為GCC編譯。
#cmdline "-gen gcc" '設置編譯器為GCC編譯
2、需要包含前面的C代碼文件。需要用-Wc命令來將我們需要的命令傳遞給GCC編譯器,命令間用逗號“,”分隔。用-include 指定你需要包含的C文件,后面是文件名(我是放在編譯路徑下,VFB的release文件下),這里有BubbleSort.c和SelectSort.c。
#cmdline "-Wc -include,BubbleSort.c" '包含BubbleSort.c文件給GCC編譯
#cmdline "-Wc -include,SelectSort.c" '包含SelectSort.c文件給GCC編譯
3、如果C文件里有使用頭文件(或者其他引用的文件),則需要聲明頭文件的路徑,否則會編譯失敗。我直接拷貝了DevC++目錄下的頭文件(文件名include)到release里,這樣方便尋找。聲明如下:
#cmdline "-Wc -include,Testfunc.c,-I..\release\include" '指定頭文件搜索目錄
4、FB里對C全局變量聲明方式:
全局變量需要用【Extern 變量名 Alias "C里的變量名" as 數(shù)據(jù)類型】來聲明,變量名可以與C的變量名不一樣,也可以一樣。例如:C里的GlobalVar改成gvar完全沒問題。
Extern gvar Alias "GlobalVar" As Long
Extern PrintVar Alias "PrintVar" As Long
5、FB里的C函數(shù)的聲明:
5.1、使用Extern "C" ... End Extern塊來聲明函數(shù),同時在其中使用Declare關鍵字來聲明函數(shù)。
5.2、一般來說,C里的返回值是void的,FB里使用sub,不是void的,使用function。
5.3、C里的數(shù)組在FB里需要聲明指針,不能使用FB的數(shù)組直接聲明(FB的數(shù)組是一個類型結構,與C的數(shù)組有區(qū)別。)
5.4、如果不需要修改函數(shù)名,可以直接對應C函數(shù)轉換。如果需要修改函數(shù)名,則需要用Alias來聲明(規(guī)則與全局變量一樣)。代碼如下:
Extern "C"
'//冒泡排序
'//C定義 void BubbleSort(int arr[],int size)
Declare Sub BubbleSort(arr As Long Ptr,ByVal nsize As Long) 'c的數(shù)組得用指針,不能用FB的數(shù)組直接傳過去
'//選擇排序
'//C定義 void SelectSort(int arr[],int size)
Declare Sub SelectSort(arr As Long Ptr, ByVal nsize As Long) 'c的數(shù)組得用指針,不能用FB的數(shù)組直接傳過去
'--------------------------------------------------------------------
'C定義 void Testfunc(void)
Declare Sub PrintGlobalVar Alias "Testfunc"() 'C里的函數(shù)名為Testfunc,如果有需要(比如有沖突)換一個名字,可以用AliasEnd Extern
使用時與FB函數(shù)和變量一樣,具體例子如下: