Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 程序运行显示不正常~~输入之后显示为零

回复:
user: user-1
content: 我想问的是这样改了符合lz的要求吗？具体lz看看吧

user: user-1

user: user-1
content: 我四楼的话 你试了吗

user: user-0
content: 引用 5 楼 u012421456 的回复:其实在相对简单的程序里这些不重要，当然，最好输入2.00额~~什么意思？输入2.00也不行

user: user-0
content: 引用 1 楼 user-5 的回复:你输入2.0试一下啊不成啊~~

user: user-0
content: 引用 2 楼 missheaven2011 的回复:hours 被你定义为 float 类型 scanf("%lf",&hours)，取的是 double类型，再存入hours，导致hours值为 0 可改为 scanf("%f",&hours)  或 double hours；scanf()函数自动把float类型增益成double类型~~所以用%lf~~换成%f也不行啊~~还有其他的错误么？

user: user-2
content: 程序本身是没有问题的，只是输出的时候应该使用%f,%lf是输出双精度浮点型的数。如下 #include<stdio.h> #define BASE 10.00 #define TIME 40.00 #define ADD 1.50 #define RATE1 0.15 #define RATE2 0.20 #define RATE3 0.25 #define LIMIT1 300 #define LIMIT2 450 int main() { 	float tax,gross,hours; 	printf("input the work hours of a week:\n"); 	while(scanf("%f",&hours)==1) 	{ 		if(hours<=TIME) 		{ 			hours=hours; 		} 		else 		{ 			hours=TIME+(hours-TIME*ADD); 		} 		gross=hours*BASE; 		printf("gross income:\t\t%f\n",gross); 		if(gross<=LIMIT1) 		{ 			tax=gross*RATE1; 		} 		else if(gross<=LIMIT2) 		{ 			tax=LIMIT1*RATE1+(gross-LIMIT1)*RATE2; 		} 		else 		{ 			tax=LIMIT1*RATE1+(LIMIT2-LIMIT1)*RATE2+(gross-LIMIT2)*RATE3; 		} 		printf("tax:\t\t%f\n",tax); 		printf("net income:\t\t%f\n",gross-tax); 	} 	printf("Done!\n"); 	return 0; }

user: user-1
content: 引用 14 楼 pokerLee 的回复:[quote=引用 13 楼 u012421456 的回复:] 这个。。。可能吧！ lz这是VC++6.0完整绿色版——http://download.csdn.net/detail/u012421456/6897443，我编译你的程序时用的就是这个，安装很简单，也很快，你可以试试 当然，我建议lz可以先用原来的编译器从新建一个项目、 文件，然后把原来的代码拷到新建的文件里试试（个人见解）谢谢~~错误找到了~~原来是三个printf()里的格式控制符应该改成%f~~谢谢兄台了~~无以为报~~只能给你点分了~~谢谢了~~[/quote] 找到原因就好！惭愧，没帮上多大的忙！ 至于分。。。分什么的最喜欢了

user: user-0
content: 引用 13 楼 u012421456 的回复:这个。。。可能吧！ lz这是VC++6.0完整绿色版——http://download.csdn.net/detail/u012421456/6897443，我编译你的程序时用的就是这个，安装很简单，也很快，你可以试试 当然，我建议lz可以先用原来的编译器从新建一个项目、 文件，然后把原来的代码拷到新建的文件里试试（个人见解）谢谢~~错误找到了~~原来是三个printf()里的格式控制符应该改成%f~~谢谢兄台了~~无以为报~~只能给你点分了~~谢谢了~~

user: user-1
content: 这个。。。可能吧！ lz这是VC++6.0完整绿色版——http://download.csdn.net/detail/u012421456/6897443，我编译你的程序时用的就是这个，安装很简单，也很快，你可以试试 当然，我建议lz可以先用原来的编译器从新建一个项目、 文件，然后把原来的代码拷到新建的文件里试试（个人见解）

user: user-0
content: 引用 11 楼 u012421456 的回复:我想问的是这样改了符合lz的要求吗？具体lz看看吧 我怀疑是编译器的问题~~有可能是编译器的是么？？ 这个是我的运行结果~~

user: user-1
content: 其实在相对简单的程序里这些不重要，当然，最好输入2.00

user: user-1
content: lz把12行的float改成double试试，看那结果是不是你想要的，输入2和2.0好像不影响

user: user-3
content: while(scanf("%f",&hours)==1) 应该涉及到类型提升和截断问题..

user: user-4
content: hours 被你定义为 float 类型 scanf("%lf",&hours)，取的是 double类型，再存入hours，导致hours值为 0 可改为 scanf("%f",&hours)  或 double hours；

user: user-5
content: 你输入2.0试一下啊
user-0 提问: 请教帮忙

回复:
user: user-0
content: 刚才看了个贴子说这样改： 把“project->配置属性->c/c++->代码生成->基本运行时检查 设置为默认值，就没有这样的错误了。关于MSDN的解释是在堆栈外面读写某数据。错误是名为RTC1的编译器检测的。又看了更多的技术文章，发现这样的错误是程序员在项目到了一定大的时候，它占用的堆栈量就比较大。我也深有体会。因为自己本来编写一个类，运行时没有错，但是在添加成员属性的时候，在其它方式不变的情况下就容易发生这样的错误。所以据此我猜应该是VS2005（2008）在内部就限定了堆栈的大小，当项目足够大的时候，就会溢出。 自己改完后，运行了一下，发现拓扑的最后一个数字输出有误，如下图： 本应该是999的，结果变为0了。

user: user-0
content: strcat(ch_qz,str); ///合并 这个确实有问题，请问师兄，这个怎么改啊？谢谢！

user: user-0
content: 谢谢，我试试单步调试。

user: user-1
content: 这个自己单步调试就知道  浏览了一下，下面这句可能有问题。 strcat(ch_qz,str); ///合并
user-0 提问: 这段代码是如何理解

回复:
user: user-1
content: 引用 6 楼 KenZhang1031 的回复:为什么USB0_BDTPAGE3得到的是0？这里tBDTtable没有明确，USB0_BDTPAGE3也是未知的。 [quote=引用 5 楼 lovehuan54 的回复:] [quote=引用 4 楼 KenZhang1031 的回复:] 比如地址是32位的0x12345678，右移8位转uint8就是得到0x56,同理右移16和32位分别得到0x34和0x12，就是把32位地址的高3字节分别取出来. [quote=引用 3 楼 lovehuan54 的回复:] [quote=引用 1 楼 KenZhang1031 的回复:] 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。[/quote][/quote] 恩，这个明白了。 但是对应到这个问题中的代码就不是很理解了，按照这里的运算USB0_BDTPAGE3得到的是0.看来是需要配合实际的场景才能理解了。[/quote][/quote] 对对，是我想错了。

user: user-2
content: 为什么USB0_BDTPAGE3得到的是0？这里tBDTtable没有明确，USB0_BDTPAGE3也是未知的。 引用 5 楼 lovehuan54 的回复:[quote=引用 4 楼 KenZhang1031 的回复:] 比如地址是32位的0x12345678，右移8位转uint8就是得到0x56,同理右移16和32位分别得到0x34和0x12，就是把32位地址的高3字节分别取出来. [quote=引用 3 楼 lovehuan54 的回复:] [quote=引用 1 楼 KenZhang1031 的回复:] 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。[/quote][/quote] 恩，这个明白了。 但是对应到这个问题中的代码就不是很理解了，按照这里的运算USB0_BDTPAGE3得到的是0.看来是需要配合实际的场景才能理解了。[/quote]

user: user-1
content: 引用 4 楼 KenZhang1031 的回复:比如地址是32位的0x12345678，右移8位转uint8就是得到0x56,同理右移16和32位分别得到0x34和0x12，就是把32位地址的高3字节分别取出来. [quote=引用 3 楼 lovehuan54 的回复:] [quote=引用 1 楼 KenZhang1031 的回复:] 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。[/quote][/quote] 恩，这个明白了。 但是对应到这个问题中的代码就不是很理解了，按照这里的运算USB0_BDTPAGE3得到的是0.看来是需要配合实际的场景才能理解了。

user: user-2
content: 比如地址是32位的0x12345678，右移8位转uint8就是得到0x56,同理右移16和32位分别得到0x34和0x12，就是把32位地址的高3字节分别取出来. 引用 3 楼 lovehuan54 的回复:[quote=引用 1 楼 KenZhang1031 的回复:] 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。[/quote]

user: user-1
content: 引用 1 楼 KenZhang1031 的回复:要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。

user: user-0
content: 引用 1 楼 KenZhang1031 的回复:要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。  NB啊，你的理解完全是正确的，刚看了数据手册明白了。

user: user-2
content: 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。
user-0 提问: 关于C读文件strcmp函数比较字符串

回复:
user: user-0
content: 感谢 ，又学到了不少。

user: user-1
content: 因为字符串是以数字0结尾的('\0')。定义短了以后结尾的0被下一个数据姓名冲掉了，计算机在输出时一直输出到姓名结尾的0处才会停

