幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: shawind

[关注]Bindings项目开始完善DX库

[复制链接]

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-11-18 14:56:22 | 显示全部楼层
这个时候你需要gdb...有时候觉得在linux上写C程序很郁闷就是一不小心写错了点什么的时候,经常只能看到局Segmentation Fault,什么额外信息都没;Windows上至少还能马上看到crash report...虽然对end-user来说这不算什么好事。D的runtime也是这样,基本上只是给一句Access Violation就没了。这种时候只能靠调试了……
D里能造成Access Violation的东西太多了……例如说这样就会:
  1. void main(char[][] args) {
  2.     char[] message = "Just a simple string.";
  3.     printf("%s", message);
  4. }
复制代码
原因是message不是null-terminated string,这printf会一直跑下去直到Access Violation出现……
在这个问题上可以用printf("%.*s", message)来解决,不过其它很多细微地方也是就这么给一句错误就没了 T T
至少还想看看call-stack dump之类的信息……
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-18 15:26:55 | 显示全部楼层
貌似是某面试题:于是偶做了其他的答案了…………人家怕是笑死这么EASY的问题

printf("%.*s", message) <<-- 完全不懂,下去试验。。。
Style-C
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-18 15:44:26 | 显示全部楼层
找到这个:
.*
The precision is not specified in the format string, but as an additional integer value argument
preceding the argument thas has to be formatted.

依然不会:
wchar_t str[] = L"file bytes-copy. ";
fwprintf_s( stdout, L"%.*s: %s(%d) to %s(%d) with length:%d \\n",
    str, argv[1], offsetsrc, argv[2], offsetdst, lengthneed );
输出错误的结果:
a.txt: (null)(3617892) to (null)(1000) with length:2600
正确的应该是:
file bytes-copy. : a.txt(0) to b.txt(0) with length:0
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-11-18 17:00:28 | 显示全部楼层
还要debug,恩,这个,我去下个gdc和dgdb试试看,故计还是不能成功的可能性较大。

D的字符串数组带来方便的同时,也带来了很多麻烦。
"%.*s"这个怎么说?常见的C教程里好像都没说这个。
wchar_t str[] 这个str还是有结束符号的吧,和D中的不太一样。
我一般都是用toStringz()把D字符串数组转成C风格的char*再用。
え~え~お!!!
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-11-18 17:26:02 | 显示全部楼层
In D, all dynamic arrays look like a struct containing two fields; a length and a pointer to the data. Thus when you pass 'testString' to printf, what gets put on the stack for printf is the struct. Thus printf gets two values - a length and a pointer.
So its as if you had coded ...
  1. printf("%s\\n", testString.length, testString.ptr);
复制代码
So it crashes because printf tries to use the length value as if it was a pointer to a C-string.

The correct way to use D-strings with printf is  ...
  1. printf("%.*s\\n",testString);
复制代码
The '.*' causes printf to use the next parameter as a length and the subsequent one as the data pointer - which is what you actually passed it.
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-11-18 18:57:32 | 显示全部楼层
原来c里面也可以用。只是编译的时候会有警告。
  1. #include <stdio.h>
  2. typedef struct dString
  3. {
  4.     int length;
  5.     char* ptr;
  6. } dString;
  7. int main()
  8. {
  9.     char cs[4] = "test";
  10.     dString ds = {sizeof(cs),&cs};
  11. //    printf("%s \\n",ds);  //error
  12.     printf("%.*s \\n",ds);
  13.     return 0;
  14. }
复制代码
  1. test
复制代码
え~え~お!!!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-11-19 20:17:16 | 显示全部楼层
问题解决。
做了两个改动。SetCooperativeLevel中的句柄参数,从createwindow获得的。转Dsound.d的时候,把GUID_NULL重写了一下。
之前的错误多半就这两个中的一个,懒得再去追究了。
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-20 20:05:54 | 显示全部楼层
提示,如果注意一下偶上次发的文件就可以发现需要适用GetConsoleWindow的Handle,因为用GetActiveWindows无法得到(根据你的情况推)HWND,所以就失败了,问题在于为什么必须要关联一个窗口,像WAVEOUT WAVEIN就没有必要绑窗口了

另外一种方法是创建一个纯消息窗口,在CREATEWINDOW的时候可以指定……
以上
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-11-20 20:17:04 | 显示全部楼层
多半是SetCooperativeLevel的问题吧,com就是麻烦.有了一次经验,就得记住了,句柄这个的东西不是随便用的.
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-22 22:07:39 | 显示全部楼层
个人更加倾向于句柄- -
Style-C
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-3 06:49 , Processed in 0.020283 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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