使用VisualAssist实现CUDA函数、类型高亮的小问题

网上相关教程不少,但有一个问题要提醒大家一下:

一定要在关闭VS的情况下去修改注册表中的扩展名。因为在VS退出的时候,VisualAssist会用当前设置写入注册表,也就是说你的改动被覆盖了,导致无法高亮。

解决CUDA By Example的Julia集示例程序导致显卡驱动停止响应的问题

这学期开了CUDA课程,平时没事干敲敲书上的例子,但Julia集程序一运行就导致显卡驱动停止响应。我试着把DIM的定义从1000改为500,倒是可以了,但是出来的内容不对。后来在网上百度了一下,发现是显卡响应时间有限制。解决方法如下:

打开安装CUDA时安装的Nsignt monitor(可能在开始菜单),它会在后台运行。

右键点击它在系统托盘里的图标,选择弹出菜单中的options,可以看到有一个选项是WDDM TDR Delay。

这个选项的值通常是2,也就是两秒。我们把它改成10.

保存后重新启动计算机,再次运行Julia集示例程序,成功。

Win32API之设置鼠标光标样式

我目前还在做Windows程序设计的课程实验,开发一个编辑器。我尝试设置鼠标光标样式为IDC_IBEAM

SetCursor(LoadCursor(IDC_IBEAM));

但是没有什么作用,鼠标会在点击左键的时候消失一下,一移动又回来了,不过还是原来的光标。

在网上查到,需要在SetCursor之前先设置原来的光标不显示,设置之后再显示新的光标。

ShowCursor(FALSE);

SetCursor(LoadCursor(IDC_IBEAM));

ShowCursor(TRUE);

结果依然令人失望。幸运的是,我在网上找到了这样一个解答:

如果产生了鼠标消息,系统可能会用窗口的hcursor重新刷新光标,
所以用

SetClassLong(hwnd,GCL_HCURSOR,(long)LoadCursor(NULL,IDC_CROSS));

才能一直保持。

按这个方法尝试后,鼠标成功地变成了插入符,并且不受点击等鼠标操作影响。

Win32API之MessageBox(转)

MessageBox 是Windows系统库 user32.dll 的一个导出函数,用于显示一个提示消息对话框,其原型定义如下 :

int MessageBox(

HWND hWnd, // handle to owner window

LPCTSTR lpText, // text in message box

LPCTSTR lpCaption, // message box title

UINT uType // message box style

);

可以看到有四个参数,第一个是消息框所有者窗口句柄,可以是NULL,第二个是消息框的文本内容,第三个是消息框标题,第四个参数是消息框样式(按钮和图标)。

 

按钮样式及常量(可用【样式=数字】表示)

0、确定按钮; _MB_OK=@0x0

1、确定、取消按钮; _MB_OKCANCEL=@0x1

2、终止、重试、忽略按钮;_MB_ABORTRETRYIGNORE=@0x2

3、是、否、取消按钮;_MB_YESNOCANCEL=@0x3

4、是、否按钮;_MB_YESNO=@0x4

5、重试取消钮;_MB_RETRYCANCEL=@0x5

6、终止、重试、继续           0x00000006(需声明API才能使用)

图标常量

_MB_ICONASTERISK=@0x40/ “i”图标

_MB_ICONEXCLAMATION=@0x30/ “!”号图标

_MB_ICONHAND=@0x10 / “×” 号图标

_MB_ICONINFORMATION=@0x40 / “i” 图标

_MB_ICONMASK=@0xF0 / “i” 图标

_MB_ICONQUESTION=@0x20/ “?” 号图标

_MB_ICONSTOP=@0x10/ “×” 号图标

 

按钮返回值

1=确定钮; IDOK

2=取消钮; IDCANCEL

3=终止钮; IDABORT

4=重试钮; IDRETRY

5=忽略钮;IDIGNORE

6=是钮;IDYES

7=否钮;IDNO  

关于WM_CLOSE和WM_DESTROY

当用户点击右上角的关闭按钮时,发出的是WM_CLOSE消息,该消息意味着关闭窗口。