user: user-2
content: 小心中文字符编码

user: user-3
content: 出错原因是struct Student中的char Sno[8]长度不够，要改为char Sno[8+1];  还要修改以下行：   if(L==NULL){ //if(L!=NULL){     printf("电脑空间不足!\n");  Status Search_PutoutStudent(LinkList L){                 //根据学号输出学生的信息   char sno[8+1];//char sno[8];;   Student *s=L->next;//Student *s=L;;    while(s!=NULL && strcmp(s->Sno,sno)) //while(s->next!=NULL && strcmp(s->next->Sno,sno))    printf("学号\t姓名\t性别\t年龄\t系别\n");//printf("学号\t姓名\n性别\t年龄\t系别\n");

user: user-0
content: 为什么字符串定义短了，但是输出时却是学号和姓名连在一起输出了？  大神 求解答！！
user-0 提问: 符合/无符合 匹配

回复:
user: user-1
content: 一般来说, 应该是你的定义去适应它的.

user: user-2
content: //int i; DWORD i;

user: user-3
content: 之所以报警告，应该是SystemInfo.dwNumberOfProcessors是无符号类型的数据变量； 遇到这种情况，建议将i变量变成unsigned类型

user: user-4
content: (int)SystemInfo.dwNumberOfProcessors，在SystemInfo.dwNumberOfProcessors如果很大的情况下有可能溢出，如果这样，i定义成无符号是不是要好些。
user-0 提问: C语言为什么读取不同的输入方式的文本文件排序后输出的结果不一样？问题出在哪里？

回复:
user: user-1
content: 第二个可能最后有空行

user: user-2
content: 全选看看有没有什么不干净的字符……

user: user-2
content: 是不是最后多了个换行？
user-0 提问: 递归调用的问题

回复:
user: user-0
content: 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？

user: user-1
content: t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 引用 3 楼 u013803262 的回复:f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？

user: user-0
content: f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？

user: user-2
content: 这是一个对正数求阶乘的算，每次递归得到f(n-1)对应的阶乘，第n次阶乘等数第n个数乘以n-1之前的阶乘

user: user-0
content: 求讲原理

user: user-0
content: 引用 8 楼 u013803262 的回复:[quote=引用 7 楼 KenZhang1031 的回复:] 比如f(3),第一次遇到3*f(2)，会调用f(2)，遇到2*f(1)，会调用f(1)，又会遇到1*f(0)，会调用f(0)，此时n==0，返回1，返回到f(1)=1*f(0)这层，如此类推层层返回。也就是说从顶层层层递归调用，到最底层时，反过来层层返回，因此递归深度很大时，很耗内存，每层递归都要开辟新的栈帧。 [quote=引用 6 楼 u013803262 的回复:] [quote=引用 4 楼 KenZhang1031 的回复:] t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote][/quote 那就是这种的咯 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote] 谢谢，我懂了

user: user-1
content: 我描述得应该很清楚了啊，是遇到result=n*fact（n-1）去掉用fact(n-1),f(n-2),...,f(1),f(0)，直到n为0，然后f(0)，f(1),f(2),...f(n)一层层的返回。 引用 8 楼 u013803262 的回复:[quote=引用 7 楼 KenZhang1031 的回复:] 比如f(3),第一次遇到3*f(2)，会调用f(2)，遇到2*f(1)，会调用f(1)，又会遇到1*f(0)，会调用f(0)，此时n==0，返回1，返回到f(1)=1*f(0)这层，如此类推层层返回。也就是说从顶层层层递归调用，到最底层时，反过来层层返回，因此递归深度很大时，很耗内存，每层递归都要开辟新的栈帧。 [quote=引用 6 楼 u013803262 的回复:] [quote=引用 4 楼 KenZhang1031 的回复:] t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote][/quote 那就是这种的咯 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote]

user: user-0
content: 引用 7 楼 KenZhang1031 的回复:比如f(3),第一次遇到3*f(2)，会调用f(2)，遇到2*f(1)，会调用f(1)，又会遇到1*f(0)，会调用f(0)，此时n==0，返回1，返回到f(1)=1*f(0)这层，如此类推层层返回。也就是说从顶层层层递归调用，到最底层时，反过来层层返回，因此递归深度很大时，很耗内存，每层递归都要开辟新的栈帧。 [quote=引用 6 楼 u013803262 的回复:] [quote=引用 4 楼 KenZhang1031 的回复:] t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote][/quote 那就是这种的咯 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？

user: user-1
content: 比如f(3),第一次遇到3*f(2)，会调用f(2)，遇到2*f(1)，会调用f(1)，又会遇到1*f(0)，会调用f(0)，此时n==0，返回1，返回到f(1)=1*f(0)这层，如此类推层层返回。也就是说从顶层层层递归调用，到最底层时，反过来层层返回，因此递归深度很大时，很耗内存，每层递归都要开辟新的栈帧。 引用 6 楼 u013803262 的回复:[quote=引用 4 楼 KenZhang1031 的回复:] t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote]

user: user-0
content: 引用 4 楼 KenZhang1031 的回复:t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？
user-0 提问: 十进制转换成16进制的时候出来问题，求帮助，谢谢

回复:
user: user-1
content: 呵呵，容易，字符串转10进制用scanf，再转16进制字串用printf，完事 unsinged int num sscanf(changing,"%u",&num); sprintf(changed,"%x",num);

user: user-0
content: 表示没看懂啊

user: user-2
content: 问题是什么？

user: user-3
content: 再给你个长的。 #include <stdio.h>  int main( ) {     long long a = 1234567890123456789; 	printf( "NonCap = %llx; Cap = %llX.\n", a, a ); 	return 0; }

user: user-3
content: 进制转换这样最方便。 #include <stdio.h>  int main( ) {     int a = 1234567890; 	printf( "NonCap = %x; Cap = %X.\n", a, a ); 	return 0; }
user-0 提问: 杭电1902，输出格式问题？什么意思啊？怎么弄啊？我都错了N遍了。

回复:
user: user-0
content: 怎么没人啊。

user: user-0
content: Sample Input 4 1 2 3 4 5 1 2 3 4 5 0     Sample Output 10 15
user-0 提问: 杭电acm1902题，过不去啊，我是真心不懂，谁来帮帮我个菜鸟。

回复:
user: user-0
content: #include <stdio.h> int main(void) {     int n,sum,a;     while(scanf("%d",&n)==1);     {         if(n!=0)     {         sum=0;        while(n--)        {            scanf("%d",&a);            sum+=a;        }        printf("\n%d",sum);     }      }      return 0; } 改成这样后，我觉得人生都悲剧了。是我还没看懂，对吧。

user: user-0
content: 哦，虽然我还是不太懂我哪里错了，但还是谢谢啦，我去试试。

user: user-0
content: 来人啊~~~~~~~~~~~~~~~

user: user-1
content: //改成这样 #include <stdio.h> int main(void) {     int n,sum,a;     while (scanf("%d",&n) == 1) {     if(n!=0)     {         sum=0;        while(n--)        {            scanf("%d",&a);            sum+=a;        }        printf("%d\n",sum);     }     else     {        break;      } }     return 0; }
user-0 提问: 模块间的函数调用报错

回复:
user: user-1
content: 没将dll编译入你的exe？

user: user-2

user: user-3
content: 戒了吧

user: user-4
content: 接分

user: user-5

user: user-6

user: user-0
content: 我知道了。在项目依赖项和项目生成顺序中的设置。  谁来评论下，我好结贴。
user-0 提问: 汉诺塔

回复:
user: user-1
content: 刚刚说错了...没看懂楼主意思...为什么只能连续输入3层！！！！！！  该说的楼上已经说了，只有第一次需要传入常量，后面的内容，是根据上一次传入的值，然后再按该方法重新排序交换的。所以不能每次都传入常量，这样就没区别了。

user: user-2
content: 引用 6 楼 czarten 的回复:最开始调用的是han(3,'a','b','c');对吧？ 这时在han(int num,char a,char b,char c)里，参数a='a',b='b',c='c' 然后在函数内部又调用了han(num-1,a,c,b);也就是han(num-1,'a','c','b')对吧 好，所以在这一次调用中，对应的参数就是a='a',b='c',c='b'了，明白了吗？  说简单点，不是每次调用都a='a',b='b',c='c'的  如果觉得搞不清楚，把han(int num,char a,char b,char c)改成han(int num,char x,char y,char z)，就比较清楚了  接上，han(int num,char x,char y,char z)这个函数，调用的时候，y可能等于'b'（最初的调用）,y也可能等于'c'（第二次调用），也就是说y等于什么是不一定的，所以要用变量

