xyjzsh

猜猜执行结果

static const char *msg[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char *get_a_day(int idx)
{
 static char buf[20];
 strcpy(buf, msg[idx]);
 return buf;
}

int main()
{
 char *day0 = get_a_day(0);
 char *day1 = get_a_day(1);
 printf("%s %s\n", day0, day1);
 return 0;
}

结果是什么?

posted @ 2011-07-20 13:52 呆人 阅读(188) | 评论 (0)编辑 收藏

error C3872: “0x3000”: 此字符不允许在标识符中使用——快速处理方法

在从别处拷贝代码到IDE时经常出现这类问题。出现问题的原因是:存在中文符号,一般为全角下的中文空格。
为了快速出来这里错误,可以先把要拷贝的代码拷贝到word中,用查找替换工具,将所有的全角下的空格,替换为英文下的半角空格。

在vs2008中可以直接用它自带的查找替换功能。

posted @ 2011-05-17 14:52 呆人 阅读(1398) | 评论 (0)编辑 收藏

matlab生成dll后在vc中脱离matlab环境执行

在没有安装matlab的机器上,要想运行matlab的dll要必须安装MCR环境。
在安装了matlab的机器上,在 MATLAB\R2010b\toolbox\compiler\deploy\win32下面有MCR 的安装程序。
在安装了MCR的机器上,就可以运行使用了matlab的dll的VC的可执行文件。

posted @ 2011-05-16 16:05 呆人 阅读(418) | 评论 (0)编辑 收藏

matlab生成dll后在vc中脱离matlab环境执行

在没有安装matlab的机器上,要想运行matlab的dll要必须安装MCR环境。
在安装了matlab的机器上,在 MATLAB\R2010b\toolbox\compiler\deploy\win32下面有MCR 的安装程序。
在安装了MCR的机器上,就可以运行使用了matlab的dll的VC的可执行文件。

posted @ 2011-05-16 16:05 呆人 阅读(1539) | 评论 (0)编辑 收藏

vs2008中调用matlab生成的dll

matlab版本为:matlab7.11.0(R2010b)
vs2008

1.在matlab中生成dll

在m文件中实现如下功能:
获得N个魔方矩阵的秩。m文件的内容如下:
function r = mrank(n)

r = zeros(n,1);
for k=1:n
    r(k) = rank(magic(k));
end

将上述内容保存为:mrank.m


在matlab的command 窗口键入:
>> mcc -B csharedlib:mrank mrank.m %该命令将在后面做说明

在matlab7.0中执行上述命令后生成下面几个文件:
mrank.exp    mrank.exports   mrank.h   mrank.lib  mrank.c     mrank.dll  

在vs2008中使用m文件的函数功能。
首先配置vs2008的环境
1.工具——> 选项——>项目和解决方案——>VC++目录
(1) 选择“可执行文件”下拉框,添加:C:\Program Files\MATLAB\R2010b\bin\win32(注意:当前的Mathlab安装在C:\Program Files下面)
(2)选择“包含文件”下拉框,添加:C:\Program Files\MATLAB\R2010b\extern\include
(3)选择“引用文件”下拉框,添加:C:\Program Files\MATLAB\R2010b\extern\lib
(4)选择“库文件”下拉框,添加:C:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft
上述环境只需要配置一次

对于每一个工程,做下面的设置
项目——>属性——>连接器——>输入
选择:附加依赖项:添加:
libmex.lib
libmx.lib
libmat.lib
mclmcrrt.lib

将mrank.h  mrank.lib  mrank.dll拷贝到当前目录下
cpp文件中中的内容如下:
#include "stdafx.h"
#include<stdlib.h>
#include"matrix.h"
#include"mrank.h"
#include "mclmcrrt.h"
#pragma comment(lib,"mrank.lib")

int main()
{
  mxArray *N(NULL),*R(NULL);
 int n =12;

 mrankInitialize();//初始化动态链接库
 N = mxCreateDoubleScalar(n);//用n来初始化生成的数组,其实标量就是一个1*1的数组
 mlfMrank(1,&R,N);//执行m文件的主要功能
 
 size_t num = mxGetM(R);//R的行的个数
 double *res = new double[num];
 memset(res,0,sizeof(double)*num);

 memcpy(res,mxGetPr(R),sizeof(double)*num);

 for(int i=0;i<num;++i)
  printf("%f\n",res[i]);

 delete[] res;
 mxDestroyArray(N);
 mxDestroyArray(R);
 
 mrankTerminate();//终止动态数据连接
return 0;
}

上述cpp文件使用了Matlab编译m文件生成的dll,在cpp中通过mxArray这个数据结构来和dll中的方法进行信息交换。
这样就在cpp中调用了matlab中的m文件实现的方法。

mcc命令说明:
http://www.cnblogs.com/juneja/archive/2008/10/31/1323423.html

posted @ 2011-05-12 17:28 呆人 阅读(4531) | 评论 (0)编辑 收藏

返回值为函数指针的写法

下面方法的作用是:通过key的类型返回对应的哈希函数的指针

static int (*hashFunction(int keyClass))(const void*,int)
{
/*内容省略*/
}

函数的名字是:hashFunction,该函数为只有1个int型参数为。
该函数的返回值为一个函数指针,函数有2个参数,第一个类型为const void*,第二个为int,返回值为int 。

posted @ 2011-04-26 15:36 呆人 阅读(674) | 评论 (0)编辑 收藏

c语言中模拟动态绑定

struct本身不能支持动态绑定,为了实现统一接口,我们希望实现动态绑定。
例如在不同的操作系统下,对文件的操作是不同,但是我们希望统一结构,有如下结构
struct OSFile
{
    PIOMethod pMethods;
   /*
   其他信息
  */
};

struct WinOSFile
{
PIOMethod pMethods;
..........
};

struct UnixOSFile
{
PIOMethod pMethods;
..........
};

有如下方法:
void UniAPI(OSFile *file);
为了实现动态绑定,做法是在调用该方法之前,将WinOSFile或者UnixOSFile的pMethods赋给OSFile的pMethods从而实现动态绑定。

posted @ 2011-04-26 15:30 呆人 阅读(499) | 评论 (0)编辑 收藏

按位使用数据以及union

例如:
typedef union tagData
{
   long x:2;
   long y:4;
   long data;
}data_item,*pdata_item;

上述是一个联合体,联合体的对象用的空间是类型中占用内存最大的哪个,例如上例中data_item变量占用4个字节。
long x:2;
表示x占用2bit
long y:4;
表示y占用4bit
long data;
data占用4byte
所以上述union占用4byte空间。
long s=sizeof(data_item);
s=4;

因为x,y,data公用内存空间。
从低位开始,即
x占用空间的低2bit,即0-1
y占用空间2~5bit
x,y都是可以是有符号的,相对最高位表示符号位。
例如,
item_data t={0};
(1) t.data = 2;
2表示成二进制位10.
所以t.x 的值为-2;
(2) t.data = 3;
3表示成二进制位11
所以t.x的值为-1
(3) t.data =1;
此时t.x的值为1

t.y的取值的道理同t.x;
对于t.y来说第5位表示正负号。



posted @ 2011-03-15 17:34 呆人 阅读(516) | 评论 (0)编辑 收藏

宏定义中字符串连接操作

宏定义中字符串连接操作

关于记号粘贴操作符(token paste operator): ##

1. 简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接

   其中,分隔的作用类似于空格。我们知道在普通的宏定义中,预处理器一般把空格
   解释成分段标志
,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,
   被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些
   ##来替代空格

   另外一些分隔标志是,包括操作符,比如 +, -, *, /, [,], …,所以尽管下面的
   宏定义没有空格,但是依然表达有意义的定义: define add(a, b)  a+b

   而其强制连接的作用是,去掉和前面的字符串之间的空格,而把两者连接起来。

2. 举列 – 试比较下述几个宏定义的区别

   #define A1(name, type)  type name_##type##_type 或
   #define A2(name, type)  type name##_##type##_type

   A1(a1, int);  /* 等价于: int name_int_type; */
   A2(a1, int);  /* 等价于: int a1_int_type;   */

   解释:
        1) 在第一个宏定义中,”name”和第一个”_”之间,以及第2个”_”和第二个
   ”type”之间没有被分隔,所以预处理器会把name_##type##_type解释成3段:
   “name_”、“type”、以及“_type”,这中间只有“type”是在宏前面出现过
    的,所以它可以被宏替换。

        2) 而在第二个宏定义中,“name”和第一个“_”之间也被分隔了,所以
   预处理器会把name##_##type##_type解释成4段:“name”、“_”、“type”
   以及“_type”,这其间,就有两个可以被宏替换了。

        3) A1和A2的定义也可以如下:
           #define A1(name, type)  type name_  ##type ##_type  
                                      <##前面随意加上一些空格>
           #define A2(name, type)  type name ##_ ##type ##_type

    结果是## 会把前面的空格去掉完成强连接,得到和上面结果相同的宏定义