这个消息的处理方式是调用DestroyWindow()来发出WM_DESTROY消息。

而WM_DESTROY消息意味着关闭程序,这个消息的处理方式是调用PostQuitMessage()来发送WM_QUIT,以退出程序。

strcpy和strcpy_s

我在做Windows程序设计课程实验的时候,参照书上的例子使用了strcpy,结果VS报错说这个函数不安全,应该使用strcpy_s。

两者有什么区别呢?其实是因为strcpy无法判断他的操作对象是否有足够的缓冲区,若缓冲区不够的话,就会发生溢出。

strcpy_s避免了这个问题。它会显式地向你报告缓冲区不足的错误,避免丈二和尚摸不着头脑。

C语言中dirent类型的d_type成员

dirent是一个定义于dirent.h中的结构体,用于控制目录文件。

其定义如下:

struct dirent
{
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino;
    __off_t d_off;
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256]; /* We must not include limits.h! */
};

其中的d_type数据成员是一个枚举型变量,用于描述文件的类型。其对应的文件类型如下:

/* File types for `d_type'. */
enum
{
    DT_UNKNOWN = 0,
# define DT_UNKNOWN DT_UNKNOWN
    DT_FIFO = 1,
# define DT_FIFO DT_FIFO
    DT_CHR = 2,
# define DT_CHR DT_CHR
    DT_DIR = 4,
# define DT_DIR DT_DIR
    DT_BLK = 6,
# define DT_BLK DT_BLK
    DT_REG = 8,
# define DT_REG DT_REG
    DT_LNK = 10,
# define DT_LNK DT_LNK
    DT_SOCK = 12,
# define DT_SOCK DT_SOCK
    DT_WHT = 14
# define DT_WHT DT_WHT
};

从stat结构体的st_mode成员中获取文件的权限信息

首先,我们来看一下mode_t类型的结构

 

可以看出,文件的权限位于这个变量的最后9位上。

 

这是特征位的定义

  1. S_IFMT      0170000     文件类型的位遮罩  
  2. S_IFSOCK    0140000     socket  
  3. S_IFLNK     0120000     符号链接(symbolic link)  
  4. S_IFREG     0100000     一般文件  
  5. S_IFBLK     0060000     区块装置(block device)  
  6. S_IFDIR     0040000     目录  
  7. S_IFCHR     0020000     字符装置(character device)  
  8. S_IFIFO     0010000     先进先出(fifo)  
  9. S_ISUID     0004000     文件的(set user-id on execution)位  
  10. S_ISGID     0002000     文件的(set group-id on execution)位  
  11. S_ISVTX     0001000     文件的sticky位  
  12. S_IRWXU     00700       文件所有者的遮罩值(即所有权限值)  
  13. S_IRUSR     00400       文件所有者具可读取权限  
  14. S_IWUSR     00200       文件所有者具可写入权限  
  15. S_IXUSR     00100       文件所有者具可执行权限  
  16. S_IRWXG     00070       用户组的遮罩值(即所有权限值)  
  17. S_IRGRP     00040       用户组具可读取权限  
  18. S_IWGRP     00020       用户组具可写入权限  
  19. S_IXGRP     00010       用户组具可执行权限  
  20. S_IRWXO     00007       其他用户的遮罩值(即所有权限值)  
  21. S_IROTH     00004       其他用户具可读取权限  
  22. S_IWOTH     00002       其他用户具可写入权限  
  23. S_IXOTH     00001       其他用户具可执行权限  
  24. 摘自《Linux C 函数库参考手册》  

于是我尝试用这样的语句获取权限特征位:

printf("%o %o %o\n", buff.st_mode&S_IRWXU, buff.st_mode&S_IRWXG, buff.st_mode&S_IRWXO);

但得到的输出是700 60 6

于是我把代码写成了这样

printf("%o\n", (buff.st_mode&S_IRWXU)+(buff.st_mode&S_IRWXG)+(buff.st_mode&S_IRWXO));

就得到了正确的结果:766。

这里需要说明的是,貌似C中+号的运算优先级比&高,所以要使用括号来保证按位与运算先进行。