FB混合C语言编译

这是群友分享的方法,这里只是作为记录和分享。

有了这个功能,可以很方便的拷贝一下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是因为不用与自己比较,所以比的数就少一个{int count = 0;for (j = 0; j < size-1 - i; j++)	//size-1-i是因为每一趟就会少一个数比较{if (arr[j] > arr[j+1])//这是升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置{tem = arr[j];arr[j] = arr[j+1];arr[j+1] = tem;count = 1;}}if (count == 0)			//如果某一趟没有交换位置,则说明已经排好序,直接退出循环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;}}//交换两个数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)			//测试函数
{printf("the global variable is:%d",PrintVar);	//调用printf函数
}

然后就是设置编译方式和声明函数了。

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 数据类型】来声明,变量名可以与C的变量名不一样,也可以一样。例如:C里的GlobalVar改成gvar完全没问题。

Extern gvar Alias "GlobalVar" As Long
Extern PrintVar Alias "PrintVar" As Long

5、FB里的C函数的声明:

5.1、使用Extern "C" ... End Extern块来声明函数,同时在其中使用Declare关键字来声明函数。

5.2、一般来说,C里的返回值是void的,FB里使用sub,不是void的,使用function。

5.3、C里的数组在FB里需要声明指针,不能使用FB的数组直接声明(FB的数组是一个类型结构,与C的数组有区别。)

5.4、如果不需要修改函数名,可以直接对应C函数转换。如果需要修改函数名,则需要用Alias来声明(规则与全局变量一样)。代码如下:

Extern "C"
'//冒泡排序
'//C定义 void BubbleSort(int arr[],int size)
Declare Sub BubbleSort(arr As Long Ptr,ByVal nsize As Long)  'c的数组得用指针,不能用FB的数组直接传过去
'//选择排序
'//C定义 void SelectSort(int arr[],int size)
Declare Sub SelectSort(arr As Long Ptr, ByVal nsize As Long) 'c的数组得用指针,不能用FB的数组直接传过去
'--------------------------------------------------------------------
'C定义 void Testfunc(void)
Declare Sub PrintGlobalVar Alias "Testfunc"()                'C里的函数名为Testfunc,如果有需要(比如有冲突)换一个名字,可以用AliasEnd Extern

使用时与FB函数和变量一样,具体例子如下:

FB与C混合编译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java SSM springboot+VUE+redis实现的前后端分类版网上商城项目

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末获取源码联系&#x1f345; 临近学期结束&#xff…

@value 注入静态属性_TP6依赖注入是如何实现的

TP6依赖注入是如何实现的先看下app/provider容器文件&#xff0c;此文件会在thinkAPP实例化的时候直接从新绑定类到的容器上。复制原有容器中的类可以先看下thinkAPP 构造方法中的处理逻辑/** * 架构方法 * access public * param string $rootPath 应用根目录 */ public f…

信捷触摸屏c语言脚本_信捷触摸屏TG系列产品型号说明及功能介绍

产品介绍全新外观设计&#xff0c;比普通款更薄1677万色&#xff0c;画质细腻无痕&#xff0c;显示效果媲美液晶显示器下载、启动、运行&#xff0c;三位一体的超高速响应支持C语言脚本功能&#xff0c;运算、自由协议编写、绘图&#xff0c;提高编程自由度支持BMP、JPEG格式图…

mysql搜索引擎_常见的 mysql 搜索引擎

简单来说&#xff0c;存储引擎就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特点&#xff0c;Oracle中没有专门的存储引擎的概念&#xff0c;Oracle有OLTP和OLAP模式的区分。不同的存储引擎决定了MySQL数据库中的表可以用不同的方式来存储。我们可以根据…

基于java SSM springboot+redis网上水果超市商城设计和实现以及文档

作者主页&#xff1a;Java李杨勇 简介&#xff1a;Java领域优质创作者、【Java李杨勇】公号作者 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 文末获取源码 主要技术实现&#xff1a;spring、 springmvc、 redis、 springboot、 mybatis 、sessio…

mysql 组合索引 or_mysql索引优化实例(单列索引与组合索引)

索引一般用于在数据规模大时对查询进行优化的一种机制&#xff0c;对于一般的查询来说&#xff0c;mysql会去遍历整个表&#xff0c;来查询符合要求的结果&#xff1b;如果借助于mysql索引&#xff0c;mysql会将要索引的字段按照一定的算法进行处理&#xff0c;并生成一个类似于…

基于java SSM springboot景区行李寄存管理系统设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

Spring、SpringMVC和SpringBoot之间的关系

1、Spring Spring是一个开源容器框架&#xff0c;它接管了Web层、业务层、DAO层、持久性层的组件&#xff0c;并可以配置各种bean并维护bean到bean的关系。 其核心是控制反转(IOC)和面向方面(AOP)&#xff0c;这只是一个分层的轻量级开源框架。 2、SpringMVC Spring MVC属于Spr…

mysql 5.7.13 mac_Mac 安装mysql 5.7.13版本 登录及改密码

小白用户&#xff0c;首次安装5.7.13&#xff0c;刚开始有些蒙&#xff0c;改密码就就是个坑&#xff0c;好在还是解决了&#xff0c;记录一下心路历程&#xff1a;安装的过程很简单&#xff0c;就直接到官方下mysql dmg&#xff0c;一路下一步就可以装完..Ps:安装完毕之前会有…

java springboot经典面试题分享

1. SpringBoot 简介 SpringBoot 是简化 Spring 应用开发的一个框架。他整合了 Spring 的技术栈&#xff0c;提供各种标准化的默认配置。使得我们可以快速开发 Spring 项目&#xff0c;免掉 xml 配置的麻烦。降低 Spring 项目的成本。 2. SpringBoot 的优缺点 使编码配置部署都变…

mysql创建临时表 分页_Mysql 如何创建一张临时表

mysql 利用 temporary 关键字就可以创建出一个临时表。创建的这张表会在与服务器的会话终止时自动消失语法&#xff1a;create temporary table tbl_name...;规则&#xff1a;每个会话只能看到自己创建的临时表&#xff0c;不同的会话可以创建相同表名称的临时表。临时表的表名…

SpringCloud面试题分享

1、什么是Spring Cloud&#xff1f; Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成&#xff0c;更专注于服务治理。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数…

基于java SSM springboot动物检疫信息管理系统设计和实现

作者主页&#xff1a;Java李杨勇 简介&#xff1a;Java领域优质创作者、【Java李杨勇】公号作者 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 文末获取源码 主要技术实现&#xff1a;spring、 springmvc、 springboot、 springboot security权限控…

mysql for update场景_一个mysql死锁场景实例分析

前言最近遇到一个mysql在RR级别下的死锁问题&#xff0c;感觉有点意思&#xff0c;研究了一下&#xff0c;做个记录。涉及知识点&#xff1a;共享锁、排他锁、意向锁、间隙锁、插入意向锁、锁等待队列场景隔离级别&#xff1a;Repeatable-Read表结构如下create table t (id int…

mysql timestamp排序_对多个表进行排序MYSQL TimeStamp

编辑&#xff1a; H3>我已经尝试加入表格&#xff0c;在php中使用strtotime对它们进行排序..但我似乎无法获得语法。玩这个代码..但它变得非常复杂&#xff0c;我希望我可以在纯SQL中更容易。它不完整&#xff0c;但是..你可以看到我在想什么。mysql_connect("localhos…

基于java ssm springboot女士电商平台系统源码+文档设计

作者主页&#xff1a;Java李杨勇 简介&#xff1a;Java领域优质创作者、【Java李杨勇】公号作者 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 文末获取源码 主要技术&#xff1a;spring, springmvc, springboot,mybatis, jquery , md5 ,bootstarp.…

mysql创建表定义主键_mysql 创建表并设置主键自增

mysql 创建表并设置主键自增 mysql 创建表: mysql> create table user( -> userid int(4) primary key not null auto_increment, -> username varchar(16) not null, -> userpassword varchar(32) not null -> ); create table log( logid int(4) primary key…

基于java ssm springboot网上蛋糕商城项目设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 文末获取源码联系方式&#x1f4dd; 主要技术&#xff1a;spring、 springmvc、 springboot、 mybatis 、 jquery 、 md5 、bootstarp.js tomcat、富文本编译器、拦截器等 主要功能:登录、注册、商品浏览、…

基于Java springboot+vue+redis前后端分离家具商城平台系统设计和实现

主要技术实现&#xff1a;spring、 springmvc、 springboot、 mybatis 、 jquery 、 md5 、bootstarp.js tomcat、富文本编译器、拦截器等 主要设计功能&#xff1a;用户登录、注册、商城分类、商品浏览、查看、购物车、订单、支付、以及后台的管理 4.3用户需求分析 用户…

jq 修改swal的标题_js-jquery-SweetAlert2【一】使用

一、下载安装地址&#xff1a;https://github.com/limonte/sweetalert2二、页面引用当然还有jquery三、示例3.1、基础结构window.οnlοadfunction(){swal("Here‘s a message!");//以下代码主要修改这里}3.2、精简用法1、标题【alert】-swal(string)swal("Here…