3. 其他相关 – 单独的一个 #

   至于单独一个#,则表示 对这个变量替换后,再加双引号引起来。比如

      #define  __stringify_1(x)   #x
那么
      __stringify_1(linux)   <==>  ”linux”

所以,对于MODULE_DEVICE_TABLE

     1) #define MODULE_DEVICE_TABLE(type,name)                        
             MODULE_GENERIC_TABLE(type##_device,name)
     2) #define MODULE_GENERIC_TABLE(gtype,name)                      
             extern const struct gtype##_id __mod_##gtype##_table     
             __attribute__ ((unused, alias(__stringify(name))))

得到  
      MODULE_DEVICE_TABLE(usb, products)  
                             /*notes: struct usb_device_id products; */
 <==> MODULE_GENERIC_TABLE(usb_device,products)
 <==> extern const struct usb_device_id __mod_usb_device_table     
             __attribute__ ((unused, alias(“products”)))   

注意到alias attribute需要一个双引号,所以在这里使用了__stringify(name)来
给name加上双引号。另外,还注意到一个外部变量”__mod_usb_device_table”被alias
到了本驱动专用的由用户自定义的变量products<usb_device_id类型>。这个外部变量
是如何使用的,更多的信息请参看《probe()过程分析》。

4. 分析方法和验证方式 – 编写一个简单的C程序

   用宏定义一个变量,同时用直接方式定义一个相同的变量,编译报告重复定义;
   用宏定义一个变量,直接使用该宏定义的变量名称,编译通过且运行结果正确;