user: user-2
content: 最开始调用的是han(3,'a','b','c');对吧？ 这时在han(int num,char a,char b,char c)里，参数a='a',b='b',c='c' 然后在函数内部又调用了han(num-1,a,c,b);也就是han(num-1,'a','c','b')对吧 好，所以在这一次调用中，对应的参数就是a='a',b='c',c='b'了，明白了吗？  说简单点，不是每次调用都a='a',b='b',c='c'的  如果觉得搞不清楚，把han(int num,char a,char b,char c)改成han(int num,char x,char y,char z)，就比较清楚了

user: user-1
content: 是const char&

user: user-1
content: 抱歉 看错了  你传什么都无所谓的，但这里用值传递会有拷贝，递归深了也不好，还是用引用吧const char*

user: user-1
content: 引用 2 楼 mousestuman 的回复:我不是楼上这么说的意思，我的问题是递归调用时的实参为什么是变量而不是常量，比如： han(num-1,a,c,b);为什么不能写成han(num-1,'a','c','b'); ？ 请问'a'，‘b’,'c'穿进去，怎么计算？

user: user-0
content: 我不是楼上这么说的意思，我的问题是递归调用时的实参为什么是变量而不是常量，比如： han(num-1,a,c,b);为什么不能写成han(num-1,'a','c','b'); ？

user: user-3
content: void han(int num,const char a,const char b,const char c) {     if(num==1)         printf("%c->%c\n",a,c);     else     {         han(num-1,a,c,b);         printf("%c->%c\n",a,c);         han(num-1,b,a,c);     } } 这是你的意思吗？也许这样更好，表示ABC不能被修改
user-0 提问: error: invalid type argument of '->' (have 'Course') 

回复:
user: user-0
content: 嗯 ，试了一下，确实是点。Thank you!

user: user-1
content: 引用 1 楼 czarten 的回复:sql.elem[sc->Cno]->Ccredit第二个->改成点试试？ 我觉得sql.elem[sc->Cno]应该不是指针类型，而是Course类型吧，用点

user: user-1
content: sql.elem[sc->Cno]->Ccredit第二个->改成点试试？
user-0 提问: 新手学程序

回复:
user: user-1
content: # include <iostream.h> # include <cmath>  int yushu(int x, int y) { 	int k; 	if (x < y) 	{ 		k = x; 		x = y; 		y = k; 	}  	if(x%y == 0) 		return abs(y); 	else     		return yushu(y, x%y);    } int main(void) { 	int x, y, z, t;  	cout<<"请输入x = "; 	cin>>x; 	cout<<"请输入y = "; 	cin>>y; 	z = yushu(x,y); 	t = (x*y) / z; 	cout<<x<<"与"<<y<<"的最小公倍数为："<<t<<endl; 	cout<<x<<"与"<<y<<"的最大公约数为："<<z<<endl;  	return 0; } lz，其实这个你可以搜到的

user: user-2
content: 算法：辗转相除

user: user-3
content: #include <stdio.h> int gcd(int a, int b) { 	if (b == 0)   return a; 	return gcd(b, a%b); } int lcm(int a, int b) { 	return a*b / gcd(a, b); } int main(void) { 	int x, y; 	int GCD, LCM; 	scanf("%d%d", &x, &y); 	GCD = gcd(x, y); 	LCM = lcm(x, y); 	printf("GCD=%d,LCM=%d\n", GCD, LCM); 	return 0; }
user-0 提问: 这是我的代码，问题是我驶入21 11后出现不可想象的问题； 数组里面得出来的数正确，比较两个输出结果 求大神提示

回复:
user: user-1
content: 不是回复你了么？ a[i]=n%m; -> a[i]='0'+n%m
user-0 提问: 用calloc分完内存然后赋值之后再free但是只有2个值没了为什么？怎么能吧4个INT都free了？

回复:
user: user-1
content: 正确理解free的语义。这里是个野指针，行为未定义

user: user-2
content: free是通知操作系统，这地我不用了，你可以拿回去了 操作系统说：“嗯，知道了。”但不会马上就拿走，因为它不急着用 等操作系统需要用这块地的时候，才会拿走

user: user-3
content: #include<stdio.h> #include<malloc.h> int main() { int *pInt,i; pInt=(int*)calloc(4,sizeof(int)); for(i=1;i<5;++i) { *pInt=10*i; printf("%d\n",*pInt); ++pInt; } for(i=1;i<5;++i) { --pInt; } printf("free\n"); free(pInt); int *pp = malloc(10000); memset(pp,0,10000); for(i=1;i<5;++i) { printf("%d\n",*pInt); ++pInt; } getchar(); return 0; }

user: user-3
content: #include<stdio.h> #include<malloc.h> int main() { int *pInt,i; pInt=(int*)calloc(4,sizeof(int)); for(i=1;i<5;++i) { *pInt=10*i; printf("%d\n",*pInt); ++pInt; } for(i=1;i<5;++i) { --pInt; } printf("free\n"); free(pInt); int *pp = malloc(10000); memset(pp,0,10000); for(i=1;i<5;++i) { printf("%d\n",*pInt); ++pInt; } getchar(); return 0; }

user: user-3
content: #include<stdio.h> #include<malloc.h> int main() { int *pInt,i; pInt=(int*)calloc(4,sizeof(int)); for(i=1;i<5;++i) { *pInt=10*i; printf("%d\n",*pInt); ++pInt; } for(i=1;i<5;++i) { --pInt; } printf("free\n"); free(pInt); int *pp = malloc(10000); memset(pp,0,10000); for(i=1;i<5;++i) { printf("%d\n",*pInt); ++pInt; } getchar(); return 0; }

user: user-4
content: 1.free()只是说p指向的内存是无用的(系统收回了此段内存),在free时,通常并不同时释放进程占用的内存页,相反,它仅仅将这部分内存在malloc内部结构中标记为可再分配. 2.要明白free动作,它只是告诉系统,这块内存我(当前进程)使用完毕,可以收回并分配给其他进程使用.这里有两点:它不改写里面的值,所以,在一定的几率下,free后依然可以获得原来的值。 3.calloc()函数用来分配一个能容纳n个元素,每个元素长度为size的内存空间 4.函数calloc() 会将所分配的内存空间中的每一位都初始化为零

user: user-5
content: 其实你用malloc测试也是一样的。 这并不是释放不完全，而是释放的内存没有填充别的内容，所以保存的是原来的状态，本质上在堆中已经认为是释放过的了，以后分配时可以再分配到这段空间中的。

user: user-6
content: 要纠正一个观念，free并不带代表清空内存，而是通知操作系统该段内存已经不被占用了，可以重新进行分配了。所以，free之后该段内存的内容已经是一个未定义的，可能跟以前相同也可能不同，毫无意义。
user-0 提问: 请教前辈一个小问题

回复:
user: user-1
content: 2楼正解。 在main函数开始就调用函数得到系统时间，然后就printf(....);出来

user: user-2
content: 引用 1 楼 czarten 的回复:自己printf呀 是不是lz想输出系统时间啊——http://zhidao.baidu.com/link?url=WxGArTK3V6Fr4PRh8MlnpYIyfHIt_q24SCLQ9JNj0rv3qs5EZUQa5-sT9aFesxwA4BCvs6G8AKiyNXRPrUKvoq

user: user-3
content: 自己printf呀
user-0 提问: 行编辑器——getchar()的小问题么？

回复:
user: user-0
content: 引用 1 楼 xiayuanzhong 的回复:- 若这里去掉&& ch != '\n',不是应该可以接受多行了么？ - 是的，如果去掉'\n'就需要用Ctrl+Z来判断输入结束。原来如此，是先回车再Ctrl+Z最后再回车，非常感谢

user: user-1
content: - 若这里去掉&& ch != '\n',不是应该可以接受多行了么？ - 是的，如果去掉'\n'就需要用Ctrl+Z来判断输入结束。
user-0 提问: 文字排序问题

回复:
user: user-1
content: 应该是分词吧？ 首先你得定义一个词典

user: user-2
content: //把“海中上国”排列成“中国上海”的形式输出 #include <stdio.h> #include <locale.h> int main() {     _wsetlocale(LC_ALL,L"chs");     wprintf(L"%c%c%c%c\n",L"海中上国"[1],L"海中上国"[3],L"海中上国"[2],L"海中上国"[0]);     return 0; } //中国上海 //

user: user-3
content: 数组的查找？ 栈？

user: user-4
content: 难道是移动字符??

user: user-4
content: 估计是出栈入栈吧 要不队列
user-0 提问: 弱弱地问一个很简单的问题

回复:
user: user-0
content: 楼上的各位，太感谢了~~

user: user-1
content: 按照4楼的程序就可以，不过一般计数建议使用static静态变量

user: user-2
content: 引用 5 楼 haolly 的回复: while(i<MAXSIZE) INPUT list.a[i]; i++  你的size是什么？ 你说我的吗？size记录输入的次数

user: user-3
content: while(i<MAXSIZE) INPUT list.a[i]; i++  你的size是什么？

user: user-2
content: 仅供参考 #include <stdio.h> #define MAXSIZE 100 typedef int datatype; typedef struct { 	datatype a[MAXSIZE]; 	int size; }sequence_list; int main() { 	sequence_list se; 	se.size=0; 	while(se.size<MAXSIZE) 	{ 		scanf("%d",&se.a[se.size]); 		se.size++; 	} 	return 0; }

