精华内容
下载资源
问答
  • 在C语言中调用java语言的方法!对初学者很不错的实例!Android jni开发之C语言调用java语言
  • C语言调用DLL

    2013-03-12 21:49:23
    使用c语言调用dll 博文地址http://blog.csdn.net/dengnanyi/article/details/8665379
  • C语言调用汇编和汇编调用C语言

    万次阅读 2017-05-18 12:27:23
    1.C语言调用汇编 程序的入口是main,在main里调用汇编的函数。 在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。 在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数...

    1.C语言调用汇编

    程序的入口是main,在main里调用汇编的函数。

    在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。

    在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段

    #include<stdio.h>
    extern int sum(int a,int b,int c,int d,int e,int f);
    int main(){
        int result = sum(1,2,3,4,5,6);  
        return 0; 
    }
    汇编代码可新建一个sum.asm文件,在工程中添加这个文件即可。        
            AREA    EXAMPLE,CODE,READONLY
            EXPORT    sum
            ENTRY
            
    sum
            ADD R0,R0,R1
            ADD R2,R2,R3
            ADD R0,R0,R2
            
            LDR    R4,[SP]
            LDR R5,[SP,#4]
            
            ADD R4,R4,R5
            ADD R0,R4,R0
            
            BX LR
            
            END
    函数传参:

    4个以内的参数,直接存放在R0~R3 这4个寄存器里面。

    4个以后的参数放在堆栈里。

    如果函数有返回值,那么返回值放在R0里。

    Debug看看编译器是怎么处理的,我们就怎样把参数取出来。

    还是比较易懂

    首先是

    R0 =6   R1=5   R2=4   R3=3

    然后把R1的值放在堆栈里,R13=5,然后R1=2

    然后吧R0的值放在堆栈的下一个位置,R13+4=6,然后R0=1.

    之后就是:

    R0=1,R1=2,R2=3,R3=4

    堆栈里面:

    所以取参数的时候就是:

    LDR    R4,[SP];R4=5
    LDR R5,[SP,#4];R5=6

    把相加的结果放在R0,然后BX LR返回

    可以看到:

    可以验证的确R0是存放返回值的。


    例子:

    ;C语言中extern void macRM68090_WR_CMD(int cmd);  R0 为cmd
        AREA    EXAMPLE,CODE,READONLY
        EXPORT    macRM68090_WR_CMD
        ENTRY
            
    macRM68090_WR_CMD
    	;macRM68090_RS_CLR;macRM68090_CS_CLR 
    	LDR R1, =0x30 
    	ldr r4, =0x40010C14 
    	STR R1, [r4]            ; GPIOB->BRR = 0x10; GPIOB->BRR = 0x20;  
    	          	
    	;macRM68090_8BIT_DATAOUT(cmd&0xFF00); 
    	AND R1, R0, #0xFF00
    	LDR R3, =0x40010C0C
    	AND R3, R3, #0X00FF
    	ORR R2, R1, R3
    	ldr r4, =0x40010C0C 
    	STR R2, [r4]
    	
    	;macRM68090_WR_CLR;macRM68090_WR_SET 
    	LDR R1, =0x08
    	ldr r4, =0x40010C14 
    	STR R1, [r4]             ;GPIOB->BRR = 0x08;
        ldr r4, =0x40010C10 	
    	STR R1, [r4]            ;GPIOB->BSRR = 0x08;  
    	
    	;macRM68090_8BIT_DATAOUT(((cmd<<8)&0xFF00));
    	MOV R2, R0, LSL#8
    	AND R2, R2, #0xFF00
    	LDR R3, =0x40010C0C
    	AND R3, R3, #0x00FF
    	ORR R2, R0, R3
        ldr r4, =0x40010C0C 
    	STR R2, [r4] 
    	
    	;macRM68090_WR_CLR ; 
    	ldr r4, =0x40010C14 
    	STR R1, [r4]  ; GPIOB->BRR = 0x08;   
    	
    	;macRM68090_WR_SET ;macRM68090_CS_SET
    	LDR R1, =0x28  
    	ldr r4, =0x40010C10 
    	STR R1, [r4]  ; GPIOB->BSRR = 0x08; GPIOB->BSRR = 0x20; 
    	
        BX LR
        NOP	
    	END
    
    ;C语言中extern void macRM68090_WR_DATA(int data);  R0 为data
        AREA    EXAMPLE,CODE,READONLY
        EXPORT    macRM68090_WR_DATA
        ENTRY
    	
    macRM68090_WR_DATA
    	;macRM68090_RS_SET
    	LDR R1, =0x10  
    	ldr r4, =0x40010C10 
    	STR R1, [r4]   ; GPIOB->BSRR = 0x10;
    	
    	;macRM68090_CS_CLR 
    	LDR R1, =0x20 
    	ldr r4, =0x40010C14 
    	STR R1, [r4]             ;  GPIOB->BRR = 0x20; 
    	
    	;macRM68090_8BIT_DATAOUT(data&0xFF00);          	
    	AND R1, R0, #0xFF00
    	LDR R3, =0x40010C0C
    	AND R3, R3, #0X00FF
    	ORR R2, R1, R3
    	ldr r4, =0x40010C0C 
    	STR R2, [R4]
    	
    	;macRM68090_WR_CLR;macRM68090_WR_SET 
    	LDR R1, =0x08
    	ldr r4, =0x40010C14 
    	STR R1, [R4]             ;GPIOB->BRR = 0x08; 
    	ldr r4, =0x40010C10 
    	STR R1, [R4]           ;GPIOB->BSRR = 0x08; 
    	
    	;macRM68090_8BIT_DATAOUT(((data<<8) &0xFF00));
    	MOV R2, R0, LSL#8
    	AND R2, R2, #0xFF00
    	LDR R3, =0x40010C0C
    	AND R3, R3, #0x00FF
    	ORR R2, R0, R3
    	ldr r4, =0x40010C0C 
    	STR R2, [R4]
    	
    	;macRM68090_WR_CLR ;  
    	ldr r4, =0x40010C14 
    	STR R1, [r4]  ; GPIOB->BRR = 0x08;  
    	
    	;macRM68090_WR_SET ;macRM68090_CS_SET
    	LDR R1, =0x28 
        ldr r4, =0x40010C10 	
    	STR R1, [R4]  ; GPIOB->BSRR = 0x08; GPIOB->BSRR = 0x20; 
    	
        BX LR
        NOP	
    	END

    Keil: warning: A1581W: Added 2 bytes of padding at address

    KEIL MDK编译警告:

     

    warning: A1581W: Added 2 bytes of padding at address xxx

    image

    原因:

    在Keil 里写汇编代码时如果代码尺寸不对齐,编译器自动补补警告。

     

    处理办法:

     

    加NOP指令,或修改对齐方式

     

     image


    展开全文
  • c语言调用枚举类型函数 C语言中的函数调用类型 (Types of Function calls in C) Functions are called by their names, we all know that, then what is this tutorial for? Well if the function does not have ...

    c语言调用枚举类型函数

    Functions are called by their names, we all know that, then what is this tutorial for? Well if the function does not have any arguments, then to call a function you can directly use its name. But for functions with arguments, we can call a function in two different ways, based on how we specify the arguments, and these two ways are:

    函数以它们的名称来调用,我们都知道,那么本教程的目的是什么? 好吧,如果该函数没有任何参数,则可以直接使用其名称来调用函数。 但是对于带有参数的函数,可以根据指定参数的方式以两种不同的方式调用函数,这两种方式是:

    1. Call by Value

      按价值致电

    2. Call by Reference

      通过参考电话

    按价值致电 (Call by Value)

    Calling a function by value means, we pass the values of the arguments which are stored or copied into the formal parameters of the function. Hence, the original values are unchanged only the parameters inside the function changes.

    通过值方式调用函数,我们将参数的值传递给存储或复制到函数的形式参数中。 因此,只有函数内部的参数发生变化,原始值才会保持不变。

    #include<stdio.h>
    
    void calc(int x);
    
    int main()
    {
        int x = 10;
        calc(x);
        // this will print the value of 'x'
        printf("\nvalue of x in main is %d", x);
        return 0;
    }
    
    void calc(int x)
    {
        // changing the value of 'x'
        x = x + 10 ;
        printf("value of x in calc function is %d ", x);
    }

    value of x in calc function is 20 value of x in main is 10

    calc函数中x的值是20 main中x的值是10

    In this case, the actual variable x is not changed. This is because we are passing the argument by value, hence a copy of x is passed to the function, which is updated during function execution, and that copied value in the function is destroyed when the function ends(goes out of scope). So the variable x inside the main() function is never changed and hence, still holds a value of 10.

    在这种情况下,实际变量x不变。 这是因为我们通过值传递参数,因此将x的副本传递给函数,该副本在函数执行期间进行更新,并且函数结束时(超出范围)销毁了函数中复制的值。 因此main()函数中的变量x永远不会更改,因此仍然保持值为10

    But we can change this program to let the function modify the original x variable, by making the function calc() return a value, and storing that value in x.

    但是我们可以更改该程序,使函数calc()返回一个值并将该值存储在x中,以使该函数修改原始的x变量。

    #include<stdio.h>
    
    int calc(int x);
    
    int main()
    {
        int x = 10;
        x = calc(x);
        printf("value of x is %d", x);
        return 0;
    }
    
    int calc(int x)
    {
        x = x + 10 ;
        return x;
    }

    value of x is 20

    x的值为20

    通过参考电话 (Call by Reference)

    In call by reference we pass the address(reference) of a variable as argument to any function. When we pass the address of any variable as argument, then the function will have access to our variable, as it now knows where it is stored and hence can easily update its value.

    在按引用调用中,我们将变量的地址(引用)作为参数传递给任何函数。 当我们将任何变量的地址作为参数传递时,该函数将可以访问我们的变量,因为它现在知道它的存储位置,因此可以轻松地更新其值。

    In this case the formal parameter can be taken as a reference or a pointer(don't worry about pointers, we will soon learn about them), in both the cases they will change the values of the original variable.

    在这种情况下,形式参数可以用作引用指针 (不用担心指针,我们将很快了解它们),在这两种情况下,它们都会更改原始变量的值。

    #include<stdio.h>
    
    void calc(int *p);      // functin taking pointer as argument
    
    int main()
    {
        int x = 10;
        calc(&x);       // passing address of 'x' as argument
        printf("value of x is %d", x);
        return(0);
    }
    
    void calc(int *p)       //receiving the address in a reference pointer variable
    {
        /*
            changing the value directly that is 
            stored at the address passed
        */
        *p = *p + 10; 
    }

    value of x is 20

    x的值为20

    NOTE: If you do not have any prior knowledge of pointers, do study Pointers first. Or just go over this topic and come back again to revise this, once you have learned about pointers.

    注意:如果您没有任何有关指针的先验知识,请首先研究指针 。 或者,只要您了解了指针,就可以遍历该主题,然后再次修改此主题。

    翻译自: https://www.studytonight.com/c/types-of-function-calls.php

    c语言调用枚举类型函数

    展开全文
  • c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 ..................
  • 学习笔记:C语言调用随机数

    学习笔记:C语言调用随机数

    了解随机函数rand()

    C语言有自己的随机函数rand(),使用随机函数需要的头文件为<stdlib.h>。调用了rand()即可生成0-RAND_MAX之间的随机数,关于rand()说明可参考该文章

    rand()函数可生成一个伪随机数,这个数范围是0-RAND_MAX。根据rand函数定义:int rand(void),此时RAND_MAX的范围至少在32767之间(int),即双字节(16位),倘若用的是unsigned int定义,那么是65535。据此也知道利用rand函数生成的数是整型数据。(按了解是这样)

    rand()函数生成的是假随机数,即每次执行时得到的结果是相同的,若要不同那需要以不同的值来初始化,初始化的函数就是srand()。

    控制范围

    在实际应用时,我们通常需要得到一定范围内的随机数。那么这是可以利用取余的原理来执行。

    取余原理:对任意两个整数x和y,它们在整数的除法中,只有能整除与不能整除两种情况。不能整除则得到余数,对于x%y,得到的余数的范围是[0,y-1]。根据数学知识,倘若要得到[x,y]范围的余数,那么可以先获取[0,y-x]范围的余数,此时表达式应为x%(y-x+1);再求[x,y]范围的余数,表达式应为x%(y-x+1)+x

    那么将这原理应用于rand函数,无论使用它生成了[0,RAND_MAX]的哪个随机数,只要表达式为rand()%(y-x+1)+x,那么即可得到范围为[x,y]内的一个随机数。举个例子,令x=0,y=100,则表达式为rand()%101,此时计算机则提供给你一个范围在[0,100]内的随机整数。

    值得注意的是,C语言提供的rand函数是伪随机数,如果不做其它处理,那么每次运行程序获取到的随机数序列是固定的。为了解决这个问题,C语言还定义了srand()这个库函数,用来设定一个随机数种子,从而得到一个不确定的随机初始值。

    获取真随机数

    若仅仅使用上述方法,我们无法让每次运行程序得到的随机数不一样。这个时候我们需要srand()函数,这个函数需要的头文件同样为<stdlib.h>,它的定义: void srand(unsigned int seed),功能:srand()用来设置rand()产生随机数时的随机数种子,参数seed必须是整数,通常可以用time(0)的返回值作为seed.如果每次seed都设置相同的值,rand()产生的随机数值每次都一样。

    srand()函数要求有一个int型的参数,这个参数比较常见的做法是用time(NULL)来获取当前微秒数来充当。于是一个完整的设定随机数种子的操作为srand(time(NULL)),其中time函数需要引入<time.h>来声明。且srand()需要在第一次调用rand前调用。

    实际操作

    单纯只用rand()函数:

    //抽取10个值在[0,100]范围内的随机数程序可以写成
    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        int i;
        for(i = 0; i < 10; i ++)
            printf("%d\n", rand()%101);//这里增加了模除运算,由于最小值就是0,所以不需要加法了。
        return 0;
    }
    

    两次运行结果分别为:
    第一次运行

    第二次运行


    同时使用rand()和srand()函数:

    获取[0,100]10个随机整数
    #include<stdio.h>
    #include <stdlib.h>
    #include <time.h> //增加time函数的头文件
    int main()
    {
        int i;    
        srand(time(NULL));//设置随机数种子,只需要调用一次即可,且需在第一次调用rand()前调用。     
        for(i = 0; i < 10; i ++)
            printf("%d\n", rand()%101);         
        return 0;
    }
    

    两次运行结果分别为:

    第一次运行

    第二次运行


    参考文章:

    百度问答

    有关rand(),srand()产生随机数学习总结

    展开全文
  • C语言调用python脚本

    千次阅读 2019-06-29 12:47:19
    python提供了C语言的API,可以使用C语言调用python脚本。 参考链接:https://docs.python.org/3/c-api/ API接口函数很多,一时半会儿也看不完,先快速实现在C语言程序内执行py脚本再说吧,做个笔记。 #define Py...

    python提供了C语言的API,可以使用C语言调用python脚本。

    参考链接:https://docs.python.org/3/c-api/

    API接口函数很多,一时半会儿也看不完,先快速实现在C语言程序内执行py脚本再说吧,做个笔记。

    #define Py_LIMITED_API
    #include <stdio.h>
    #include <Windows.h>
    #include "python.h"
    
    int py_init(void)
    {
        Py_SetPythonHome(L"C:\Python");
        return 0;
    }
    
    int py_exec(wchar_t *script)
    {
        wchar_t *argv[2];
        argv[0] = L"python";
        argv[1] = script;
        return Py_Main(2, argv);
    }
    
    int main(void)
    {
        int ret;
        wchar_t *script = L"X:\Path\demo.py";
        ret = py_init();
        ret = py_exec(script);
        return ret;
    }
    

    解释一下:

    #define Py_LIMITED_API 表示只使用python3.dll提供的API函数,兼容性较强,否则会调用python36.dll。

    Py_SetPythonHome(home) 设置python的根目录,否则会报错,找不到

    Py_Main(argc, argv) 调用python的主函数,没有参数的话会进入python命令行,给2个参数就可以执行指定脚本。

    展开全文
  • C语言调用JAVA的例子

    热门讨论 2009-04-18 13:38:26
    C语言调用JAVA的例子,一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 ...
  • C语言调用汇编语言(nop)

    千次阅读 2019-08-12 14:31:16
    C语言调用汇编语言 C语言调用汇编语言,当需要很小的延时时候,需要在C语言中内嵌汇编伪指令nop,一个nop对应一个指令周期,每个指令周期的时长与平台相关和平台主频相关。 下面以BES2000L2芯片为例,C语言中内嵌...
  • C语言调用PyQT4源代码

    2014-02-28 03:08:35
    C语言调用PyQT4的界面,简单例子,代码里面调用了PyQT的主窗口。 包含pro文件用于qmake生成Makefile 包含说明文件。
  • C语言调用lua实例安装lua环境DEMOlua脚本(实现两个数的相加):C语言调用lua函数 安装lua环境 Ubuntu下lua环境安装。 Lua是一种嵌入式脚本语言,即Lua不是可以单独运行的程序,在实际应用中,C/C++作为主程序,调用...
  • C语言调用C++类中的方法,下载下来可以直接运行,简单易用,如果你需要,照葫芦画瓢就可以
  • c语言调用sqlite数据库

    2007-06-27 15:46:33
    c语言调用sqlite数据库中表的内容,非常实用
  • 使用C语言调用python

    2017-06-11 10:09:07
    C语言代码 #include #include"Python.h" //这里要包含头文件 //C/C++中执行python文件 ... 想实现用C语言调用python 编译时报错: gcc test.c -o test -l/usr/include/python2.7/ -lpyhton2.7 ``` 求解决
  • 转载的蓝牙c语言调用代码! 需要进行细微修改的朋友们或者寻找相关代码资料的人方便寻找与下载 !
  • 深度学习目标识别之C语言调用 使用C语言对深度学习的模型进行调用,而可能是很多人目前需要的,因为使用C语言,更能满足日常开发需要,也更容易移植到到QT进行页面搭建。程序已经完成好久了,一直没有更新这个程序,...
  • 利用c语言调用java无参的方法 java方法  com.example.jniparsedata.ParseData类中的方法  //打印  public void sayHelloFromJava(){  System.out.println("sayHelloFromJava");  }    //c调用...
  • C语言调用WMI

    千次阅读 2012-05-25 11:29:38
    标题: 用C语言调用WMI 作者: Demon 链接: http://demon.tw/programming/c-language-wmi.html 版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。 这只是一篇翻译 ...
  • 使用冒泡排序将指定数组排序后输出排序函数使用汇编语言编写,C语言调用汇编语言在控制台显示排序前后的结果一、问题分析二、代码编写2.1 C语言代码2.2 汇编代码三、ADS调试3.1 运行ADS软件,进入调试界面3.2 汇编...
  • 计算两个大数的和(超过32位)C语言调用汇编函数,汇编函数实现加法功能,计算结果在控制台显示一、问题分析二、编写代码2.1 C语言代码2.2 汇编语言代码三、ADS调试过程四、附录 一、问题分析 本程序通过在C语言中...
  • C语言调用Lua脚本

    2013-03-20 20:57:47
    1.C语言调用Lua脚本。 C语言中调用Lua脚本的最开始的步骤是一样的,都是打开一个类似于*File的文件描述符之类的东西。 具体是这样的: lua_State*L=lua_open(); 然后加载运行库: 根据Lua版本的不同有以下几种...
  • C语言调用.bat批处理命令

    千次阅读 2018-06-04 10:06:11
    本文主要总结用C语言调用.bat批处理命令,具体的语句如下: system("cmd.exe /c \"D:\\test.bat\""); 其中,需要包含stdlib.h库,使用system()时,格式为:system(”命令行”); 比如: system(“pause...
  • JNI中C语言调用Java方法
  • C语言调用jni中JNIEnv指针使用和理解

    千次阅读 2017-04-04 22:59:56
    使用C语言调用jni的时候,需要和java的环境对象和虚拟机对象交互。它们的C语言定义如下。 typedef const struct JNINativeInterface* JNIEnv; typedef const struct JNIInvokeInterface* JavaVM; 可以看到,JNIEnv和...
  • C语言调用 Java(Linux)

    千次阅读 2010-08-12 20:10:00
    C语言调用 Java(Linux)
  • c语言调用c++类成员函数的方法

    千次阅读 2015-10-16 18:03:42
    c语言调用c++成员函数的方法
  • 本文主要介绍利用c语言调用cmd命令的方法,和简单介绍一下100多个编程相关的cmd命令。 原文地址:https://www.cjavapy.com/article/19/
  • 7.C语言调用帧结构

    万次阅读 2016-10-22 22:55:08
    7.C语言调用帧结构 IA32程序用程序栈来支持过程调用。它包括将数据(参数和返回值)和控制从代码的一部分传到另一部分,另外还包括进入时为过程的局部变量分配空间,并在退出时释放空间。一般地,机器只提供转移...
  • C语言调用MATLAB程序之简单样例

    万次阅读 2016-10-09 21:44:50
    首先声明一下,本文中C语言调用MATLAB语言的方法,本质上是通过C语言编程实现利用MATLAB引擎执行MATLAB代码,并最终获得执行结果。如何用C语言创建MATLAB引擎的引用,MATLAB已经为我们准备好了一系列的头文件以及...
  • C语言调用Windows API 函数micSendString()函数 出现了一个类似字符串不能转换lpcwstr的问题, 就是第一个参数哪里的问题, 求解释,下面是问题的图片 求大佬解释 ![图片说明]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,857
精华内容 13,942
关键字:

c语言调用

c语言 订阅