posted @ 2011-03-15 13:49 呆人 阅读(4449) | 评论 (0)编辑 收藏

虚拟指针的问题——memset相关


class Node
{
  
public:
Node(
void){}
~Node(void){}
virtual bool IsLeafNode()=0;

}
;
class InternalNode:public Node
{
public:
InternalNode()
{}
virtual ~InternalNode(void){}
virtual bool IsLeafNode(){return false;}
}
;

class LeafNode:public Node
{
public:
LeafNode()
{}
virtual ~LeafNode(){}
virtual bool IsLeafNode(){return true;}
}
;


定义以上的继承结构:LeafNode和InternalNode继承自Node
有一个虚方法IsLeaf来判断是否为叶子节点。
下面有这样的测试代码:
test()
{
   Node *node = new InternalNode();
   memset(node,0,sizeof(InternalNode));
   node->IsLeafNode();
}
上述代码编译正常,而运行时出错!
出现上述问题的原因是:
对于有虚函数的类,每一个类有一个虚函数表,而每一个对象中会有一个指针指向这个虚函数表。
当   Node *node = new InternalNode();时编译器会把一个指针知道InternalNode的虚函数表
但是memset(node,0,sizeof(InternalNode));却把这个指针设成了。
所以在调用的时候出现了运行时错误!

posted @ 2011-03-14 15:46 呆人 阅读(418) | 评论 (0)编辑 收藏

仅列出标题
共6页: 1 2 3 4 5 6 
<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