user: user-4
content: 再给你推荐一篇博文更加有助于你理解：链接如下 http://blog.csdn.net/hackbuteer1/article/details/6706562

user: user-4
content: 呵，没看懂你到底要问什么？ 对你的 typedef int datatype 表示不解。你要问的是一个关于结构体和链表么？

user: user-5
content: #include <stdio.h> #include <stdlib.h>  int main(void) {     char  array[32];          int  ch;     int   i = 0;          while ((ch = getchar()) != EOF)     {         array[i] = ch;         ++i;     }          if (array[--i] == '\n')     {         array[i] = '\0';     }          fprintf(stderr, "%s  %d\n", array, i);          system("pause");  } 你可以在输入最后输入一个回车 然后在Windows下按CTRL+Z键 即可停止输入 如果不想保留最后的\n可以去掉 而如果仅仅是输入一行不会保留换行则可以在while判断里加入 (ch = getchar()) != '\n'的判断
user-0 提问: 怎么解？

回复:
user: user-1
content: lz要不看看这个——http://bbs.csdn.net/topics/10250801 看能有启发不

user: user-2
content: 算法没有发现问题，main没有类型没有返回值，可能会报个警告或错误。建议： int main() {      return 0; }

user: user-3
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-4
content: t是f（a，8）的返回值 int型  可以和 int数组元素比较 递归求数组最大值的一种方法

user: user-5
content: 引用 4 楼 u013803262 的回复:[quote=引用 3 楼 u010957746 的回复:] return t>a[n-1]? t:a[n-1]; 这是什么情况？ 在那个return t>a[n-1]? t:a[n-1] t是f（a，8）怎么和数组元素比较？[/quote]  首先，这个代码是递归。和你之前问的问题类似。代码的实现目的是取数组的最大值。 然后，f(a,8)就是返回的数组元素的int值，当然可以和数组元素比较。 可以这样想，f(a,8)的返回值是f(a,7)和a[7]的取大；f(a,7)的返回值是f(a,6)和a[6]的取大；……而f(a,1)就直接是a[0]了。 从f(a,1)的返回值一路返回回去，就完成了对数组取大的目标

user: user-6
content: 引用 4 楼 u013803262 的回复:[quote=引用 3 楼 u010957746 的回复:] return t>a[n-1]? t:a[n-1]; 这是什么情况？ 在那个return t>a[n-1]? t:a[n-1] t是f（a，8）怎么和数组元素比较？[/quote]仔细又看了下，没看懂。

user: user-0
content: 引用 3 楼 u010957746 的回复:return t>a[n-1]? t:a[n-1]; 这是什么情况？ 在那个return t>a[n-1]? t:a[n-1] t是f（a，8）怎么和数组元素比较？

user: user-6
content: return t>a[n-1]? t:a[n-1]; 这是什么情况？

user: user-7
content: 参考：http://bbs.csdn.net/topics/390720294

user: user-0
content: 在那个return t>a[n-1]? t:a[n-1] t不是等于f(a,8)么怎么和a【8】这个数组值比较？
user-0 提问: 指针字符用scanf函数接收之后，printf函数输出会报错

回复:
user: user-1
content: 总体错误就是没有分配空间。具体细节及原因是这样的 char *str="123";属于一个字符指针，这个等式的含义是为 把字符常量“123”的首地址赋值给 字符指针变量。 你想啊，既然是常量，怎么能用scanf 呢，因为常量是不允许 进行 写的操作的，只能进行读的操作。 所以没有给str 分配空间。 建议你使用malloc 函数 为你的str 分配内存 具体语句：str=（char *）malloc(sizeof(char)*100); 之后再用scanf("%s",str); 个人拙见，大神无喷。

user: user-2
content: char *str; 改为 char str[1024]={0};

user: user-3
content: 指针未分配空间

user: user-4
content: 给str1赋值内存空间就好了，

user: user-5
content: 你的指针都没分配空间，直接赋值当然会crash了
user-0 提问: if与else if的条件范围

回复:
user: user-0
content: 已经解决了。。是输入的问题。。代码没问题。。谢谢大家了

user: user-1
content: 引用 2 楼 ronixy 的回复:输入数据是没有负数的，但是当输入一个L1到L2之间的数时，有时候会return INF，输入大于L3的数时，有时候会return C2，不是应该顺序执行吗，怎么会随便return呢？  别“有时候”呀，输入相同输出总相同吧，你给一组有问题的输入看看 另外L1，L2，L3是不是固定值？会不会出现L3<L2之类的？

user: user-2
content: DSD DSAFDFDF

user: user-0
content: 输入数据是没有负数的，但是当输入一个L1到L2之间的数时，有时候会return INF，输入大于L3的数时，有时候会return C2，不是应该顺序执行吗，怎么会随便return呢？

user: user-3
content: else那边L有可能小于0  引用 楼主 ronixy 的回复:if(L > 0 && L <= L1)          //    if(L > 0 && L <= L1)            return C1;                //        return C1;     else if(L > L1 && L <= L2)    //    else if(L <= L2)         return C2;                //       return C2;     else if(L > L2 && L <= L3)    //    else if(L <= L3)         return C3;                //       return C3;     else                          //    else         return INF;               //        return INF;  为什么左边正确右边错误？

user: user-4
content: 首先L1<L2<L3 在这个前提下，如果还有问题，建议跟踪下。
user-0 提问: 求能正确运行的程序

回复:
user: user-1
content: 目测楼主不小心按了shift。。。倒数第二行 printf("%d!=%ld",n,y); }

user: user-2
content: 倒数第二行那个分号是个中文分号

user: user-3
content: # include <stdio.h>  long fac(int n) { 	long mul; 	int i; 	for(i=1; i<=n; i++); 	{ 		if(n == 0) 			mul = 1; 		else 			mul = n*fac(n-1); 		return mul; 	} }  void main() { 	long y; 	int n; 	scanf("%d", &n); 	y = fac(n); 	printf("%d != %ld", n, y);  //这一行的 ）和 ；都是全角，改为半角即可 }
user-0 提问: 求助~~~DHCP源码增加自己的option

回复:
user: user-1
content: 问题解决了吗？我刚好在源码中添加了自己的option

user: user-2
content: 楼主把源码分享一下，谢谢

user: user-3
content: 引用 8 楼 hey_girl_ 的回复:[quote=引用 7 楼 derekrose 的回复:] 有没有试试search一下这些数据在哪里被用到 https://fossies.org/dox/dhcp-4.2.6/tables_8c_source.html 在这个网址，可以搜索代码里的一些关键字，可是，还没找到有用的函数[/quote]

user: user-0
content: 引用 7 楼 derekrose 的回复:有没有试试search一下这些数据在哪里被用到 https://fossies.org/dox/dhcp-4.2.6/tables_8c_source.html 在这个网址，可以搜索代码里的一些关键字，可是，还没找到有用的函数

user: user-3
content: 有没有试试search一下这些数据在哪里被用到

user: user-0
content: 引用 4 楼 derekrose 的回复:option option-name code option-code = option-type; The option-name must be unique from server defined options and consist of alphanumeric characters and “-“. The option-code is typically between 128 and 254. Supported option-types include boolean, integer, string, text and IPv4 or IPv6 address, and domain list, as well as arrays, records, and encapsulation. 额。。这个我也有看到，可是这只是option的格式，并不是处理option的函数。 而且在\dhcp-4.2.6\common\tables.c文件里，有每个option的定义，可是，我不知道在哪处理这些数据

user: user-0
content: 引用 3 楼 hey_girl_ 的回复:[quote=引用 楼主 hey_girl_ 的回复:] 大神们，有木有研究过DHCP源码的，我想在dhcp协议中，加入一条自定义的option，该怎么做？！ 一直在看源码，可惜，本人愚钝，一直木有找到处理option的函数。。。。。 请问，请问你知不知道类似的函数[/quote] 额。。这个我也有看到，可是这只是option的格式，并不是处理option的函数。 而且在\dhcp-4.2.6\common\tables.c文件里，有每个option的定义，可是，我不知道在哪处理这些数据

user: user-3
content: option option-name code option-code = option-type; The option-name must be unique from server defined options and consist of alphanumeric characters and “-“. The option-code is typically between 128 and 254. Supported option-types include boolean, integer, string, text and IPv4 or IPv6 address, and domain list, as well as arrays, records, and encapsulation.

user: user-0
content: 引用 楼主 hey_girl_ 的回复:大神们，有木有研究过DHCP源码的，我想在dhcp协议中，加入一条自定义的option，该怎么做？！ 一直在看源码，可惜，本人愚钝，一直木有找到处理option的函数。。。。。 请问，请问你知不知道类似的函数

user: user-0
content: 一直在看源码，可惜，本人愚钝，一直木有找到处理option的函数。。。。。 请问，请问你知不知道类似的函数

