之前碰到这个问题(用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不能跨平台(我姑且这么说吧)复制粘贴的问题
留待以后解决