快手软件

AAuto0.60发布,支持直接执行C语言代码(TCC扩展库)

AAuto通过web窗体或web.script库,可以自由的与Javascript交互、非常方便。

在SVN最新版本中,又添加了TCC的支持库,可以在AAuto中直接执行C语言的代码,运行时编译,支持C语言与AAuto代码的自由交互,同样非常方便。

AAuto最新SVN版本:
svn://svn.ecranesoft.com/aauto
用户名与密码都是aauto

DBANK下载:AAuto0.60.rar

 

 

范例源码一 AAuto调用C语言函数:
-------------------------------------------------------------------------------

//AAuto调用C语言函数

code_c = /****

    #include <stdio.h>
    #include <stdlib.h> 

    int func_c (const char *msg)
    {  
    
        //打开控制台窗口
        io_reopen();  
        
        printf( "Hello! 我是C语言代码\n收到AAuto传来的参数:%s\n",msg ); 
        
        int num = 123; //C99
        return num;
    } 

****/


import tcc; 

//创建TCC编译器
vm = tcc(); 
  
//编译C源码
vm.compile(code_c);

//获取C函数
func_c = vm.getCdecl("func_c","byte(string msg)")

//调用C函数
var ret = func_c("测试一下")

io.print( "C函数返回值", ret )

//关闭C语言编译器
vm.close();



范例源码二 C语言调用AAuto函数:
-------------------------------------------------------------------------------

//C语言调用AAuto函数

code_c = /**** 
    #include <stdio.h>
    
    //该函数在C语言中声明,在AAuto中定义 
    const char *func_aau(int a,int b,int c);
    
    int main ()
    {     
        //调用AAuto函数
        const char *ret = func_aau(1,2,3);
        
        io_reopen();
        printf("AAuto函数返回的值:%s\n",ret);
        
        return 1;
    } 

****/


io.open();//打开控制台,默认编译错误等信息在控制台输出

import tcc; 

//创建TCC编译器
vm = tcc(); 

//编译C源码
vm.compile(code_c);

//定义一个AAuto函数
aauto_func = function(a,b,c){
    io.print( "我是被C语言代码调用的AAuto函数" )
    io.print( "收到C语言传过来的参数",a,b,c)
    return "Hello!"


//导入为C语言函数定义
vm.setCdecl(
    aauto_func, //AAuto函数名字
    "func_aau", //在C语言中调用的函数名字 
    "string(int a,int b,int c)" //函数原型,与C语言中的声明必须一致.
)

//链接并运行C语言main()函数
vm.run();

vm.close();

范例三: C语言编译器 窗口程序
-------------------------------------------------------------------

//TCC编译器
import win.ui;
import tcc;
/*DSG{{*/
var winform = win.form(parent=...; text="TCC编译器";right=577;bottom=507 )
winform.add( 
txtCode={ bottom=444;right=551;left=14;multiline=1;top=19;z=1;text="//请在这里输入C语言代码";edge=1;cls="richedit" };
static={ bottom=481;align="right";text="启动参数:";left=19;top=463;transparent=1;right=74;z=4;cls="static" };
btnRun={ bottom=490;right=538;left=458;top=460;z=2;text="运行";cls="button" };
txtArg={ bottom=489;right=437;left=90;top=461;z=3;text="参数,参数2";edge=1;cls="edit" }
)
/*}}*/

winform.txtCode.text = /**
#include <stdio.h> 

int main ( int argc, char *argv[] ) 
{   
    int i = 0; 
    io_reopen();
    
    for( i=1;i<argc;i++){
        printf( "%s \n" , argv[ i ] );
    
    }
     
    return 0; 
}
**/

winform.btnRun.oncommand = function(id,event){

    //创建TCC编译器
    vm = tcc(); 
    
    //编译C源码
     
    try{
        vm.compile(winform.txtCode.text); 
        
        //直接运行 main函数
        vm.run( 
            table.unpack(  
                string.split(winform.txtArg.text,",") 
            )
        );
         
        vm.close(); 
    }
    catch(e){
        io.open()
        io.print(e);
    } 
}

winform.show() 
win.loopMessage();



注意:

1、在IDE或win程序中使用控制台之前,需要在C语言中调用一次 io_reopen() 

2、TCC支持C99标准(有些C编译器并不支持),C99中允许不在函数开始定义变量、变长数组等.
详情就参考相关资料。

3、C语言需要的头文件,默认放在lib\tcc\.res目录下,发布后需要拷贝到发布目录(不需要tcc.dll)

posted on 2011-04-11 21:55  快手软件  阅读(722)  评论(0编辑  收藏  举报

导航