user: user-4
content: 看源码，找到已有的option怎么处理的，依葫芦画瓢。
user-0 提问: 金字塔图案

回复:
user: user-1
content: lz可以看看这两个——http://zhidao.baidu.com/link?url=AdCD1ete2ad88SR37SeSNvgLDhfVwecoLMy7BZmlFo1lz8IkM1goFjwAGubKv4NA2yX-BSwyXj0aP-jsCZ2C-a http://bbs.csdn.net/topics/390699220

user: user-1
content: 引用 楼主 u013391418 的回复:我想知道怎么能随意变行数 lz的意思是想知道答案是怎么输出的？
user-0 提问: 这段代码哪出问题了？编译完执行不了

回复:
user: user-0
content: 引用 4 楼 huoqingna2332 的回复:你定义的str是const类型的，你的初始化不正确，因为const char是不允许被修改的。   所以异常抛出 是在strcyp(s,t) 这个语句抛出的异常。   你可以改成  char *str="abcde123fgh8"; char test[1024]; memset(test, 0, sizeof(test)); strcpy(test, str); deldigit(test); 非常感谢，这个也可以

user: user-0
content: 引用 3 楼 zhuobattle 的回复: //问题出在这里 char *str="abcde123fgh8";//字串是存在静态数据存储区的， //不能修改,要改成如下形式 char str[20] ="abcde123fgh8";  deldigit(str); 非常谢谢，对于这个变量定义出来是静态的这个我真不知道。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！ 这个确实比较另类的方法

user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！ 赵老师不要误人子弟啊

user: user-2
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-3
content: 你定义的str是const类型的，你的初始化不正确，因为const char是不允许被修改的。   所以异常抛出 是在strcyp(s,t) 这个语句抛出的异常。   你可以改成  char *str="abcde123fgh8"; char test[1024]; memset(test, 0, sizeof(test)); strcpy(test, str); deldigit(test);

user: user-4
content: //问题出在这里 char *str="abcde123fgh8";//字串是存在静态数据存储区的， //不能修改,要改成如下形式 char str[20] ="abcde123fgh8";  deldigit(str);

user: user-5
content: printf(“%s” ,s);

user: user-5
content: printf(“%s”, t);
user-0 提问: 如何用C语音修改文件内容

回复:
user: user-1
content: 提醒：无fopen(...,"...b")不用fseek！  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: if(isXiao(ch)) { 	ch -= 32; 	fseek(fp, -1,SEEK_CUR); 	fputc(ch,fp); 	fseek(fp, 0,SEEK_CUR); }

user: user-3
content: 可以在写入之前使用fseek(fp, -1,1);

user: user-3
content: 因为你在文件中读取一个字符后文件位置向后移动了一个字符，再写的时候是把下一个字符替换了，你应该把文件位置向前移动一个字符

user: user-4
content: 1. 如果没记错，fgetc执行后，文件操作的位置已经移位了，需要使用fseek移回去，然后再写入数据。 2. 小写转大写可以使用strupr。 3. 建议把文件所有数据都读出来，使用strupr转大写，再把文件操作位置移动到开头， 再把转换后的数据写入。

user: user-0
content: 引用 4 楼 u013797412 的回复:if(isXiao(ch)) { 	ch -= 32; 	fseek(fp, -1,SEEK_CUR); 	fputc(ch,fp); 	fseek(fp, 0,SEEK_CUR); } 谢谢指点，还帮我改出个错误。

user: user-0
content: 引用 6 楼 user-5 的回复:如果是对一个文件又读又写，注意读写的位置。 建议搞两个文件，一个读，一个写，简单点。  FILE * src = fopen("org.dat", "r"); FILE * dst = fopen("org.dat.tmp", "w"); char c; while ((c = fgetc(src)) != EOF) {   if (islower(c))     c += 32;   fputc(c, dst); } fclose(src); fclose(dst); rename("org.dat.tmp", "org.dat"); 谢谢指点，这种方法可以。

user: user-5
content: 如果是对一个文件又读又写，注意读写的位置。 建议搞两个文件，一个读，一个写，简单点。  FILE * src = fopen("org.dat", "r"); FILE * dst = fopen("org.dat.tmp", "w"); char c; while ((c = fgetc(src)) != EOF) {   if (islower(c))     c += 32;   fputc(c, dst); } fclose(src); fclose(dst); rename("org.dat.tmp", "org.dat");
user-0 提问: fprinf不能输出

回复:
user: user-1
content: 你的打开方式是二进制，所以输出要用fwrite才行。 如果打开使用的是""w+""，就可以输出了。

user: user-2
content: 读操作后进行写操作，或者写操作后进行读操作，中间必须用fseek隔开
user-0 提问: 中缀表达式转化为后缀表达式，出现错误，多次查找未果，遂求有人解决一哈

回复:
user: user-1
content: else if('#'==c) 		{ 			break; 		} 		else 		{ 			printf("出错：输入格式错误\n"); 			return -1;  		} 		scanf("%c",&c);//错误 	}

user: user-2
content: 不能自己Debug吗？ 比如简单的3+2

user: user-0
content: 输入中缀表达式后不能输出后缀表达式
user-0 提问: MFC ini文件 

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:#井号可以注释 哦 ;分号也可以谢谢

user: user-1
content: #井号可以注释 哦 ;分号也可以

user: user-0
content: 引用 1 楼 user-1 的回复:“ ;this is a exercise about ini file  ” 这三行,不需要,你可以试试会不会出错  只需要这三行 [connection] ip=192.168.11.2 port=9999嗯，双引号是没有的，ini文件不是可以有注释吗，;不是它的注释行开始标志吗

user: user-1
content: “ ;this is a exercise about ini file  ” 这三行,不需要,你可以试试会不会出错  只需要这三行 [connection] ip=192.168.11.2 port=9999
user-0 提问: 嵌入式中 以下代码 是否必须？

回复:
user: user-1
content: 对于认为可以有可以无的代码，建议反汇编看看。

user: user-2
content: volatile都没说个球。

