OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3373|回复: 2

变量=函数返回值的问题。变量总是为0怎么回事。

[复制链接]

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2015-7-16
在线时间
51 小时
发表于 2017-5-15 17:44:50 | 显示全部楼层 |阅读模式
10金钱
先贴上程序:
[mw_shl_code=c,true]/*
*********************************************************************************************************
* 函 数 名:        _ShowBMP
* 功能说明:        显示 BMP 图片
* 形 参:         sFilename 要读取的文件名
*                         x 要显示的 x 轴坐标位置
*                         y 要显示的 y 轴坐标位置
* 返 回 值:        返回绘制了 BMP 图片的内存设备句柄。
*********************************************************************************************************
*/
GUI_HMEM _ShowBMP(const char * sFilename, int x, int y)
{
        GUI_HMEM hMem;
        char *_acBuffer;
        UINT bw;
        int XSize, YSize;
        GUI_MEMDEV_Handle hMemBMP;
       
        /* 打开文件 */
        result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
        if (result != FR_OK)
        {
                printf("\n文件打开失败!\n");
                return 0;
        }
       
        /* 申请一块内存空间 并且将其清零 */
        hMem = GUI_ALLOC_AllocZero(file.fsize);
        /* 将申请到内存的句柄转换成指针类型 */
        _acBuffer = GUI_ALLOC_h2p(hMem);
       
        result = f_read(&file, _acBuffer, file.fsize, &bw);
          if (result != FR_OK)
          {
                printf("\n图片读取失败!\n");
                return 0;
          }
       
        XSize = GUI_BMP_GetXSize(_acBuffer);
        YSize = GUI_BMP_GetYSize(_acBuffer);
       
        /*
        **        创建内存设备,并将 BMP 图片绘制到此内存设备里面,此内存设备要在主程序中用到
        **        所以退出此函数前,不要释放。
        */
        hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
        GUI_MEMDEV_Select(hMemBMP);
        GUI_BMP_Draw(_acBuffer, 0, 0);
        GUI_MEMDEV_Select(0);
       
        GUI_ALLOC_Free(hMem);
        f_close(&file);
       
        return hMemBMP;
}
void drawJPG(void)
{
        GUI_SetBkColor(GUI_WHITE);
        GUI_Clear();
        _ShowJPG("0:/1.jpg");
        printf("\n显示SD卡图片!\n");
        GUI_Delay(100);
}
void drawBMP(void)
{
        GUI_MEMDEV_Handle hMemBMP;
       
        GUI_SetBkColor(GUI_WHITE);
        GUI_Clear();
        hMemBMP = _ShowBMP("0:/sunset.bmp", 0, 0);
        GUI_MEMDEV_WriteAt(hMemBMP, 0, 0);
        printf("\n显示SD卡图片!\n");
        GUI_Delay(100);
}
[/mw_shl_code]
问题就是这句“hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);”,我通过debug发现函数返回的不是0,但是hMemBMP总是0。
有没有人知道捏?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-5-15 20:47:08 | 显示全部楼层
不应该有这样的问题。你可以直接改代码,返回一个固定值,测试下
回复

使用道具 举报

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2015-7-16
在线时间
51 小时
 楼主| 发表于 2017-5-16 09:00:12 | 显示全部楼层
正点原子 发表于 2017-5-15 20:47
不应该有这样的问题。你可以直接改代码,返回一个固定值,测试下

刚刚测试了下,直接写了一个test函数返回1,句柄是可以正常改写的哦。所以问题出在那个函数上面,关键就是这个函数他是封装了的。而我在之前debug的时候,他的值一直是“0x08001E28”,并不是0,结果在单步执行到下一句的时候句柄就是接收的0。emwin手册里面的介绍也比较简单:
/*
描述
创建存储设备。
原型
GUI_MEMDEV_Handle GUI_MEMDEV_CreateEx(int x0, int y0,int XSize, int YSize,int Flags))
返回值
已创建存储设备的句柄。例程失败时返回值 0。
*/
论坛之前有人也遇到过这个问题,说是内存分配不足,试了下不行呢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表