VS2005使用过程中碰到的有关CONST数据引用问题

之前碰到这个问题(用emwin编写界面遇到的)发了个求助帖,后面自己解决了

如何定义一个包含const成员的数组(可能很蠢,以下是我遇到的问题)。

界面自然涉及到各种贴图,以下是emwin的位图格式

GUI_CONST_STORAGE GUI_BITMAP bmCAR_0 = {
  58, // xSize
  117, // ySize
  232, // BytesPerLine
  32, // BitsPerPixel
  (unsigned char *)_acCAR_0,  // Pointer to picture data
  NULL,  // Pointer to palette
  GUI_DRAW_BMP8888
};

其中几个类型说明如下:

#define GUI_CONST_STORAGE const
typedef struct {
  U16P XSize;
  U16P YSize;
  U16P BytesPerLine;
  U16P BitsPerPixel;
  const U8 * pData;
  const GUI_LOGPALETTE * pPal;
  const GUI_BITMAP_METHODS * pMethods;
} GUI_BITMAP;
嗯,就是这样。

然后我在“汽车速度的显示“这一块需要按数值调用函数进行贴图,以下是原始代码,可以正常运行

//Velocity Handle
Velocity += 1;
Units = Velocity % 10;
Tens  = (Velocity % 100) / 10;
Hundreds = Velocity / 100;
for(i = 0; i < 10; i++)
{
                if(i != Units && i!= Tens && i != Hundreds)continue;
		if(Units == i)
		{	
			if(i == 0)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_0);
			if(i == 1)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_1);
			if(i == 2)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_2);
			if(i == 3)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_3);
			if(i == 4)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_4);
			if(i == 5)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_5);
			if(i == 6)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_6);
			if(i == 7)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_7);
			if(i == 8)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_8);
			if(i == 9)IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&bmCAR_9);
		}
......
}
但是我觉得这样写10个分支太丑了,所以自然而然想到用数组,以下是问题了

我在声明上述图片数据的头文件里定义了一个数组如下:

GUI_CONST_STORAGE GUI_BITMAP Index_Image[] = {
	bmCAR_0,bmCAR_1,bmCAR_2,bmCAR_3,bmCAR_4,
	bmCAR_5,bmCAR_6,bmCAR_7,bmCAR_8,bmCAR_9
 };
extern GUI_CONST_STORAGE GUI_BITMAP Index_Image[];

然后将上述10个分支改成如下:

//Velocity Handle
Velocity += 1;
Units = Velocity % 10;
Tens  = (Velocity % 100) / 10;
Hundreds = Velocity / 100;
for(i = 0; i < 10; i++)
{
                if(i != Units && i!= Tens && i != Hundreds)continue;
		if(Units == i)
		{	
			IMAGE_SetBitmap(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_16),&Index_Image[i]);
		}
......
}
然后编译之后在“数组定义的地方”报错,error C2099: initializer is not a constant

在MSDN出查找C2099,报错原因有l两个,我感觉最接近的可能是这个
the values they are initialized with must be constant.初始化的值必须是常量

后来查找资料知道const修饰的变量不属于常量,感觉数组的办法一下子行不通了,直到我自己写了个小程序测了下



//define.h
#ifndef _DEFINE_H
#define _DEFINE_H

const int a = 3;
const int src[] = {a};
extern const int a;
extern const int src[];

#endif

//main.cpp

#include <stdio.h>
#include "define.h"

int main()
{
	printf("a = %d\nsrc[0] = %d\n",a,src[0]);
	while(1){}

}

然后上面的小程序运行正常,没有报错,所以我有个疑问,为什么同样的数组赋值,这一个例程是对的呢?

或者说还有什么办法能让我不写10个分支呢?

(我在百度上查找,有建议用if加define的,也有说typedef的,我试了都会有其他一些报错

还有说VS2005首先版本低,对C语法支持不够好,其次它专注C++开发,C标准为C89之类的)



然后偶然看到emwin范例里面对这种情况使用指针的方式处理的,以下是范例部分代码

static GUI_CONST_STORAGE GUI_BITMAP * _apBmBar[] = {
    &_bmBarBlue_12x1;
    &_bmBarBluegreen_12x1;
    &_bmBarOrange_12x1
};

至此问题解决

注意:

在用ultraedit复制源文件代码时,发现剪贴板的内容不能粘贴到其他文本里,比如用UE复制一段代码,复制到CSDN的窗口里,剪贴板为空,但是在UE原来的文件里粘贴依然有效

网上资料大部分都是说在剪贴板选项里吧WINDOWS剪贴板选项打钩,这只是开启复制粘贴功能而已,没有解决UE不能跨平台(我姑且这么说吧)复制粘贴的问题

留待以后解决


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值