user: user-3
content: 引用 7 楼 nadleeh123 的回复:[quote=引用 楼主 u013797574 的回复:] void lcd_data_byte(char a) {char z = a; CARRY = 0;  lcd_data((a>>4)&0x0f);   a = z;               //防止a被改变， a在什么情况下会改变呢？  lcd_data(a&0x0f);  }  如注释，如果在嵌入式编程当中，这样的操作可否省略，如果不可省略，那a在什么情况下会改变呢？  嵌入式中位运算典型的是在操作寄存器，这段代码类似于从A状态到B状态，然后再回到A状态。保存一下是必须的。[/quote]这个说法比较靠谱

user: user-4
content: 如果 所谓的a 被改变指的是  怕函数lcd_data 改变参数a的值 那就只是多虑 基础没学好的节奏

user: user-5
content: 引用 楼主 u013797574 的回复:void lcd_data_byte(char a) {char z = a; CARRY = 0;  lcd_data((a>>4)&0x0f);   a = z;               //防止a被改变， a在什么情况下会改变呢？  lcd_data(a&0x0f);  }  如注释，如果在嵌入式编程当中，这样的操作可否省略，如果不可省略，那a在什么情况下会改变呢？  嵌入式中位运算典型的是在操作寄存器，这段代码类似于从A状态到B状态，然后再回到A状态。保存一下是必须的。

user: user-6
content: 看这段代码突然想起了程序员经典注释的一条：本行代码神奇勿动  想到一种可能性，就是在嵌入式设备中，如果设置了优化选项，默认传递参数会采用寄存器而不是栈。这里的a是传递参数，在实际操作过程中，如果lcd_data对寄存器进行了操作（假设lcd_data是内联函数）或者有多次寄存器缓冲过程，则可能导致a的值转变。不过显然是lcd_data函数不过关，不应该在这里做防御。

user: user-7
content: 很明确告诉LZ: 这些是垃圾代码 如果a是一个全局变量，那么这么做是很有必要的，但现在a是一个参数。 很明显这是一个新手在模仿老代码的写作风格，但又没搞懂全局变量和参数的区别。

user: user-8
content: 有一种可能：在执行这个函数时发生了高优先级的中断，在堆栈中改变了a的值 这种操作感觉很像黑客，一般程序不会这样做的

user: user-9
content: 不会变，可以去掉。

user: user-10
content: 按c语言来说，不会变。原作者是大拿么？他可能多虑了

user: user-11
content: 也许是延时的

user: user-12
content: 多此一举  z = a;   a = z;  z 毫无用处

user: user-13
content: 看你优化等级　呵呵  我纳闷是什么ＬＣＤ模块，写数据怎么半字节的写呢？

user: user-14
content: 你这个代码看不出，跟具体的硬件相关，从这个函数来看，a,z都是局部变量，存在栈中，一般不会改变。
user-0 提问: C语言动画设计

回复:
user: user-1
content: 参考http://www.hur.cn/Soft/2011/12113.html  引用 楼主 u013823819 的回复:求C语言动画程序，在tc2.0下可运行，课程设计用，谢谢啦。

user: user-2
content: 去图书馆查。

user: user-3
content: LS+1

user: user-4
content: http://bbs.csdn.net/topics/340152354
user-0 提问: C语句 可以出现的位置

回复:
user: user-0
content: 谢谢楼上各位的回复！   我查了些资料，没有找到具体的定义，不知道标准里有没有。   测试后发现在函数之外，只能有声明和初始化。访问变量的语句即使放在大括号{}之内，即块内部也是不行的。编译器认为是在声明变量，报 expected a declaration 的错误。   以前没想过这些问题，恰好昨天遇到了。

user: user-1
content: 引用 5 楼 u013194225 的回复:一个很有意思的现象,b 不定义数据类型,也可使用. #include <stdio.h>  int a[10]= {0,10}; b=20;//  gcc -std=c99     warning: type defaults to 'int' in declaration of 'b' [enabled by default]| // a[1]=10; int main(void) {     a[1]=10;//     for(int i=0; i<10; i++)     {         printf("%d\n",a[i]);      }     printf("%d\n",b);     return 0; } 没办法，C的历史遗留问题太多了

user: user-2
content: 一个很有意思的现象,b 不定义数据类型,也可使用. #include <stdio.h>  int a[10]= {0,10}; b=20;//  gcc -std=c99     warning: type defaults to 'int' in declaration of 'b' [enabled by default]| // a[1]=10; int main(void) {     a[1]=10;//     for(int i=0; i<10; i++)     {         printf("%d\n",a[i]);      }     printf("%d\n",b);     return 0; }

user: user-3
content: unsigned int a[10] = {0, 10};   void main(void) {   }

user: user-4
content: 语句都得放在块内部  有限制的

user: user-5
content: 引用 楼主 chu_ge 的回复:#include"xxxx.h"  unsigned int a[10]; a[1]=10;  void main(void) {   }     如上的一段测试程序，会报语法错误，是不是因为a[1]=10;语句不会执行到？ C语言似乎对语句能出现的位置没有限制，有没有人对这个点比较熟悉的解释一下，谢谢了。 c的语句都必须位于函数内，a[1]=10;已经位于函数外了，这个是不正确的，放到main函数里面。

user: user-6
content: 报的什么错误
user-0 提问: socket 的recv函数返回0

回复:
user: user-1
content: 引用 7 楼 anfaee 的回复:[quote=引用 4 楼 luotuo44 的回复:] 返回0说明断开了连接，要先调用close，再重新连接  调用close(socket);关闭后再重亲连接会提示"Bad file descriptor" ！[/quote] close后要再次socket，才能调用connect

user: user-2
content: close之后再创建一个新的socket啊。

user: user-3
content: 学习了、顺带领分

user: user-0
content: 引用 3 楼 yanran_hill 的回复:1 服务器端修改一下代码,去白度一下setsockopt SO_REUSEADDR 2 recv返回0以后,要调用close(...)  服务端的代码是别人已经做好的不能改，调用close(socket);关闭后再重亲连接会提示"Bad file descriptor" ！

user: user-0
content: 引用 4 楼 luotuo44 的回复:返回0说明断开了连接，要先调用close，再重新连接  调用close(socket);关闭后再重亲连接会提示"Bad file descriptor" ！

user: user-0
content: 引用 2 楼 neustar1 的回复:关闭套接字，重新连接  调用了 shutdown(socket, SHUT_RDWR); close(socket); 后在连的话提示"Bad file descriptor"

user: user-4
content: 现象：说明服务器主动断开了客户端的连接 客户端应该调用close关闭，然后再连接  原因： 服务器主动关闭，会进入WAIT_TIME状态，需要等待2MSL的时间，导致客户端重连出现“Transport endpoint is already connected”  也可以在服务器端设置端口重用 setsockopt SO_REUSEADDR

user: user-1
content: 返回0说明断开了连接，要先调用close，再重新连接

user: user-5
content: 1 服务器端修改一下代码,去白度一下setsockopt SO_REUSEADDR 2 recv返回0以后,要调用close(...)

user: user-6
content: 关闭套接字，重新连接

user: user-7
content: 用异步套接字吧
user-0 提问: 文件数据操作

回复:
user: user-1
content: 1.文件头应该记录下数据条数，和每条数据的起始地址表 2.读取第一条数据后，数据条数减一，和修改起始地址表 3.读取最后一条后，数据条数减一即可了 4.具体细节问题，debug

user: user-2
content: 实在不明白楼主要问啥，你读数据的话，那就调用fread或者fscanf读呗，从末尾读，顶多就是加个fseek，你删除数据到底是想把它从文件删除，还是想怎么的啊？如果是想从文件删除，两种方式，一种是文件加载到内存进行处理，处理完再回写到文件中。或者建一个临时文件，临时缓存数据。
user-0 提问: 我是大一c语言初学者，想学高级语言，但是在vc6.0中显示不存在

回复:
user: user-1
content: graphics.h和高级语言有什么关系？何况那个库不能用在现代系统上。 你想画图？可以看看GD、Cairo、SDL库。或者干脆看看那些图形界面库，比如Qt、Gtk；或者干脆直接用windows API。

user: user-2
content: http://www.easyx.cn

user: user-3
content: 笑到最后的，都是那些能坚持下来的

user: user-4
content: 引用 楼主 u013821760 的回复:问问大神，我该怎么半 既然是初学者，干嘛不先把c学好，别看着别人能用vc做几个条条框框就感觉自己弱爆了么，淡定的学下去，慢慢的你就会发现，其实你已经走在他们前面了。。。

user: user-5
content: 亲，技术也要与时进步。  学GUI, LINUX 下建议QT/DirectFB Windows下建议直接GDI/GDI+或者.net。

user: user-6
content: 引用 10 楼 M_o_n_e_y 的回复:[quote=引用 4 楼 dbzhang800 的回复:] [quote=引用 楼主 u013821760 的回复:] 问问大神，我该怎么半 如果真想学的话，第一步应该是  丢掉你看的这种书，丢掉VC6[/quote]我还想请教：如何去掉，做到什么样的程度才算有资格用IDE。谢谢[/quote] 我是对IDE这种东西深恶痛绝，尤其微软的！！！

user: user-7
content: 无论你看的书,还是你用的编译器都是20年前的老古董了.

user: user-8
content: http://download.csdn.net/download/jiyanmoyu/928446

user: user-9
content: 前期先把语言基础打好...!

user: user-10
content: 引用 4 楼 dbzhang800 的回复:[quote=引用 楼主 u013821760 的回复:] 问问大神，我该怎么半 如果真想学的话，第一步应该是  丢掉你看的这种书，丢掉VC6[/quote]我还想请教：如何去掉，做到什么样的程度才算有资格用IDE。谢谢

user: user-10
content: 引用 4 楼 dbzhang800 的回复:[quote=引用 楼主 u013821760 的回复:] 问问大神，我该怎么半 如果真想学的话，第一步应该是  丢掉你看的这种书，丢掉VC6[/quote]是滴。

user: user-11
content: 引用 1 楼 N_sev7 的回复:graphics.h 是TC里面的图形库，如果要用的话应该用TC来编译，VC++有他自己的另外图形库。                                                                     ---摘自《百度百科》 一楼正解！ 我也是个新手，从我个人的角度看，建议你学C语言看郝斌老师的视频，学VC可以看孙鑫的视频，这是地址——郝斌（http://www.xuexi111.com/jiaocheng/shipin/26243.html），孙鑫（http://club.topsage.com/thread-156290-1-1.html） lz可以先看看简单介绍

user: user-12
content: 引用 1 楼 N_sev7 的回复:graphics.h 是TC里面的图形库，如果要用的话应该用TC来编译，VC++有他自己的另外图形库。                                                                     ---摘自《百度百科》 TC就是Turbo C++。

user: user-8
content: 凉伴......

user: user-13
content: easyx贴吧置顶帖里的绿色版vc6内置easyx的...

user: user-14
content: 引用 楼主 u013821760 的回复:问问大神，我该怎么半 如果真想学的话，第一步应该是  丢掉你看的这种书，丢掉VC6

user: user-15
content: 而且高级语言跟图形有毛关系

user: user-15
content: 百度 easyX  或者  炮姐写的ege 里面的图形库头文件就是这个

user: user-16
content: graphics.h 是TC里面的图形库，如果要用的话应该用TC来编译，VC++有他自己的另外图形库。                                                                     ---摘自《百度百科》
user-0 提问: 求一道算法题，c语言

回复:
user: user-1
content: 填充法？一层一层往里面填 一直填到外围最小的层数为止，看看填了多少数

user: user-2
content: 最外围的扩容，里面的是填充，用最大的数组成外围，其余的填充里面的的空间 设数组维度为M*N ， 组成外围的2*（M+N-2）中最小的数为 H ，其余的小数字之和为 S 所以，储水量为： V（M,N） = H*（M-2）*（N-2） - S

user: user-3
content: 哎 不对 不能这么做

user: user-3
content: 最小值 + 1 直到 漏水  +了多少次 1 就是能保留多少单位的水

user: user-4
content: 楼主又来了，这道题不简单啊
user-0 提问: 标准输出重定向问题

回复:
user: user-1
content: 1. 要检查函数的返回值 2.使用write而不是printf #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <string.h>  int main(void) {   int fd = open("log.txt",O_CREAT|O_RDWR),outfd;   if(fd == -1)   {     perror("");   }   outfd = dup(STDOUT_FILENO);   int fd2 = dup2(fd,STDOUT_FILENO);   if(-1 == fd2)   {     perror("");   }   write(STDOUT_FILENO, "Hello world!\n",13);   //printf("Hello world!\n");   fd2 = dup2(outfd,STDOUT_FILENO);   if(-1 == fd2)   {     perror("");   }   write(STDOUT_FILENO, "Freopen STDOUT_FILENO!\n", strlen("Freopen STDOUT_FILENO!\n"));   //printf("Freopen STDOUT_FILENO!\n");   return 0; }

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout);

user: user-3
content: printf函数会使用stdout这个FILE指针。把而FILE结构里面有一个成员指向了输出文件描述符，把这个输出文件描述符修改就可以完成printf的重定向了。及时fflush也是很重要的。  引用 2 楼 luotuo44 的回复: int main() {     int fd;     fd = open("log.txt", O_CREAT|O_RDWR);     fileno(stdout) = fd;     printf("Hello world!\n");     fflush(stdout);       fileno(stdout) = STDOUT_FILENO;     printf("Freopen STDOUT_FILENO!\n");      return 0; }

user: user-3
content: int main() {     int fd;     fd = open("log.txt", O_CREAT|O_RDWR);     fileno(stdout) = fd;     printf("Hello world!\n");     fflush(stdout);       fileno(stdout) = STDOUT_FILENO;     printf("Freopen STDOUT_FILENO!\n");      return 0; }

user: user-4
content: 首先楼主你的标题是重定向，可是内容却没有一点关于重定向的，重定向是用freopen高数的， 是freopen(“文件名”，“w",stdout);可以重定向。但是你又不是全部的把printf写到文件里，所以你不用重定向，用文件就能做做到 FILE *f if(f=fopen("data.txt","w")==NULL)     printf("文件没打开”)； 然后就能写到文件里了
user-0 提问: 99乘法表 指针和数组问题

回复:
user: user-1
content: char * [9][9] 就是9 * 9个char

user: user-0
content: 引用 1 楼 uuuououlcz 的回复: typedef void (*pFun)(char* arr[9][9]); void dojob(pFun f, char* arr[9][9]) {     f(arr); } void init(char* arr[9][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j < 9; ++j){             arr[i][j] = (char*)malloc(7);             sprintf(arr[i][j], "%d*%d=%d", i+1, j+1, (i+1)*(j+1));         }     } } void print(char* arr[9][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j < 9; ++j) puts(arr[i][j]);     } } void clear(char* arr[9][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j < 9; ++j) free(arr[i][j]);     } }   2楼的朋友讲下char* [9][9]是怎么理解的呢

user: user-2
content: typedef void (*pFun)(char* arr[9][9]); void dojob(pFun f, char* arr[9][9]) {     f(arr); } void init(char* arr[9][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j < 9; ++j){             arr[i][j] = (char*)malloc(7);             sprintf(arr[i][j], "%d*%d=%d", i+1, j+1, (i+1)*(j+1));         }     } } void print(char* arr[9][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j < 9; ++j) puts(arr[i][j]);     } } void clear(char* arr[9][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j < 9; ++j) free(arr[i][j]);     } }

user: user-3
content: for i in range(1,10)     for j in range(1,i+1)         print "%d*%d=%d " %(i,j,i*j),     print

user: user-0
content: 大家都很给力，那么我要结贴了，谢谢大家踊跃的解决问题~

user: user-4
content: 错了，是一楼

user: user-4
content: /* 基于二楼的三角版 */ #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef void (*pFun)(char* a[][9]); void dojob(pFun f, char* a[][9]) {     f(a); }  void init(char* a[][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j <= i; ++j){             a[i][j] = (char*)malloc(8);             sprintf(a[i][j], "%d*%d=%d", i+1, j+1, (i+1)*(j+1));         }     } } void print(char* a[][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j <=i; ++j){ 			if(j>1) printf(" "); 			printf("%-6s",a[i][j]); 		} 		printf("\n");     } } void clear(char* a[][9]) {     int i, j;     for(i = 0; i < 9; ++i){         for(j = 0; j <=i ; ++j) free(a[i][j]);     } }  int main(void) {  	char * c[9][9]; 	 	dojob(init, c); 	dojob(print,c); 	dojob(clear,c); 	 	return 0; }
user-0 提问: 短小精悍，不知问题在哪儿，路过的大神进来看看，拜托！万分感谢

回复:
user: user-1
content: while(a>0) {k=t%10;t=t/10;s=k+s*10;} 循环里完全没有改变a的值，也就是判断条件永远不变，一旦进去就出不来了

user: user-2
content: 两个while会结束吗？

user: user-0
content: 怎么没人呢？求大神路过哈
user-0 提问: socket recv 无长度域如果检测数据是否收完？

回复:
user: user-1
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

user: user-2
content: 最好做一个协议，附加上长度

user: user-3
content: tcp是流， 需要自己提取消息。 无长度域，则需要消息分割符，没有其他选择。

user: user-4
content: 早期的方式是这样:先发送4字节的数据(header),说明后续的发送长度,然后是指定长度的data 需要你自己定义结构 struct data_s {    int32 length;    unsigned char data[1]; };

user: user-0
content: 引用 3 楼 bravery36 的回复:tcp是流传输，所以不会有“收完”的情况，只能在应用层定义长度，比如说定义定长包头，包头带长度。 难道必须加长度头么？这个也是设计的时候没考虑，现在要加有点麻烦。。。

user: user-0
content: 引用 2 楼 thefirstz 的回复:recv返回的时候，如果出错，判断下errno的值 errno是该加上，但是貌似解决不了问题。。  我现在主要判断不了是否收完数据了

user: user-5
content: 假设我是程序，你不告诉我哪里结束，我就会一直读，直到错误。

user: user-6
content: tcp是流传输，所以不会有“收完”的情况，只能在应用层定义长度，比如说定义定长包头，包头带长度。

user: user-7
content: recv返回的时候，如果出错，判断下errno的值

user: user-0
content: int RecvDataFromHost(int nSockfd, char *pRecvData, int *nRecvDataLen,int iTimeOut) {     int rlen = 0, ret, len = 0; #ifdef RACAL 	int iLengthHeader = 2; #else 	int iLengthHeader = 0; #endif     int nLenSize = 0;       fd_set r_fds;     struct timeval tv;       if(pRecvData == NULL)         return -1;      if(nSockfd <= 0) 	return -2;      FD_ZERO(&r_fds);     FD_SET((u_int)nSockfd, &r_fds);      if(iTimeOut > 0) {          tv.tv_sec = iTimeOut;         tv.tv_usec = 0;          ret = select(nSockfd + 1, &r_fds, NULL, NULL, &tv);         if (ret <= 0 || !FD_ISSET(nSockfd, &r_fds))             return -3;      } else {         ret = select(nSockfd + 1, &r_fds, NULL, NULL, NULL);//block         if (ret <= 0 || !FD_ISSET(nSockfd, &r_fds))             return -4;     }  	if (0 == iLengthHeader) 	{ 		do 		{ 			ret = recv(nSockfd, &pRecvData[rlen], 4096, 0);  			if (ret <= 0) 				return -5;  			rlen += ret;  		} while(0 != ret);//循环是我后加上去的，但是如果这样的话，会阻塞回去，单次收包又收不全数据。 	} 	else if (2 == iLengthHeader) 	{ 		int iRecvDataLen = -1; 		ret = recv(nSockfd, &pRecvData[rlen], 2, 0); 		if (ret <= 0) 			return -5; 		iRecvDataLen = (unsigned char)pRecvData[0]; 		iRecvDataLen = iRecvDataLen << 8 | (unsigned char)pRecvData[1]; 		rlen += ret;  		do{ 			ret = recv(nSockfd, &pRecvData[rlen], 1024, 0); 			if (ret <= 0) 				return -5;  			rlen += ret; 			iRecvDataLen -= ret; 		} while(iRecvDataLen > 0); 	}      if((len + nLenSize) > SECBUF_MAX_SIZE)         return -6;          *nRecvDataLen = rlen;      return 0; }
user-0 提问: 大家帮忙看看，矩阵输出最大元素，无法实现啊！！

回复:
user: user-1
content: 也可以这样做  #include <stdio.h> int max_value(int *a, int n) {     int max = *a;     int *p;     for (p = a + 1; p < a + n; p++)         if (*p > max) max = *p;                 return max;  } int main() {     int a[3][4] = { { 1, 3, 61, 7 }, { 2, 4, 6, 8 }, { 15, 17, 12, 3 } };    //1)整个数组当作一维数组计算，只能适应内置的二维数组表示的    //或者动态模拟二维数组存储方式，表示的矩阵。     printf("Max value is %d\n", max_value(a[0],3 * 4));    //2) 逐个一维数组计算，可以适应任何方式，用若干一维数组，表示的矩阵。    //包括二维数组，因为多维数组，是数组得数组     {       int max =  max_value(a[0],4);       int cur_max;        for(int i=0;i<3;i++)      {          cur_max = max_value(a[i],4);          if(max >cur_max) max = cur_max;        }       printf("Max value is %d\n", max);    ｝     return 0; }

user: user-2
content: 给a赋值是这样的... int a[3][4] = { { 1, 3, 61, 7 }, { 2, 4, 6, 8 }, { 15, 17, 12, 3 } };  #include <stdio.h> int max_value(int array[4][4]) { 	int i, j, max; 	max = array[0][0]; 	for (i = 0; i < 3; i++) 	for (j = 0; j < 4; j++) 	if (array[i][j]>max) max = array[i][j]; 	return max; } int main() { 	int a[3][4] = { { 1, 3, 61, 7 }, { 2, 4, 6, 8 }, { 15, 17, 12, 3 } }; 	printf("Max value is %d\n", max_value(a)); 	return 0; }

user: user-3
content: 引用 楼主 u013761183 的回复: 看到这样的代码，就蛋疼，为什么要用向量数组啊，写起来也累。 int max_value(int* pArray, int row, int col) { int max=pArray[0]; for(int i=0; i<row; ++i) {     for(int j=0; j<col; ++j)     {       if(pArray[i*col+j]>max)max=pArray[i*col+j];     } } return max; }

user: user-4
content: 没什么问题，把函数声明前置下。

user: user-5
content: 输出的是61，不是最大元素吗？

user: user-0
content: 引用 2 楼 u011393042 的回复:说错了，我照你的打了一遍，没问题啊！！可是输出的不是最大元素啊。。。

user: user-6
content: 说错了，我照你的打了一遍，没问题啊！！

user: user-6
content: 自定义函数声明是在main函数外边的吧。。。。你写错地方了
user-0 提问: 关于共享内存的疑问

回复:
user: user-1
content: 引用 10 楼 mrlgy 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] [quote=引用 7 楼 u011339091 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h 这个在哪里有源码？[/quote] 搜索下载Microsoft SDK[/quote] 哪一个版本的sdk[/quote] 我一般不提版本，就默认6.0

user: user-2
content: 引用 9 楼 zhao4zhong1 的回复:[quote=引用 7 楼 u011339091 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h 这个在哪里有源码？[/quote] 搜索下载Microsoft SDK[/quote] 哪一个版本的sdk

user: user-1
content: 引用 7 楼 u011339091 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h 这个在哪里有源码？[/quote] 搜索下载Microsoft SDK

user: user-3
content: 创建一个共享名的事件event或者Mutex,然后每个进程进去前都等待这个event或mutex, 访问完成后再释放这个event或mutex. 这是最简单的。  如果考虑读写锁的话，那么麻烦点。 下面这篇文章读写锁考虑的比较齐全，可以参考下。 http://blog.csdn.net/querw/article/details/7214925

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h 这个在哪里有源码？

user: user-4
content: 不介意脏读就无所谓，否则就要同步。

user: user-1
content: 参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h

user: user-0
content: 如果不考虑锁，而采用多个共享内存块的方式呢？ 效率会不会比较低下？ 在操作的时候，先查询共享内存块的序列，如果正在使用，则继续查找下一个。

user: user-5
content: 还有传说中的共享锁，就是用来解决读多写少的锁保护的效率问题

user: user-5
content: 只要保证所有线程都只读不写，就不需要保护了

user: user-6
content: 所有访问共享内存的任务都要考虑，所有访问都要用锁保护，才能避免数据的不一致。  至于有人说读不需要保护，写需要保护，你看看就行了，不要当真。只有极其特殊的情况下，读才不需要考虑。

user: user-6
content: 这是一个时间差的问题，如果时间差非常小，或者处理特殊，这种情况是会发生的。  所以，用一个全局锁来保护是很有必要的。
user-0 提问: 请问C/C++里面有什么类库可以绘画可拉伸的矩形、多边形？

回复:
user: user-1
content: 直接用鼠标事件来update绘制区域也可以实现的。

user: user-2
content: 引用 9 楼 qimo601 的回复:[quote=引用 8 楼 y_gemini 的回复:] 直接用鼠标事件来update绘制区域也可以实现的。  自己实现绘制 矩形，三角形等形状都不是太难。。。 关键每个形状的后期的变化，还得自己实现啊，挺繁琐的。 比如选中的时候，四周出现可变指示框。如下图： [/quote]  我的博客和资源里都有介绍。我的Wavesoft截屏里，还可以调节这些方形柄的大小 自己重绘是最简单的。 知道了框坐标之后，就可以绘制了，很简单的线性几何。

user: user-1
content: 这些也是一样的哈，重载一个类，鼠标点击后，绘制周围的可拉伸点 画这些不难，关键在于管理各种事件 和 管理多个形状的效果展示。 过这么久了，你应该已经解决了吧

user: user-0
content: 引用 8 楼 y_gemini 的回复:直接用鼠标事件来update绘制区域也可以实现的。  自己实现绘制 矩形，三角形等形状都不是太难。。。 关键每个形状的后期的变化，还得自己实现啊，挺繁琐的。 比如选中的时候，四周出现可变指示框。如下图：

user: user-3
content: 引用 5 楼 qimo601 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 应用于 Shape 和 ShapeRange 对象的 Type 属性。  返回或设置图形类型。MsoShapeType 类型，只读。  MsoShapeType 可为以下 MsoShapeType 常量之一。  msoAutoShape  msoCallout  msoCanvas  msoChart  msoComment  msoDiagram  msoEmbeddedOLEObject  msoFormControl  msoFreeform  msoGroup  msoLine  msoLinkedOLEObject  msoLinkedPicture  msoMedia  不能与此属性一同使用。该常量与其他 Microsoft Office 应用程序中的图形一同使用。  msoOLEControlObject  msoPicture  msoPlaceholder  不能与此属性一同使用。该常量与其他 Microsoft Office 应用程序中的图形一同使用。  msoScriptAnchor  msoShapeTypeMixed  msoTable  msoTextBox  msoTextEffect   这个应该不行吧[/quote] 至少在office里面所有绘制的图形都是可编辑的.

user: user-2
content: 看我资源里的Wavesoft截屏工具，是否满足你的需求。 当时我是这么开发的（QQ截屏的方框绘图也是这么做的）： 使用BitBlt绘图自己写不断的覆盖重绘，可以完成你的需求。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:应用于 Shape 和 ShapeRange 对象的 Type 属性。  返回或设置图形类型。MsoShapeType 类型，只读。  MsoShapeType 可为以下 MsoShapeType 常量之一。  msoAutoShape  msoCallout  msoCanvas  msoChart  msoComment  msoDiagram  msoEmbeddedOLEObject  msoFormControl  msoFreeform  msoGroup  msoLine  msoLinkedOLEObject  msoLinkedPicture  msoMedia  不能与此属性一同使用。该常量与其他 Microsoft Office 应用程序中的图形一同使用。  msoOLEControlObject  msoPicture  msoPlaceholder  不能与此属性一同使用。该常量与其他 Microsoft Office 应用程序中的图形一同使用。  msoScriptAnchor  msoShapeTypeMixed  msoTable  msoTextBox  msoTextEffect   这个应该不行吧

user: user-3
content: 应用于 Shape 和 ShapeRange 对象的 Type 属性。  返回或设置图形类型。MsoShapeType 类型，只读。  MsoShapeType 可为以下 MsoShapeType 常量之一。  msoAutoShape  msoCallout  msoCanvas  msoChart  msoComment  msoDiagram  msoEmbeddedOLEObject  msoFormControl  msoFreeform  msoGroup  msoLine  msoLinkedOLEObject  msoLinkedPicture  msoMedia  不能与此属性一同使用。该常量与其他 Microsoft Office 应用程序中的图形一同使用。  msoOLEControlObject  msoPicture  msoPlaceholder  不能与此属性一同使用。该常量与其他 Microsoft Office 应用程序中的图形一同使用。  msoScriptAnchor  msoShapeTypeMixed  msoTable  msoTextBox  msoTextEffect

user: user-3
content: Office里面的Shape ？

user: user-0
content: 我用的是qt，发现qt中的QRubberBand可以用来绘画直线和矩形，并支持拉伸修改。但是暂时还没发现支持其他形状，比如椭圆、多边形自由变化。

user: user-4
content: 这个没有，一般有的是渲染，也就是绘制几何图形的开源库，但是绘制完后，你要选择，则必须自己来做。