Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请教高手，win-tc和vc工具的问题

回复:
user: user-1
content: 引用 6 楼 king_2007 的回复:引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 king_2007 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt老赵老师，你说句话，光提供个工具说明什么？ 先用了再评论不迟。[/quote]老师，你是让我用他来开发c++程序还是c程序？[/quote] 都行应该。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:引用 4 楼 king_2007 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt老赵老师，你说句话，光提供个工具说明什么？ 先用了再评论不迟。[/quote]老师，你是让我用他来开发c++程序还是c程序？

user: user-1
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-2
content: 现在TC存在的主要意义就是学习一些老的经典项目，主要是学习思想和算法。不过新的工具会带来新的思想。

user: user-2
content: 没用过win-tc，win-tc开发的程序可执行文件应该是DOS下运行的吧，或者在DOSBox下运行，在Windows平台没有安装DOSBox无法正常运行。  如果你想使用TC来写绘图程序，可以用VC加上EasyX来编程，因为EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX包里面有完整的函数手册。

user: user-1
content: 引用 4 楼 king_2007 的回复:引用 3 楼 zhao4zhong1 的回复:Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt老赵老师，你说句话，光提供个工具说明什么？ 先用了再评论不迟。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt老赵老师，你说句话，光提供个工具说明什么？
user-0 提问: 监测目录，目录中出现（.bmp）图片文件

回复:
user: user-1
content: MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl

user: user-0
content: 没有查到耶！

user: user-1
content: 在MSDN里面搜“Fwatch Sample: Using ReadDirectoryChangesW API”

user: user-2
content: 注册消息处理，有个消息是监视文件夹变化的

user: user-0
content: 是新手，不会写，能帮忙写下吗

user: user-3
content: 最简单的方法    写个循环，定时启动一次。 findfirstfile findnextfile
user-0 提问: 关于C51语言

回复:
user: user-0
content: u014444402您好，硬件与软件应该是对应的。第一软件I/O接口是按照开发板I/O接口修改的。第二1602有显示，但是时钟不走。第三按设置键有光标显示，而且也有移动，但移动到第一行最后一位就停止了。按增加键年、月、日可以变化一次，共3键，第三键无反应。第四修改了初始时间值仍然显示原来值，但开发板重启后瞬间显示了一下修改值，又变回了原来值。第五时、分、秒行显示了9位连续数字。开发板是普中HC6800。我下载了很多程序，有的无显示，有的只显示原始值，无调整显示，本例还有调整显示。我是新手，不知在哪里与您对话，写在这里也不知您能否看到。请赐教，谢谢。

user: user-1
content: 你的硬件要与下载程序的软件能对应上才能啊.

user: user-2
content: 检测到按键按下直接发送ds1302的修改时间命令

user: user-3
content: 哈哈，自己写吧。很多51的程序不怎么通用吧。
user-0 提问: 新人求解答

回复:
user: user-1
content: 关键在于这两句：  s->next = p->next; p->next = s;  p已经指向了第i个结点，然后你让s的next指针指向了p之后的结点 然后再将p的next指针指向s，这就实现了将新结点s插入到p之后
user-0 提问: windows自带的ping和自己用ICMP实现ping有什么区别？

回复:
user: user-0
content: 谢谢。 就是不知道该调用什么函数能绕过管理员权限。

user: user-1
content: raw socket  要管理员权限,   你也调用 IcmpSendEcho2Ex 啥的就是了 ...
user-0 提问: 请问怎么将一个宏的数值传入到指针类型的参数里面呢？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复: fun((const int*)DEF);   感谢感谢，一开始没弄出来，原来自己漏了const。

user: user-1
content: fun((const int*)DEF);
user-0 提问: C语言新手 函数问题

回复:
user: user-1
content: strlen（） 似乎是函数名打错？（或者你发帖的时候写错）

user: user-2
content: strle(s2[]) ---->strlen(s2) 行不行，自己试下就知道了。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: strlen(s2)   删除字符 不能直接将其置为0， 因为字符串遇 0 结束， 所以应该是把后续的字符串往前移动

user: user-0
content: 谢谢楼上各位，问题解决了，不过不知道给分数...
user-0 提问: n进制转化十进制，哪里错了

回复:
user: user-1
content: 引用 3 楼 paschen 的回复:#include<stdio.h> #include<string.h> int main() { 	long t1; 	int i,n,t,t3; 	char a[100]; 	printf("请输入数字:\n"); 	gets(a); 	strupr(a); 	t3=strlen(a); 	t1=0; 	printf("请输入进制：\n"); 	scanf("%d",&n); 	for(i=0;i<t3;i++) 	{ 		if(a[i]-'0'>=n&&a[i]<'A'||a[i]-'A'+10>=n) 		{ 			printf("输入有误!!");  			exit(0);  		} 		if(a[i]>='0'&&a[i]<='9') 			t=a[i]-'0'; 		else if(n>=11&&(a[i]>='A'&&a[i]<='A'+n-10))  			t=a[i]-'A'+10; 		t1=t1*n+t; 	} 	printf("十进制形式为%d：\n", t1);  }   请问你是在什么ide下调试的，exit(0), 在vs下要包含windows.h头文件吧

user: user-2
content: #include<stdio.h> #include<string.h> int main() { 	long t1; 	int i,n,t,t3; 	char a[100]; 	printf("请输入数字:\n"); 	gets(a); 	strupr(a); 	t3=strlen(a); 	t1=0; 	printf("请输入进制：\n"); 	scanf("%d",&n); 	for(i=0;i<t3;i++) 	{ 		if(a[i]-'0'>=n&&a[i]<'A'||a[i]-'A'+10>=n) 		{ 			printf("输入有误!!");  			exit(0);  		} 		if(a[i]>='0'&&a[i]<='9') 			t=a[i]-'0'; 		else if(n>=11&&(a[i]>='A'&&a[i]<='A'+n-10))  			t=a[i]-'A'+10; 		t1=t1*n+t; 	} 	printf("十进制形式为%d：\n", t1);  }

user: user-2
content: t3==strlen(a);  改成 t3=strlen(a);  a{i}改成a[i]  for(i=0;i<=t3;i++) 改成 for(i=0;i<t3;i++)  最后输出t1的值 ：printf("十进制形式为%d：\n", t1);

user: user-3
content: 1.if (a[i] - '0' >= n&&a[i] < 'A' || a[i] - 'A' + 10 >= n) 你确定这是你想要的逻辑？不需要加个括号？  2.if (a[i] >= '0'&&a{ i } <= '9')这里应该是a[i]不是a{i}
user-0 提问: 求助各位大神CRC-31的算法

回复:
user: user-0
content: 谢谢！您好~CRC31算法怎么做呢？右移那里该怎么解决？

user: user-1
content: 仅供参考：/***** crc16.c *****/ #include <stdio.h>  #define CRC16_DNP   0x3D65u     // DNP, IEC 870, M-BUS, wM-BUS, ... #define CRC16_CCITT 0x1021u     // X.25, V.41, HDLC FCS, Bluetooth, ...  //Other polynoms not tested #define CRC16_IBM   0x8005u     // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ... #define CRC16_T10_DIF   0x8BB7u     // SCSI DIF #define CRC16_DECT  0x0589u     // Cordeless Telephones #define CRC16_ARINC 0xA02Bu     // ACARS Aplications  #define POLYNOM     CRC16_DNP   // Define the used polynom from one of the aboves  // Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0). unsigned short crc16(unsigned short crcValue, unsigned char newByte) {     int i;      for (i = 0; i < 8; i++) {         if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){             crcValue = (crcValue << 1)  ^ POLYNOM;         } else {             crcValue = (crcValue << 1);         }         newByte <<= 1;     }     return crcValue; }  unsigned short exampleOfUseCRC16(unsigned char *Data, int len){      unsigned short crc;     int aux = 0;      crc = 0x0000u; //Initialization of crc to 0x0000 for DNP     //crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT      while (aux < len){         crc = crc16(crc,Data[aux]);         aux++;     }      return (~crc); //The crc value for DNP it is obtained by NOT operation      //return crc; //The crc value for CCITT }  int main() {     unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};      printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078     return 0; }

user: user-0
content: 以CRC16为例，首先不知道要左移多少位，第二不知道是否使用简记式，因为CRC16的话，其实是17位，舍去正好。但是这个CRC31，其实就是32位。

user: user-0
content: LZ编了一个CRC16的，可以通过算例验证了。 uint16_t crc16(uint8_t *addr, uint32_t num, uint16_t crc) { 	int i; 	while (num--) 	{ 		//printf("原始数据 "); ShowBit(*addr, 8); printf("\n"); 		Reverse8InBit(addr); 		crc = crc ^ (*addr << 8);           /* Fetch byte from memory, XOR into CRC top byte*/ 		//printf("CRC异或 "); ShowBit(crc, 16); printf("\n"); 		for (i = 0; i < 8; i++)               /* Prepare to rotate 8 bits */ 		{ 			if (crc & 0x8000U)                /* b15 is set... */ 			{ 				crc = (crc << 1) ^ POLY16_CCITT;    /* rotate and XOR with polynomic */  			} 			else                              /* b15 is clear... */ 				crc <<= 1;                    /* just rotate */ 			//printf("第%d循环 ",i+1); ShowBit(crc, 16); printf("\n"); 		}                                     /* Loop for 8 bits */ 		crc &= 0xFFFF;                        /* Ensure CRC remains 16-bit value */ 		*addr++; 	}                                         /* Loop until num=0 */ 	Reverse16InBit(&crc); 	return(crc);                                	/* Return updated CRC */ }
user-0 提问: 无法运行

回复:
user: user-1
content: 引用 4楼我是你的主体 的回复:[quote=引用 3 楼 小灸舞的回复:]代码复制上来，你的main都拼错了，不是mian而是main 就是这个错，没看出来[/quote]记得结帖

user: user-0
content: 引用 3 楼 小灸舞的回复:代码复制上来，你的main都拼错了，不是mian而是main 就是这个错，没看出来

user: user-1
content: 代码复制上来，你的main都拼错了，不是mian而是main

user: user-2
content: 代码都不回贴，这个分辨率的图谁能看清楚

user: user-0
content: 顶，有人解答么 11111111
user-0 提问: 变量大于65535后出现段错误，将变量类型变为long后不会出现

回复:
user: user-1
content: 看到这几个数字，联想到的应该就是位数的原因。

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-3
content: sizeof(int) 看看多大  2 就是16位的 4就是32位的

user: user-4
content: 楼主用Turbo C吗？TC是16位的，int整数最大2的16次方-1

user: user-5
content: 楼主用的什么编译器啊
user-0 提问: 这个简单的程序编译有错误？

回复:
user: user-1
content: 把编译信息贴出来啊

user: user-2
content: 可以跑滴

user: user-3
content: LZ看大家太沉闷了, 特地来逗大家开心一下.

user: user-0
content: 你们可能都败没想到,一是程序路径不对。

user: user-4

user: user-5
content: 我是来看热闹的

user: user-6
content: main函数是int ，然后加上return 0

user: user-7
content: int main 和 加上return 0

user: user-8
content: #include <stdio.h>  int main() {     printf("Hello, world\n");     return 0; }  如果这个还有错误，就是你的编译环境的问题了

user: user-9
content: 楼主，你是逗我们玩的吧！

user: user-10
content: 加上return；语句才意味着程序结束

user: user-11
content: 什么错呢，最后加上return 0;

user: user-12
content: 加个return 0

user: user-13
content: 逗逼啊~~~  main不写返回值则默认为Int,必须写return；不返回则定义void main

user: user-14
content: 你就逗大伙哈

user: user-15
content: 在VS2010上报错会是这个 ： 错误	1	error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int	  无返回值要写void，不能缺省。

user: user-16
content: 根据楼上几位的方案，有结果么？ 你是拿什么界面来编译的?
user-0 提问: 如何使一个变量在固定的两个值之间波动

回复:
user: user-1
content: 在L和H之间随机产生 L + rand() % (H - L)

user: user-2
content: float R=(float)(rand()%5)/4.0f; float V=a*R+b*(1.0f-R);//V=a ...... b

user: user-2
content: 引用 11 楼 u010165006 的回复:[quote=引用 10 楼 zhao4zhong1 的回复:] R=rand()%2; V=a*R+b*(1-R);//V=a or b  这个比V=R?a:b 有什么好处？[/quote] 方便改成比如在a和b之间取5个值： float R=(float)(rand()%5)/4.0f; float V=a*R+b*(4.0f-R);//V=a ...... b

user: user-3
content: 引用 10 楼 zhao4zhong1 的回复:R=rand()%2; V=a*R+b*(1-R);//V=a or b  这个比V=R?a:b 有什么好处？

user: user-2
content: R=rand()%2; V=a*R+b*(1-R);//V=a or b

user: user-4
content: 1)bool  bool b=false; int t=0 while(t++<100){ b=!b; } 2)整型，浮点型等等  int x; int a[2]=｛1，10｝；  int t=0; while(t++<100){ x=a[t%2]; }

user: user-3
content: 是只取这固定的两个值，还是这两个值之间的任何值都是可能的？

user: user-5
content: 两个固定值放在数组里，然后 index = 1-index 还会打乒乓球就行。

user: user-4
content: 引用 5 楼 cavaliersun 的回复:[quote=引用 4 楼 lm_whales的回复:]1)bool  bool b=false; int t=0 while(t++<100){ b=!b; } 2)整型，浮点型等等  int x; int a[2]=｛1，10｝；  int t=0; while(t++<100){ x=a[t%2]; } 不是c++，哪里来的bool类型[/quote] C99以后，也有bool 不是C++ 自行定义一个也很简单的， 所以C干脆就没有bool C99 也顺手，加了一个bool

user: user-6
content: 引用 4 楼 lm_whales的回复:1)bool  bool b=false; int t=0 while(t++<100){ b=!b; } 2)整型，浮点型等等  int x; int a[2]=｛1，10｝；  int t=0; while(t++<100){ x=a[t%2]; } 不是c++，哪里来的bool类型

user: user-7
content: 引用 2 楼 qq_16435563 的回复:固定值，两个值互相切换 不知道你要什么样的效果，切换就直接赋值就行了啊。来回赋值不就行了吗

user: user-0
content: 固定值，两个值互相切换

user: user-7
content: 随机波动吗？那就用随机数就行了啊
user-0 提问: window编程中Slider Control滑动条控件怎样使用？

回复:
user: user-1
content: SetRange 设置范围  SetPos     设置位置 GetPos    读取位置 GetRange  读取范围哦  消息响应处理，一般是读取范围，，，，

user: user-1
content: 滑动条，进度条，滚动条本质上是相同的

user: user-2
content: 引用 2 楼 lm_whales的回复:SetRange 设置范围  SetPos     设置位置 GetPos    读取位置 GetRange  读取范围哦  消息响应处理，一般是读取范围，，，， 也想问一下，windows编程做些简单的处理譬如说是从excel取数据，写入sqlite或者写入access数据库，用c好还是c++好呢
user-0 提问: num=read(STDIN_FILENO,buf,1024);直接返回-1是什么原因？

回复:
user: user-1
content: 引用 7 楼 shihengzhen101 的回复:我也遇到相同的问题errno=88，错误信息为 Socket operation on non-socket 查询说是recv的第一个描述符不正确，可是0是标准读入，怎么会不正确呢？ 解决了，把函数recv改成read就行了....

user: user-1
content: 我也遇到相同的问题errno=88，错误信息为 Socket operation on non-socket 查询说是recv的第一个描述符不正确，可是0是标准读入，怎么会不正确呢？

user: user-2
content: read的返回值一共有三种情况： 1. 大于0：成功读取的字节数； 2. 等于0：到达文件尾； 3. -1：发生错误，通过errno确定具体错误值。

user: user-3
content: 去读read函数文档，据此判断失败的原因，而不要空想

user: user-4
content: 在这句代码下面加上 cout <<strerror(errno)  看看。

user: user-5
content: 帮顶，楼主，这个是windows的api么?

user: user-0
content: 与没有遇到这样问题的？哪位懂的朋友帮忙看下哈谢谢拉

user: user-0
content: 也就是题目所说的num=read(STDIN_FILENO,buf,1024);直接返回-1。
user-0 提问: 请大家帮我看看是不是这样实现呢?将N个数字读入数组,返回第k个最大者

回复:
user: user-1
content: 算法是自己想的吗？后面应该用插入排序比较好吧

user: user-0
content: 对了，程序最后的printf语句改成：printf("第 %d 个元素是: %d!\n", k + 1, number[k]);
user-0 提问: c语言 修改文件的问题

回复:
user: user-1
content: 大文件也一样。

user: user-2
content: 引用 4 楼 qq_35689013 的回复:[quote=引用 1 楼 paschen 的回复:] 显然肯定不是这种.. 那么  请问  大概应该是怎样的流程呢？    可以简要说一下吗？[/quote]  打开文件 + 移动文件指针到相应位置

user: user-3
content: 细节可能有出入，可能不一定需要后备文件。但是，大文件本身就不应该频繁被修改，如果要被频繁修改，请将文件的粒度再变小一些，让大文件变小文件。

user: user-4
content: @赵4老师

user: user-0
content: 引用 1 楼 paschen 的回复:显然肯定不是这种.. 那么  请问  大概应该是怎样的流程呢？    可以简要说一下吗？

user: user-2
content: 显然肯定不是这种..

user: user-5
content: 修改就是直接修改吧。应该没那么复杂
user-0 提问: 数组作为参数传递

回复:
user: user-1
content: 感谢楼主分享，可以再充实一下发到博客里面

user: user-2
content: 传递的不是指向数组的指针，而是数组退化为指针  这是两种完全不同的类型

user: user-3
content: 帮顶，以前没注意的，通过你的总结了解了

user: user-4
content: 嗯，感谢分享，总结！
user-0 提问: 补码问题

回复:
user: user-1
content: %d是按int显示  改成printf("%u",X);试下

user: user-2
content: 补码的计算方式是反码加一  补码数中 -1的反码是0 0 +1=1 1 刚好是 -1 的补码 1的反码是  1111 1111 1111 1111 1111 1111 1111 1110b 这是-2 的补码数编码。 -2+1 =-1 -1 刚好是1的补码  原码计算 正数就是补码数本身 负数，就是相反数的符号位，置为1 以后的编码  反码计算 就是C语言的按位取反，～运算就可以了

user: user-2
content: 直接输出不是求原码 所谓原码 就是正数和0 用该数的顺序号的二进制（从0开始计算）表示 负数用他的相反数的原码，把最高位（符号位）设置为1；也就是比他的相反数，最高位多了个符号1 例如 0 = 0000 0000 0000 0000 0000 0000 0000 0000b;// 0的原码，（补码也是他）32个0 1 = 0000 0000 0000 0000 0000 0000 0000 0001b;// 1的原码，1个1，31个0;  -1= 1000 0000 0000 0000 0000 0000 0000 0001b;// 2个130个0 补码数，，，，注意不是补码，而是补码数，补码，反码是一种编码方案，是原码的补码，反码  0 = 0000 0000 0000 0000 0000 0000 0000 0000b;// 32个0 ;0 和正数，用原码编码 1 = 0000 0000 0000 0000 0000 0000 0000 0001b;// 1个1，31个0;//正数，用原码编码 -1= 1111 1111 1111 1111 1111 1111 1111 1111b;// 32个1;//负数，用（他的相反数）补码编码 这种编码中 1和-1 互为补码，2，-2 ，3，-3 .。。每个数，和他的相反数 互为补码。 1+（-1） =0 //正好符合数学中的相反数的关系 0 的补码，还是0 ;也就是 -0 =0 也符合 数学中0 的概念 因为1个数，和他的相反数，互为补码，所以这种编码表示的数，称为补码数 一个编码的补码的概念就是，两个数相加结果为 0 mod(2^n) ，这里n=32，因为是2进制，所以是对2^n求余  负数求原码的方法 1）先转换成相反数 2）最高位设置为1 -1 转换为1 1）1 = 0000 0000 0000 0000 0000 0000 0000 0001b;// 1个1，32个0 最高位设置为1 就变成 2）-1= 1000 0000 0000 0000 0000 0000 0000 0001b;// 2个130个0         这个编码的十六进制表示(C语言版)为                                       0x 80 00 00 00 00 00 00 01 ;

user: user-3
content: 储存，跟格式化输出，是不一样的事！

user: user-4
content: 补码……立马去百度查查看了。
user-0 提问: 内存读取访问权限冲突

回复:
user: user-1
content: 接分  #include <stdio.h> #include <stdlib.h>  int main() { 	int i1 = 5; 	int i2 = 20; 	int const *p = &i1;  	printf("i1 =%d, &i1=%d", i1, &i1); 	printf("p= %d,  *p=%d", p, *p); 	getchar(); 	return 0; }

user: user-2
content: #include<stdio.h> #include<stdlib.h>  main() { 	int i1 = 5; 	int i2 = 20; 	int const *p = &i1;  	printf("i1 =%d, &i1=%x", i1, &i1); //加断点看下 	printf("\np= %x,  *p=%d", p, *p); 	getchar(); }

user: user-3
content: int const *p = i1; 你这里做了一个隐式转换，让p指向的地址是i1 （即5）  而这块地不能被读，所以你之后*p的时候会出错

user: user-4
content: int const *p = i1; 少了个&吧

user: user-5
content: main() {     int i1 = 5;     int i2 = 20;     int const *p = & i1;       printf("i1 =%d, &i1=%p", i1,&i1);     printf("p= %p,  *p=%d", p, *p );     getchar(); }
user-0 提问: 关于运算时间和编译器优化的问题

回复:
user: user-1
content: 循环内部的公有 计算，聪明的编译器，会提取出来，提前计算 跟手工优化差不多 但不是所有编译器会这样的 也不是所有这种，优化，编译器都能做的 这种可以适当手动优化  前提是，这块代码，是执行最多的代码，耗时最长的代码 不然的话，作用不大  这种优化循环的做法，似乎也已经形成编程规范了 应该很流行的

user: user-2
content: 看编译器有没优化，你要去看他生成的汇编代码，通常来说你说这种对效率的影响很小很小，你要优化主要要从宏观上对算法的优化

user: user-0
content: 引用 3 楼 lm_whales 的回复:优化，固然影响时间，算法影响更大 所以，改进算法，比考虑优化更重要  至于提前计算，当然啊是好的 靠编译器优化，不一定靠得住  当你不确定，某些方式是不是和更好的方式，可以相提并论的时候 选更好的  如果确知，某些代码会优化，或者给优化带来方便 那就多用那种方法，否则 不必考虑  首先保证逻辑正确 然后，再采取手工适当优化  编译器，很聪明，但是不一定任何情况，都能做最好的优化 当然，有些普遍知道的优化措施 相当多的编译器都会采取的 例如尾递归优化   = =算法优化不了再来找细节啊，该遍历的该计算的总得老老实实做吧，不是所有都能优化成logN的

user: user-1
content: 手工优化，不要做的太多，适可而止 因为优化编译，很多时候，是编译器的强项

user: user-1
content: 优化，固然影响时间，算法影响更大 所以，改进算法，比考虑优化更重要  至于提前计算，当然啊是好的 靠编译器优化，不一定靠得住  当你不确定，某些方式是不是和更好的方式，可以相提并论的时候 选更好的  如果确知，某些代码会优化，或者给优化带来方便 那就多用那种方法，否则 不必考虑  首先保证逻辑正确 然后，再采取手工适当优化  编译器，很聪明，但是不一定任何情况，都能做最好的优化 当然，有些普遍知道的优化措施 相当多的编译器都会采取的 例如尾递归优化

user: user-0
content: 引用 1 楼 cyfcsd 的回复:不知道你说的具体是什么情况，你要懂的话可以看一下反汇编代码，看有没有优化，一般debug是不会优化的，而release是会有一些优化的，但函数调用一般不会被优化  需要计算复杂的式子，其中会出现很多次重复的某项，比如多次计算 a[i]/(b*c*d - e*f/g)这种,每次只改变a[i]，之后那个没变

user: user-3
content: 不知道你说的具体是什么情况，你要懂的话可以看一下反汇编代码，看有没有优化，一般debug是不会优化的，而release是会有一些优化的，但函数调用一般不会被优化
user-0 提问: 想请教一个问题，C程序中如果申明了一个结构体类型，当执行程序时，声明部分会存在于内存代码段中么？

回复:
user: user-1
content: 不在内存中。编译器根据这些东西生成了只处理地址、数据的机器语言代码，这些代码在内存中，存储数据的变量位于内存中，其余的都用不到了。

user: user-2
content: 编译器编译后已经全变成了二进制数据，没有类型这些的概念了  如果硬要说存去哪了，只能说当你定义变量时的机器指令会有所不同

user: user-3
content: 结构体的定义会存在于内存的代码段的，但不会出现在堆区或者栈区，只有定义结构体变量是才会根据代码段的结构体定义信息在栈上或者堆上分配内存

user: user-4
content: 调试版本，可能会有类型相关信息的 发布版本，一般不会有 当然，VC有一个部分，可能会有。这就是托管C++ 这其实是另一种语言了，不是很符合C++的定义  类型的信息这些东西，对于编译好的程序。并不是运行时候必须的东西，并不很重要、 只有像调试代码等场合，可能会用到。 类型系统，只是对于高级语言，对于人来说，是重要的。 对编译后的代码。完全是不必要的。  汇编语言，只有整型，浮点型，指针其实是某种整型 结构，数组都是可有可无的，一样可以编写程序

user: user-0
content: 引用 3 楼 wang0635 的回复:不在内存中。编译器根据这些东西生成了只处理地址、数据的机器语言代码，这些代码在内存中，存储数据的变量位于内存中，其余的都用不到了。我有点不明白，前面说到不在内存中，后面又说在内存中，还请再讲解一下，谢谢。

user: user-0
content: 引用 3 楼 wang0635 的回复:不在内存中。编译器根据这些东西生成了只处理地址、数据的机器语言代码，这些代码在内存中，存储数据的变量位于内存中，其余的都用不到了。 引用 2 楼 paschen 的回复:编译器编译后已经全变成了二进制数据，没有类型这些的概念了  如果硬要说存去哪了，只能说当你定义变量时的机器指令会有所不同我能理解成这样理解么，在定义了一个结构体类型后，定义结构体类型的这部分代码会被编译器编译成机器代码，和程序其他代码一起放到一个可执行文件中去，在运行个程序时，整个可执行文件会被加载到内存中，只是从结构体类型定义语句转换过来的那部分代码不会被执行，而是而是让计算机多了一种可以定义结构体的指令。 还请多多指教

user: user-0
content: 引用 1 楼 cyfcsd 的回复:结构体的定义会存在于内存的代码段的，但不会出现在堆区或者栈区，只有定义结构体变量是才会根据代码段的结构体定义信息在栈上或者堆上分配内存你说的结构体定义存在于内存的代码段的，就是指结构体申明的那段代码？

user: user-5
content: 声明结构体类型，它的本质和内置类型如int，char等一样，是一种数据类型，不过是用户自己自定义的，用来满足那些内置类型不能满足需求的时候，你认为int， char等数据类型会在内存中开辟空间吗？只有在用类型定义变量的时候才会在内存中开辟空间，存储这个变量对应的值，它就是提供了一个模子，告诉编译器这种类型有多大，定义的时候需要开辟多大的空间。
user-0 提问: 请问HWDN POINT这些是什么？

回复:
user: user-0
content: 引用 2 楼 user-2 的回复:上面说的主要是H开头的类型  POINT，是二维点的坐标（整数类型）一个x,一个y RECT，是直角坐标系同，四边分别平行于坐标轴的方框  这些东西，用熟了就知道了 事先知道，也没多少用处 编写一点代码，慢慢就知道了 谢谢你，你很热心！是个好人

user: user-1
content: 《Windows程序设计》

user: user-2
content: 上面说的主要是H开头的类型  POINT，是二维点的坐标（整数类型）一个x,一个y RECT，是直角坐标系同，四边分别平行于坐标轴的方框  这些东西，用熟了就知道了 事先知道，也没多少用处 编写一点代码，慢慢就知道了

user: user-2
content: 这些只是些 typedefs  本质是指针，或者索引，因为未必是指针，或者数组的下标，所以专门定义一个名字 这一类型的东西，不要具体关心它是什么，因为MS不会告诉你，他将会把他们实现为什么（保留修改的权力） 至于typedefs 只是把他们定义为指针 Windows 用它查找，某些数据结构 你只需要知道他们是handles(句柄，把手) 通过他们。你就可以找到并使用相应的数据。
user-0 提问: openssl 如何加载16进制公钥字符串

回复:
user: user-1
content: BIGNUM *x, *y; 	EC_KEY    *key = NULL;   	x = BN_new(); 	y = BN_new();  	if ((key = EC_KEY_new_by_curve_name(curve_id)) == NULL) 	{ 		goto x962_int_err; 	}  	if (!EC_KEY_generate_key(key, NULL, 0))      //生成密钥对 	{ 		goto x962_int_err; 	}  	BN_hex2bn( &x, ( const char * )x值 );  	BN_hex2bn( &y, ( const char * )y值 );  	key->group->meth->point_set_affine_coordinates( key->group, key->pub_key, x, y );

user: user-2
content: 好想说，这，不就是天书么，看不懂啊？
user-0 提问: 中缀表达式转后缀求教

回复:
user: user-1
content: 还可以分割成字符串（包括运算符）  这样 你需要操作的只是一些字符串

user: user-0
content: 引用 3 楼 user-2 的回复:可以看一下我的blog，我写过中缀转后缀表达式 en

user: user-2
content: 引用 6 楼 yangyijk 的回复:[quote=引用 3 楼 user-2 的回复:] 可以看一下我的blog，我写过中缀转后缀表达式 你好，我看了一下你这个代码应该有问题吧              while (S[i] >= '0'&&S[i] <= '9' || S[i] == '.')               {                   OPS[j++] = S[i];                   i++;               }               i--;               OPS[j++] = '#';  //数字中的间隔符               break;   [/quote]我的逻辑是这样的，操作数和操作数之间肯定是操作符，每一次遇到多位数的话                          可以连续存储在字符数组中，中间用‘#’隔开，读出来的时候也方便                          你整体复制粘贴，应该可以运行多位数

user: user-0
content: 引用 3 楼 user-2 的回复:可以看一下我的blog，我写过中缀转后缀表达式 刚刚测试了一下的确有问题，如果是三位数的数字这里逻辑明显错误

user: user-0
content: 引用 3 楼 user-2 的回复:可以看一下我的blog，我写过中缀转后缀表达式 你好，我看了一下你这个代码应该有问题吧              while (S[i] >= '0'&&S[i] <= '9' || S[i] == '.')               {                   OPS[j++] = S[i];                   i++;               }               i--;               OPS[j++] = '#';  //数字中的间隔符               break;

user: user-2
content: 如果多于两位数字，你可以单个储存，整体用 分隔符分割开，等到取出的时候，依据分隔符 将多位数整体取出储存到字符数组！然后将其转化为特定的数字类型

user: user-1
content: 你可以设计一个联合体处理这个问题 也可以还按照字符处理，空格就是分隔符，没有空格的数字是同一个数字 运算符另外处理

user: user-2
content: 可以看一下我的blog，我写过中缀转后缀表达式
user-0 提问: 急求！！！关于openssl安装中遇到的问题！！！！！

回复:
user: user-1
content: 1.下载perl http://www.activestate.com/activeperl/downloads 2.下载openssl源码 https://www.openssl.org/source/ 3.打开VS命令终端，(终端窗口类型必须与你的操作系统一致)切换到openssl源码路径下   4.按照openssl源码路径下的INSTALL(W32/W64)文件提示进行编译
user-0 提问: 请教关于工具的问题

回复:
user: user-0
content: 说了半天，白说

user: user-1
content: MSDN查API函数，看需要什么头文件和lib库。

user: user-0
content: 引用 5 楼 u010165006 的回复:[quote=引用 3 楼 king_2007 的回复:] [quote=引用 2 楼 qq423399099 的回复:] 包含目录:头文件所在目录 附加库目录:lib所在目录 附加依赖项:lib的名称请问有具体步骤吗？[/quote]  菜单选项里头找找[/quote]那找到后。。。。。

user: user-1
content: 引用 3 楼 king_2007 的回复:[quote=引用 2 楼 qq423399099 的回复:] 包含目录:头文件所在目录 附加库目录:lib所在目录 附加依赖项:lib的名称请问有具体步骤吗？[/quote]  菜单选项里头找找

user: user-0
content: [quote=引用 1 楼 u010165006 的回复:] 有的API函数需要添加lib才能用。[/quote请问下具体如何操作？？]

user: user-0
content: 引用 2 楼 qq423399099 的回复:包含目录:头文件所在目录 附加库目录:lib所在目录 附加依赖项:lib的名称请问有具体步骤吗？

user: user-1
content: 有的API函数需要添加lib才能用。

user: user-2
content: 包含目录:头文件所在目录 附加库目录:lib所在目录 附加依赖项:lib的名称
user-0 提问: 数组转字符串-------------------

回复:
user: user-1
content: int main () { 	unsigned int tmp ; 	sscanf_s ("8048770" ,"%x" ,&tmp) ; 	void *p = (void *) (__int64) tmp ; 	return 0 ; }

user: user-0
content: 是我没表达清楚啊，是这样：  现有一个字符串8048770； 把它组装成一个地址形式0x8048770； 然后把指针p指向这个地址0x8048770；  请问大神，怎么实现？ 我已经在这耗了三天时间了

user: user-2
content: 写个循环，数组中一个元素一个元素去转  转换的函数有挺多

user: user-3
content: uint8是自己定义的类型？原始类型是啥啊

user: user-4
content: uint 转char，就不会自己转？
user-0 提问: 指针与数组指针的区别

回复:
user: user-1
content: 假设我定义了一个 int (*p)[10]; 那么这个p是一个二级指针， 假设有数组 a[4][10], 那么可以 p = a; *p也就相当于a[0], *p是一级指针。

user: user-2
content: 好深奥呀，学习，学习！

user: user-3
content: p是数组首地址的地址，*p是数组首地址，**p是数组第一个元素。

user: user-4
content: p是数组指针，*p当然指向数组， 但是数组不能整体读取或者赋值。 因此*p就是第一个元素的地址了

user: user-5
content: 推荐楼主看下 数组指针和指针数组的区别。https://blog.csdn.net/szullc/article/details/84900643

user: user-6
content: 因为p是数组指针，所以*p指向第一行数组的地址。

user: user-7
content: 指针的本质是地址，确切的是代表数组的首地址

user: user-8
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-9
content: 我理解p就是指向数组的首地址a

user: user-10
content: 定义：     数组指针：指向数组首地址的指针， 那么*p只是将p降一级，仍然是地址啊

user: user-11
content: 很多教材讲过，指针指向（即存储）的是数组的首地址，不能理解为元素~

user: user-12
content: 引用 48 楼 chen2qu 的回复:"既然数组指针是指向数组的指针，指针内存放的是所对应的数组的地址，那么*p为什么不是元素而是地址呢？"  你说的中间那一段，其实已经很好的回答了你的问题。 但是你的问题，也是伪的，这里的元素，就是数组的地址，在这个问题中，是同一个东西。  他的意思是为什么*p指向的不是数组元素就是a[0]  我自己也搞不懂既然p是存放数组的地址，那数组的地址又是什么？ 如果数组的地址是数组的首地址那么*p不就是a【0】啊？

user: user-13
content: "既然数组指针是指向数组的指针，指针内存放的是所对应的数组的地址，那么*p为什么不是元素而是地址呢？"  你说的中间那一段，其实已经很好的回答了你的问题。 但是你的问题，也是伪的，这里的元素，就是数组的地址，在这个问题中，是同一个东西。

user: user-14
content: 不错，过来好好学习一下

user: user-15
content: 引用 8 楼 zhao4zhong1 的回复:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……666

user: user-16
content: 引用 45 楼 zhao4zhong1 的回复:没我这个中间层，上层就不会直接调用底层API了？ 没有API，我就没办法编程了

user: user-8
content: 引用 43 楼 xiaoyuanyuan2009 的回复:[quote=引用 42 楼 zhao4zhong1 的回复:] 您老现在有没有时间学习了，有时间的话学一下Delphi XE 10，然后教教我们[/quote] 没我这个中间层，上层就不会直接调用底层API了？

user: user-17
content: 引用 37 楼 qq_24861595 的回复:[quote=引用 14 楼 fefe82 的回复:] 数组类型的对象出现在表达式中的时候，绝大部分情况会自动转化为指向数组第一个元素的指针（array-to-pointer conversion）。  如果 p 是指向数组的指针，那么 *p 就是数组，然后它将在绝大多数情况下被转化为指向数组第一个元素的指针。  这种转化在 sizeof（） 里并不会发生。  =================== 注：数组不是指针。数组和指针是完全不同的类型。数组名可以当指针用，只是由于上面所说的转换的存在。  我想请问，如果此时对于p和*p分别加1操作，那么，他们移动的长度相等么[/quote] 不相等。 p+1 移动一个数组的长度 (*p) + 1 移动一个元素的长度

user: user-18
content: 引用 14 楼 fefe82 的回复:数组类型的对象出现在表达式中的时候，绝大部分情况会自动转化为指向数组第一个元素的指针（array-to-pointer conversion）。  如果 p 是指向数组的指针，那么 *p 就是数组，然后它将在绝大多数情况下被转化为指向数组第一个元素的指针。  这种转化在 sizeof（） 里并不会发生。  =================== 注：数组不是指针。数组和指针是完全不同的类型。数组名可以当指针用，只是由于上面所说的转换的存在。  我想请问，如果此时对于p和*p分别加1操作，那么，他们移动的长度相等么

user: user-16
content: 引用 42 楼 zhao4zhong1 的回复: 您老现在有没有时间学习了，有时间的话学一下Delphi XE 10，然后教教我们
user-0 提问: gcc 编译报错

回复:
user: user-1
content: 引用 2 楼 Gump4231 的回复:弱弱问一句，怎么能把代码复制成这样。。。  调整一下代码缩进，使用语法着色，让大家看起来方便些。  语法着色，在论坛的编辑框里，有一排按钮，左数第12个，可以使用各种语言的语法着色。

user: user-2
content: 引用 楼主 hzgmm 的回复:编译工程时，在下面这句报错 *(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;  错误信息： error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing] .... cc1: some warnings being treated as errors 弱弱问一句，怎么能把代码复制成这样。。。

user: user-2
content: 弱弱问一句，怎么能把代码复制成这样。。。

user: user-3
content: 编译时有 -fstrict-aliasing 参数或者 -O2等优化参数 就会启用严格对齐。 你使用了参数[-Werror=strict-aliasing]，这意味着你设置了编译器将strict-aliasing的warning编程error  严格对齐 简单来说就是 编译器希望不同类型的对象不会指向同一个地址，你只能使用对应类型去访问对应的地址。 比如说你代码中的buffer[SHA256_SHORT_BLOCK_LENGTH]是 char型的数组， 那么只能使用 char / unsigned char 类型去访问buffer，其他类型(sha2_word64)就会报这个错误。
user-0 提问: 请问Windows多线程中，怎么在线程里修改主函数的值呢?比如下例程序中，我要在print线程中修改主函数i的值怎么做呢，修改print函数参数会报错，求帮助！

回复:
user: user-1
content: DWORD WINAPI print(void *p) {  	*(int*)p  = 1; //这里修改主函数i  	for (;;) {  		printf("按Enter键终止运行\n"); 	}  	return 0; }  int main(int argc, char *argv[]) { 	int i = 0;  	HANDLE p = CreateThread(NULL, 0, print, &i, 0, NULL);  	for (;;) {  		getchar(); 		TerminateThread(p, 0); 	}  	return 0; }

user: user-2
content: 线程启动的地方，那个函数中，局部变量的地址 可以传递给子线程 前提是，子线程要比这个函数结束的早 函数结束后，子线程中操作这个地址中的数据，就变成 对野指针进行操作了 还有一个办法是  函数中，动态分配数据，并初始化 而在在子线程中释放内存，不过，这样就不能改动主线程的函数中的数据了 除非二者共享动态分配数据的数据 共享数据，通常需要同步

user: user-3
content: 要在线程中修改变量i的值，可以把i的指针传递到线程函数中，CreateThread的第四个参数就是用来传递东西的

user: user-4
content: 将该值指针作为线程函数参数传递给线程函数，多看看msdn
user-0 提问: vs2015中用%lld输出long类型的数

回复:
user: user-1
content: 选 x86版（32Bits）  输出long,long long 是不同的 x64（64Bits）输出 long,long long 都可以用 %lld

user: user-0
content: 引用 1 楼 qq423399099 的回复:为何不用%ld输出呢 我知道是用%ld输出，但是%lld输出也是对的啊

user: user-2
content: 为何不用%ld输出呢
user-0 提问: 关于SEH的一个问题，为什么反复触发异常呢？

回复:
user: user-0
content: 引用 4 楼 paschen 的回复:看完这篇你就明白了：  http://www.xuebuyuan.com/1618519.html   1) __except(EXCEPTION_CONTINUE_EXECUTION)是让thread回到发生exception的机器指令，不是回到发生exception的C/C++语句； 2) 没有多少适合用__except(EXCEPTION_CONTINUE_EXECUTION)的场合，除非__try部分是用汇编写的。 我在看高端调试时作者反汇编的结果和我的明显不一样，就是我标记的那条指令，我不知道为什么我的这里竟是直接操作寄存器的。 非常感谢提供的地址。

user: user-1
content: 看完这篇你就明白了：  http://www.xuebuyuan.com/1618519.html   1) __except(EXCEPTION_CONTINUE_EXECUTION)是让thread回到发生exception的机器指令，不是回到发生exception的C/C++语句； 2) 没有多少适合用__except(EXCEPTION_CONTINUE_EXECUTION)的场合，除非__try部分是用汇编写的。

user: user-2
content: 话说，对于整型数 1/0 你希望产生什么结果 这结果，数学上合理吗？ 可以用int 类型表示吗？ 恢复后该怎样执行？ 修改寄存器？把被除数 0 改成1？  没有很好的办法，恢复执行1/0 这种异常，必须捕捉后，跳过现场，代码的执行。

user: user-2
content: 异常的处理方式，有两种，一种是返回现场 一种是不返回现场，不返回现场的异常抛出后，中断程序的执行直至捕捉 捕捉后处理完异常，程序向后执行，异常相关的东西，就成为过去了。 返回现场的，一般是资源不足类型的异常，属于可恢复异常， 例如缺页中断，缺页中断的处理程序，是内存调度程序 内存调度后，页面就在内存中了，此后读写就不再出现异常了。 这种异常，通常只是提供给操作系统的资源管理手段 而，除法错误，属于不可恢复异常，不能返回现场继续执行。  异常处理后，不应该继续执行，因为除0中断，恢复后依然是错误，不能继续执行 这种异常出现，就应该退出现场，执行后面不再会导致异常的程序， 而不是重新执行被异常中断的程序。  举例：如果是整型 除法错误，整个表达式求值过程完全没法子处理这个异常 那么最好的处理方式是捕获异常，并退出程序，或者至少退出这个表达式序列的执行 如果是浮点除法错误，可以设置为产生异常。也可以设置为不产生异常 产生异常，由异常处理程序处理，可以退出执行 也可以直接把表达式结果置为无穷大，继续执行 不产生异常。计算结果直接就是无穷大。  总之，不能返回现场，再次执行 除法语句。 否则，就会出现异常一直在触发，捕捉中，构成死循环了

user: user-0
content: 反汇编代码如下： 00161803 f7f9            idiv    eax,ecx     ///这里出的问题，如果是idiv eax, dword ptr [ebp-20h]  就正常了， 00161805 8945d4          mov     dword ptr [ebp-2Ch],eax 00161808 8b45d4          mov     eax,dword ptr [ebp-2Ch] 0016180b 50              push    eax 0016180c 68d86c1600      push    offset ConsoleApplication1!`string' (00166cd8) 00161811 e80ffbffff      call    ConsoleApplication1!ILT+800(_printf) (00161325) 00161816 83c408          add     esp,8 00161819 c745fcfeffffff  mov     dword ptr [ebp-4],0FFFFFFFEh 00161820 eb22            jmp     ConsoleApplication1!main+0xb4 (00161844) 00161822 c745e043000000  mov     dword ptr [ebp-20h],43h  使用的VS2015 编译
user-0 提问: 关于vc++6.0使用出现的问题

回复:
user: user-1
content: 使用mingw，比VS小巧多了。推荐一款基于mingw的IDE：C Free

user: user-2
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn

user: user-3
content: 看看是否兼容，有时它会有兼容性的问题！！

user: user-4
content: 谭浩强赶紧出本新书吧，把过去的bug修补下，最主要的是要引导大家使用新版本的vs，都什么年代了，还在用上个世纪的东西。

user: user-5
content: 解决方法：  http://blog.sina.com.cn/s/blog_4b650d650100qilj.html

user: user-6
content: 换掉VC6 WIN7以上兼容就不是太好了 换成VS http://blog.csdn.net/cometnet/article/details/19551125

user: user-7
content: 汉化版本的问题，具体说是VC的文件位置没有正确配置  解决： 1、手工调整到正确配置（百度上有配置教程） 2、换一个安装包

user: user-8
content: VC++6.0不标准，如果楼主准备长期学习，建议gcc,vs2015

user: user-9
content: 干脆装visual studio 2015吧。community版免费的。
user-0 提问: C语言语句运行时间的问题

回复:
user: user-1
content: 假设完全没有优化，x++ 的时间跟循环的时间相比也可以忽略了。由于各种随机误差都能导致第二个比第一个短。  有优化的话，你得先看看优化成啥样子了 ....

user: user-2
content: 我帮你测试是第一个快  这种+运算是很快的，一个时钟周期就可以执行很多次  且同一段代码你在不同时候执行时间也不会完全一样  所以你这个没太大可比性  其次在debug下测试，不然会被优化了

user: user-3
content: 可以解释的，因为第一个循环，可能堆栈，或者其他内存，还没有实际分配物理内存 需要运行的时候，才会分配（内存调度），而第二个循环，已经是物理内存了，因此，没有内存调度 时间短些，也很正常 这个例子说明，现代操作系统，不很适宜，简单的测量， 程序或者算法的运行时间 尤其是调试的时候

user: user-4

user: user-5
content: 整型变量能到这么大的数么
user-0 提问: 大家给看下POJ的1006，哪里还有问题

回复:
user: user-1
content: for(;d<365&&d>=0&&p<365&&p>=0&&e<365&&e>=0&&i<365&&i>=0;s++) 改为 for(s=0;;s++) 可AC

user: user-2
content: 生理周期   Time Limit: 1000MS  Memory Limit: 10000K  Total Submissions: 128692  Accepted: 40855   Description  人生来就有三个生理周期，分别为体力、感情和智力周期，它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天，人会在相应的方面表现出色。例如，智力周期的高峰，人会思维敏捷，精力容易高度集中。因为三个周期的周长不同，所以通常三个周期的高峰不会落在同一天。对于每个人，我们想知道何时三个高峰落在同一天。对于每个周期，我们会给出从当前年份的第一天开始，到出现高峰的天数（不一定是第一次高峰出现的时间）。你的任务是给定一个从当年第一天开始数的天数，输出从给定时间开始（不包括给定时间）下一次三个高峰落在同一天的时间（距给定时间的天数）。例如：给定时间为10，下次出现三个高峰同天的时间是12，则输出2（注意这里不是3）。  Input  输入四个整数：p, e, i和d。 p, e, i分别表示体力、情感和智力高峰出现的时间（时间从当年的第一天开始计算）。d 是给定的时间，可能小于p, e, 或 i。 所有给定时间是非负的并且小于365, 所求的时间小于21252。   当p = e = i = d = -1时，输入数据结束。  Output  从给定时间起，下一次三个高峰同天的时间（距离给定时间的天数）。   采用以下格式：  Case 1: the next triple peak occurs in 1234 days.   注意：即使结果是1天，也使用复数形式“days”。  Sample Input 0 0 0 0 0 0 0 100 5 20 34 325 4 5 6 7 283 102 23 320 203 301 203 40 -1 -1 -1 -1  Sample Output Case 1: the next triple peak occurs in 21252 days. Case 2: the next triple peak occurs in 21152 days. Case 3: the next triple peak occurs in 19575 days. Case 4: the next triple peak occurs in 16994 days. Case 5: the next triple peak occurs in 8910 days. Case 6: the next triple peak occurs in 10789 days.
user-0 提问: 求解！《C语言入门经典》案例12.1原封不动输入到cfree 5.0中，提示无法打开文件用于写入数据

回复:
user: user-1
content: 引用 2楼我是你的主体 的回复: 真是不好意思，我还以为是编译器设置问题呢。原来 是自己精心大意，见笑了！看来编译前最好自己检查下，不能完全相信程序。 谢谢！解决了记得结帖

user: user-0
content: 真是不好意思，我还以为是编译器设置问题呢。原来 是自己精心大意，见笑了！看来编译前最好自己检查下，不能完全相信程序。 谢谢！

user: user-1
content: 你的if (!(pfile = fopen(filename, "w")));最后多了一个分号 下面的if (!(pfile = fopen(filename, "r")));这句也是
user-0 提问: 变量用float与用double类型最后的结果不一样，但是数字还很小啊，没有超范围，求解。

回复:
user: user-0
content: 谢谢各位啦，的确是输入的时候控制字符串错误了，换成%f之后的确是对的。谢谢诶这么仔细的看我的代码，问题也很好地一针见血地指出，万分感谢！

user: user-1
content: 所以，%f 输出 double 这个设计，真的会误导人 %f--->float 输入输出 %lf --->double 输入输出，各负其责多好，不知道C,C++标准为何 要合并 float 和double 的输出格式。 难道仅仅因为 输出float ,double 的时候，其实只是在输出 double? 并没有输出float 过?

user: user-2
content: 你用%lf读入到float当然不对了（可能丢失了4个字节的数据）

user: user-3
content: float时应该用scanf("%f")
user-0 提问: 一个关于c语言的问题，新人求解答

回复:
user: user-1
content: 再简洁只能查表了.

user: user-0
content: 引用 1 楼 user-3 的回复:n.month == 1 || n.month == 3 || .....  谢谢解答！ 有没有简洁点的写法，如果后面集合太大怎么解决阿

user: user-2
content: 遍历你的集合，然后一个个判断。。

user: user-0
content: 谢谢解答！ 有没有简洁点的写法，如果后面集合太大怎么解决阿

user: user-3
content: n.month == 1 || n.month == 3 || .....
user-0 提问: C语言数组特定元素赋值

回复:
user: user-1
content: 5楼正解，请使用兼容C99的编译器编译，比如gcc

user: user-2
content: 这个毫无疑问是C99的新特性，因为微软对C++的执着，MSVC编译器对C语言的标准只支持到C90。具体写法：  EXAMPLE 11 Designators can be used to provide explicit initialization when unadorned initializer lists might be misunderstood: struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 }; EXAMPLE 12 Space can be ‘‘allocated’’ from both ends of an array by using a single designator: int a[MAX] = { 1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0 };

user: user-3
content: 这个应该不是C89标准，可能在C99或者更高版本的C标准里面才有吧，或者这是某家编译器自身定义的扩展，并不是C语言标准，并不是所有编译器都支持的。像gcc自身就支持很多新特性，但是并不在C语言标准里面，vs并不支持这些特性。

user: user-4
content: struct A b[] =  []内要有个数，编译器需要知道有几个元素的

user: user-5
content: 少个{。。。

user: user-6
content: 换个编译器比如vs的
user-0 提问: Windows编程 RegisterClass 窗口注册意义

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:///主窗口 wndclass.lpszClassName = szAppName;///这个用于区分不同窗口类 wndclass.lpfnWndProc = WndProc; ///这个用于必要时，调用窗口过程函数  ///子窗口 wndclass.lpszClassName = szChildClass; wndclass.lpfnWndProc = ChildWndProc;  主窗口是 WinMain 中 CreateWindow 直接创建的 子窗体 在主窗体的 WndProc 函数响应  WM_CREATE 时候，调用CreateWindow 创建 创建主窗体，第一个参数 szAppName 和 RegisterClass 时候，wndclass.lpszClassName 是相同的 hwnd = CreateWindow(szAppName, TEXT("Checker3 Mouse Hit-Test Demo"),         WS_OVERLAPPEDWINDOW,         CW_USEDEFAULT, CW_USEDEFAULT,         CW_USEDEFAULT, CW_USEDEFAULT,         NULL, NULL, hInstance, NULL);   hwndChild[x][y] = CreateWindow(szChildClass, NULL,。。。。。。 子窗体的 第一个参数，和注册子窗体时候 wndclass.lpszClassName 是相同的 操作系统，通过 这个参数，查找这个记录下来的窗体类 按照注册信息，创建窗体 按照注册的 wndclass.lpfnWndProc  参数，调用窗口过程函数   就是这么回事 注册就是记录下来 创建的时候去查找 调用函数的时候，也去查找 原来是这样啊，太感谢了

user: user-1
content: ///主窗口 wndclass.lpszClassName = szAppName;///这个用于区分不同窗口类 wndclass.lpfnWndProc = WndProc; ///这个用于必要时，调用窗口过程函数  ///子窗口 wndclass.lpszClassName = szChildClass; wndclass.lpfnWndProc = ChildWndProc;  主窗口是 WinMain 中 CreateWindow 直接创建的 子窗体 在主窗体的 WndProc 函数响应  WM_CREATE 时候，调用CreateWindow 创建 创建主窗体，第一个参数 szAppName 和 RegisterClass 时候，wndclass.lpszClassName 是相同的 hwnd = CreateWindow(szAppName, TEXT("Checker3 Mouse Hit-Test Demo"),         WS_OVERLAPPEDWINDOW,         CW_USEDEFAULT, CW_USEDEFAULT,         CW_USEDEFAULT, CW_USEDEFAULT,         NULL, NULL, hInstance, NULL);   hwndChild[x][y] = CreateWindow(szChildClass, NULL,。。。。。。 子窗体的 第一个参数，和注册子窗体时候 wndclass.lpszClassName 是相同的 操作系统，通过 这个参数，查找这个记录下来的窗体类 按照注册信息，创建窗体 按照注册的 wndclass.lpfnWndProc  参数，调用窗口过程函数   就是这么回事 注册就是记录下来 创建的时候去查找 调用函数的时候，也去查找
user-0 提问: 有个关于fread函数的问题请教下论坛的高手

回复:
user: user-0
content: 引用 6 楼 lm_whales 的回复:链表从文件里读取，很容易啊，读到一个数据，插入链表 很多书中，创建链表就是这么创建的。 链表里面的数据写入数据，也很简单直接写入就是了 唯一比较麻烦的就是链表对数据的管理不方便，需要循环查找 数组就比较方便，可以随机查找  如果真的需要在文件里创建链表， 那就自己做个分配文件位置的函数（包括回收） 可以模拟内存释放和回收 这样就可以内存链表 的数据，写入文件链表了 不过这个要麻烦点 嗯，确实是，链表找个数据还要从头找，数组可以直接指定位置，那我再多练练数组的操作，谢谢了，鲸鱼哥。

user: user-0
content: 引用 5 楼 qq423399099 的回复:你的if后面貌似多了个分号？ 哈哈，瞧我这眼神，分号输习惯了，确实问题是出在分号上，输了分号，if语句就断开了，我说怎么加了if总是要触发if语句，谢谢舞版。

user: user-1
content: 不是if的问题，这里fread返回值为读取字节数，应该没有问题

user: user-2
content: struct student {     long num;                    struct student *next;    } ;  fwrite (&p->num,sizeof(p->num),1,fp); 这样就可以写入了

user: user-2
content: 链表从文件里读取，很容易啊，读到一个数据，插入链表 很多书中，创建链表就是这么创建的。 链表里面的数据写入数据，也很简单直接写入就是了 唯一比较麻烦的就是链表对数据的管理不方便，需要循环查找 数组就比较方便，可以随机查找  如果真的需要在文件里创建链表， 那就自己做个分配文件位置的函数（包括回收） 可以模拟内存释放和回收 这样就可以内存链表 的数据，写入文件链表了 不过这个要麻烦点

user: user-3
content: 你的if后面貌似多了个分号？

user: user-0
content: 引用 1 楼 lm_whales 的回复:链表读写，只需要读写数据就行了， 指针， 就不要读写了 因为从磁盘上读取的指针，并不是此刻创建的，而是存储时候链表中的指针 你好，鲸鱼哥。我存盘数据的时候是直接存放有效数据吗？那fwrite的sizeof应该怎么写呢？我试过用数组，数组用起来没什么问题，但是数组之间应该怎样联系起来呢？用链表可以用一个开辟一个内存空间的，数组好像是定义了多大就占多大，是这样吗？

user: user-0
content: 引用 2 楼 qq423399099 的回复:你这个是将next指针的地址也存到文件里了？ 这种虚拟地址程序每次运行都可能不同，存下地址是没用的。 你好小灸舞，我这个练习主要想实现这个功能，从文件读取数据，然后进行插入，删除操作，操作后将修改的数据又存起来。我看fwrite函数是按照结构体的大小来存放数据的，如果只存数据，那么读取的时候我应该按怎样的数据大小来读取数据呢？是直接读取的num成员吗？还有就是对fread进行判断的if函数，为什么用了if函数fread返回值就变了呢？直接用fread函数返回值却又是正常的，这点实在不明白为什么。

user: user-3
content: 你这个是将next指针的地址也存到文件里了？ 这种虚拟地址程序每次运行都可能不同，存下地址是没用的。

user: user-2
content: 链表读写，只需要读写数据就行了， 指针， 就不要读写了 因为从磁盘上读取的指针，并不是此刻创建的，而是存储时候链表中的指针
user-0 提问: 为什么从配置文件中读取的参数严重拖慢程序速度？

回复:
user: user-1
content: 推荐楼主使用软件filemon

user: user-1
content: 关闭杀毒软件的实时防护功能。

user: user-2
content: 引用 11 楼 zscdzh 的回复:[quote=引用 10 楼 lm_whales 的回复:] 编码错误，  if (1==sscanf(buf,"x1=%f",&x1)) break; 读到一个正确的数据，你就退出了 这个代码，不打算正常工作啊，这是 是不是手误啊 改成   if (1!=sscanf(buf,"x1=%f",&x1)) break; 世事  哦，这个是我debug的时候弄的，因为我发现只要从配置文件中读一个参数，程序就慢三倍了，效果立竿见影...所以其他参数都是写在代码里面的，目前只读一个参数debug[/quote] 参数这么少，直接一次读出。 需要的时候，写到文件里。 如果，参数多了，直接开数据库 这种读法，效率不会高 但是60秒这个真不知道咋回事 写文件，读文件不会这么慢的

user: user-3
content: 引用 4 楼 u011609112 的回复:[quote=引用 3 楼 paschen 的回复:] 先用性能工具分析下代码，看下执行哪些语句耗时多，然后再下结论和找原因  推荐一下一般的性能工具，还没用过，简单实用的[/quote]  VS就自带有，百度搜一下怎么用

user: user-0
content: 引用 10 楼 lm_whales 的回复:编码错误，  if (1==sscanf(buf,"x1=%f",&x1)) break; 读到一个正确的数据，你就退出了 这个代码，不打算正常工作啊，这是 是不是手误啊 改成   if (1!=sscanf(buf,"x1=%f",&x1)) break; 世事  哦，这个是我debug的时候弄的，因为我发现只要从配置文件中读一个参数，程序就慢三倍了，效果立竿见影...所以其他参数都是写在代码里面的，目前只读一个参数debug

user: user-2
content: 编码错误，  if (1==sscanf(buf,"x1=%f",&x1)) break; 读到一个正确的数据，你就退出了 这个代码，不打算正常工作啊，这是 是不是手误啊 改成   if (1!=sscanf(buf,"x1=%f",&x1)) break; 世事

user: user-0
content: 引用 8 楼 lm_whales 的回复:这样啊，文件读取应该比手动输入快得多才对 同样输出到文件，比输出到屏幕要快得多 你这不是读写文件的问题 一个较大的可能是，存储文件的磁道有问题 正常读写文件。不会消耗多少时间的 秒级读写，已经是很慢很慢的了 几十个参数的话，是毫秒级的，甚至更快 不清楚你这是什么情况 不会是电脑中了病毒了吧  应该不是吧，中病毒应该没这效果...其他计算程序都是没问题的 所以我才纳闷啊，我把从参数文件里面读取的值在后面又赋值一遍，速度还是慢，这样看起来是读取参数语句的问题，但是我把读取参数的语句保存，读取一个在后面用不上的参数，速度又正常了！ 我真是....

user: user-2
content: 这样啊，文件读取应该比手动输入快得多才对 同样输出到文件，比输出到屏幕要快得多 你这不是读写文件的问题 一个较大的可能是，存储文件的磁道有问题 正常读写文件。不会消耗多少时间的 秒级读写，已经是很慢很慢的了 几十个参数的话，是毫秒级的，甚至更快 不清楚你这是什么情况 不会是电脑中了病毒了吧

user: user-0
content: 引用 6 楼 lm_whales 的回复:小文件，直接全部读到内存，就可以了 大文件，要么分段处理，要么采用别的工具处理（数据库，注册表，.ini ） 这么读来读去的不是个事情。  谢谢！ 参数文件不大，就十几个参数，问题在于我读取参数后，程序主循环变慢了好多，当然读取参数不在主循环里面，所以我很难理解，从键盘中scanf得到的参数不会对计算速度造成任何影响，一旦从配置文件中读取哪怕一个参数，就会导致程序慢三倍...

user: user-2
content: 小文件，直接全部读到内存，就可以了 大文件，要么分段处理，要么采用别的工具处理（数据库，注册表，.ini ） 这么读来读去的不是个事情。

user: user-2
content: 可以Windows 用API函数读取配置文件 当然手工读取也是可以的 关键问题是，查找比较耗时吧（文件中查找，要反复来回读取，这太折腾了） 读取不费什么时间 也许可以用内存映射文件方式读写

user: user-4
content: 引用 3 楼 paschen 的回复:先用性能工具分析下代码，看下执行哪些语句耗时多，然后再下结论和找原因  推荐一下一般的性能工具，还没用过，简单实用的

user: user-0
content: 多谢各位！ 问题差不多解决了，导致速度慢的情况只会出现在x1和dx这两个参数上，这两个参数是我用来划分计算网格的，虽然还不知道为什么会这样，但是对我的程序已经影响不大了，有空再仔细分析一下，谢谢各位！

user: user-0
content: 感觉从文件里读出来的参数有毒...... 我新建了一个变量，从txt中读出，然后把它赋值给真正用上的变量，结果还是变慢了....

user: user-0
content: 引用 14 楼 zhao4zhong1 的回复:关闭杀毒软件的实时防护功能。  试了一下，关掉了windows defends实时防护，还是那样 而且这也解释不了为什么我读一个用不上的数据，可以读而且对速度没有影响，一旦我读入一个参数，哪怕后面对参数在程序内再次赋值，也会造成程序变慢 这个程序变慢应该是每一步计算都变慢了，因为我有实时计算结果的二维显示图像 感觉像是这个读取让我的参数结构变化了，精度扩大了好多位，然后计算就慢了，但是这个读取的不是float么...

user: user-3
content: 先用性能工具分析下代码，看下执行哪些语句耗时多，然后再下结论和找原因

user: user-0
content: 我需要的是从文件中读取参数啊，从配置文件中读取每一个需要的参数，你这个是打印吧？ 无论如何，多谢回复！

user: user-5
content: 要不试试我的？ http://blog.csdn.net/u010370871/article/details/50508859
user-0 提问: 关于位域和字节序的问题

回复:
user: user-1
content: 位域涉及 位序，和字节序这两个东西，都是不确定的，由实现决定 所以没啥可讨论的。  如果 有字节序问题，可以校正（网络传播都会处理好的） 位序问题，也是一样。 如果位域存到文件里，最好标注字节序，和位序 这样读取的时候，就可以按照不同的位序，字节序处理了 位序测定，直接用一个字节的位段检测 字节序检测，直接用int (例如和 char 数组的union） 检测 字节序，intel x86系列CPU,和motorola 68XXX系列CPU  作为字节序类型的两个代表，一个为小端的话，另一个就是大端。  另外，我看到过字节序的两种，大小端的说法， 一种说intel 是小端， 一种说是大端，不知道为什么 PS: 一般程序都不关心位序，因为不同位序的程序，编译好以后，一般不影响使用 除非存为文件，供别的程序使用 字节序，往往也是存为文件，或者网上传播，才会有问题

user: user-2
content: 引用前后两个变量哪个表示低位，哪个表示高位。  这个东西是 implementation-defined ，意味着不同的实现可能不同 ...
user-0 提问: 为什么scanf输入的值会发生变化呢？

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 在输出字符之前最好调用一下这个 fflush(stdin); 把这个放在scanf的前面，可以清除之输入的缓存区。

user: user-3
content: 如果你用BCD码存储浮点数，那结果就是精确的，因为他是按十进制方式来存储的

user: user-4
content: 保存和运算的方式不一样  比如下面这个： 在带有 数值型 数据类型的字段中，小数部分的长度在创建该字段的设计时就被确定了。小数部分的长度是总长度的一部分。例如，如果指定了数值型字段的长度是 6，而小数设置为 4，则该字段可以存储的最大值是 9.9999。

user: user-0
content: 引用 5 楼 liups 的回复:[quote=引用 2 楼 Atom2004 的回复:] 哦，原来如此。  顺便问一下，为什么想C#和MATLAB这种语言就不会有这样的问题呢？  我把同样的这几个数值放到C#里面，打印出来的值都是准确的。 有些语言支持原样保存[/quote]  什么是原样保存啊？那难道他进行计算的时候不会产生误差吗？

user: user-4
content: 引用 2 楼 Atom2004 的回复:哦，原来如此。  顺便问一下，为什么想C#和MATLAB这种语言就不会有这样的问题呢？  我把同样的这几个数值放到C#里面，打印出来的值都是准确的。 有些语言支持原样保存

user: user-5
content: float：最多能有7位有效数字，但绝对能保证的为6位，也即float的精度为6~7位有效数字； double：同理，double的精度为15~16位。 也可以看看这篇：http://www.cnblogs.com/jiahu-Blog/p/4502990.html

user: user-0
content: 引用 1 楼 qq423399099 的回复:大部分浮点数在内存无法精确存储，仅仅只是存储一个近似值。 所以我们比较浮点数的时候，需要设置一个误差值，如果两者相减小于误差值，我们就认为这两个数相等。 http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html  再请教一下，那一般float和double，这个误差值设置多少合理呢？

user: user-0
content: 哦，原来如此。  顺便问一下，为什么想C#和MATLAB这种语言就不会有这样的问题呢？  我把同样的这几个数值放到C#里面，打印出来的值都是准确的。

user: user-5
content: 大部分浮点数在内存无法精确存储，仅仅只是存储一个近似值。 所以我们比较浮点数的时候，需要设置一个误差值，如果两者相减小于误差值，我们就认为这两个数相等。 http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html
user-0 提问: C语言：for嵌套实现4*5矩阵

回复:
user: user-1
content: 引用 9楼我是你的主体 的回复:[quote=引用 8 楼 小灸舞的回复:]C89规定，在任何执行语句之前，在块的开头声明所有局部变量。 在C99以及C++中则没有这个限制，即在首次使用之前，可在块的任何位置都可以声明变量。 而你用的VC6实在是太老了，如果不是一定要用VC6建议换一个IDE 噢，Soga。原来如此，谢谢大神哈[/quote]解决了记得结帖

user: user-2
content: C语言要求变量在语句前先要声明，而C++则无限制

user: user-1
content: 因为你是.c的 文件，变量的定义都要放在代码前面

user: user-0

user: user-0
content: 补充:j/i还有j+=i是因为矩阵是这样的 (-^〇^-)

user: user-3
content: /*打印输出4*5矩阵 1 2 3  4  5 2 4 6  8  10 3 6 9  12 15 4 8 12 16 20 */ #include <stdio.h> #include <math.h> int main() { 	//int a[4][5]; 	int i,j; 	for(i=1;i<5;i++) 	{ 		for(j=1;j<6;j++) 			printf("%d\t",i*j); 		printf("\n"); 	} 	return 0; }

user: user-0
content: 引用 8 楼 小灸舞的回复:C89规定，在任何执行语句之前，在块的开头声明所有局部变量。 在C99以及C++中则没有这个限制，即在首次使用之前，可在块的任何位置都可以声明变量。 而你用的VC6实在是太老了，如果不是一定要用VC6建议换一个IDE 噢，Soga。原来如此，谢谢大神哈

user: user-1
content: C89规定，在任何执行语句之前，在块的开头声明所有局部变量。 在C99以及C++中则没有这个限制，即在首次使用之前，可在块的任何位置都可以声明变量。 而你用的VC6实在是太老了，如果不是一定要用VC6建议换一个IDE

user: user-0
content: 引用 4 楼 user-4的回复:for(int j=1;j<=5;j++)  // 这样清楚一点   printf("%d\t",i*j); printf("\n"); 嗯嗯，那样改可以。不过不懂为什么我那样写会报错

user: user-0
content: 引用 4 楼 user-4的回复:for(int j=1;j<=5;j++)  // 这样清楚一点   printf("%d\t",i*j); printf("\n"); 试了一下，这里没问题，还是会报错呢。

user: user-0
content: 引用 3 楼 小灸舞的回复:因为你是.c的 文件，变量的定义都要放在代码前面 不太懂呢，定义是在使用前，第一个for定义的i在第二个for里面也是有效的呀。

user: user-4
content: for(int j=1;j<=5;j++)  // 这样清楚一点   printf("%d\t",i*j); printf("\n");
user-0 提问: 继续新人求救命，free之后求链表长度

回复:
user: user-0
content: 这个改法是把NULL赋给头指针吗？ 虽然可以……但是函数的声明是给定的……不然早就改了 从getlength入手跳过读取头指针似乎也不太可能吧…… 啊啊啊啊啊

user: user-1
content: 那就void LinkTable_free(Link_t oLink)改成有返回值的函数： Link_t LinkTable_free(Link_t oLink)

user: user-0
content: 没错啊，就是这个问题，按理说用二重指针可以解决，但是boss不让用……

user: user-2
content: 你在LinkTable_free中最后oLink = NULL; 并没有修改到主函数中的head_point参数，而只是将临时参数对象设置为NULL而已  所以你之后在主函数中再调用LinkTable_getLength(head_point)时，head_point的值并不是NULL，你只是把指针指向的内存释放了，但指针仍指向那块内存

user: user-0
content: 用变量？指的是在主函数里吗？

user: user-1
content: 引用 6楼我是你的主体 的回复:其实我一开始用的就是带头节点，后来说没要求就撤掉了……不过当时free函数是连着头结点一起删的。 这个似乎可以啊……我去商量一下 但总之如果不改要求的话这个错误就没法纠正的吧？ 或者你拿变量纪录节点个数

user: user-0
content: 其实我一开始用的就是带头节点，后来说没要求就撤掉了……不过当时free函数是连着头结点一起删的。 这个似乎可以啊……我去商量一下 但总之如果不改要求的话这个错误就没法纠正的吧？

user: user-1
content: 或者你应该设计成带头结点的链表（头结点不要放数据） LinkTable_free函数里仅仅需要把有数据的结点都free掉，头结点等到程序结束前在主函数free
user-0 提问: 编写一个打印的宏

回复:
user: user-1
content: C++11可以  http://en.cppreference.com/w/cpp/preprocessor/replace 里面的(3)

user: user-2
content: VC++是可以的。

user: user-3
content: 这样试试看  #if defined(COMBINED_DEBUG) #    define XX_PRINTF printf #else #    define XX_PRINTF  // #endif

user: user-4
content: 引用 11 楼 mLee79 的回复:远古时期大家都是下面这样,  移植性最好,  C99 后可以 像9楼...  #if defined(COMBINED_DEBUG) #    define XX_PRINTF(expression)   printf  expression #else #    define XX_PRINTF(expression) #endif  唯一不好的就是使用的时候要多打一对括号,   XX_PRINTF(("Hello %d\n", 100));++

user: user-5
content: 远古时期大家都是下面这样,  移植性最好,  C99 后可以 像9楼...  #if defined(COMBINED_DEBUG) #    define XX_PRINTF(expression)   printf  expression #else #    define XX_PRINTF(expression) #endif  唯一不好的就是使用的时候要多打一对括号,   XX_PRINTF(("Hello %d\n", 100));

user: user-6
content: 引用 9 楼 lm_whales 的回复:1）还可以这样定义，不知老板的编译器支持不支持 #include <stdio.h>  #if defined(COMBINED_DEBUG) #define Print printf #else #define Print(...) #endif // COMBINED_DEBUG  2）或者： #ifdef NDEBUG #define Print printf #else #define Print(...) ((int)(0)) #endif // COMBINED_DEBUG  1）没有警告，但不知道早期板本支持不支持 2）有警告，但是更符合  printf 函数输出的情况，因为 printf 又返回值  这两种VC 6.0都无法通过。

user: user-4
content: 1）还可以这样定义，不知老板的编译器支持不支持 #include <stdio.h>  #if defined(COMBINED_DEBUG) #define Print printf #else #define Print(...) #endif // COMBINED_DEBUG  2）或者： #ifdef NDEBUG #define Print printf #else #define Print(...) ((int)(0)) #endif // COMBINED_DEBUG  1）没有警告，但不知道早期板本支持不支持 2）有警告，但是更符合  printf 函数输出的情况，因为 printf 又返回值

user: user-4
content: 。。\。。。\main.cpp|57|warning: left operand of comma operator has no effect [-Wunused-value]| 可能会有警告 另外，逗号表达式可单独出现，加上分号，变成表达式语句的，加不加小括号都可以。 有时候，用逗号表达式，或者， 单个变量名的表达式 用来消除，（形参）变量定义了，但是没有使用的警告。

user: user-6
content: 引用 5 楼 u010165006 的回复:[quote=引用 4 楼 lm_whales 的回复:] 这么做的,看看行不？ #if defined(COMBINED_DEBUG) #    define XX_PRINTF printf #else #    define XX_PRINTF #endif  XX_PRINTF("%d",i); 变成 ("%d",i); // 编译能过吗？[/quote]  试了一下没问题

user: user-4
content: 能啊，这是逗号表达式外加括号  引用 5 楼 u010165006 的回复:[quote=引用 4 楼 lm_whales 的回复:] 这么做的,看看行不？ #if defined(COMBINED_DEBUG) #    define XX_PRINTF printf #else #    define XX_PRINTF #endif  XX_PRINTF("%d",i); 变成 ("%d",i); // 编译能过吗？[/quote]

user: user-6
content: 引用 4 楼 lm_whales 的回复:这么做的,看看行不？ #if defined(COMBINED_DEBUG) #    define XX_PRINTF printf #else #    define XX_PRINTF #endif  XX_PRINTF("%d",i); 变成 ("%d",i); // 编译能过吗？

user: user-4
content: 这么做的,看看行不？ #if defined(COMBINED_DEBUG) #    define XX_PRINTF printf #else #    define XX_PRINTF #endif

user: user-6
content: 如果调试输出的不多，也可以每次： #ifdef _DEBUG printf(.........) #endif
user-0 提问: 数据结构：树的每个节点都有随机数个子节点，节点结构体如何定义？

回复:
user: user-1
content: struct Node {  int n;  struct Node **children; } root;

user: user-2
content: 一个节点的第一个子节点作为它的child，其它兄弟节点作为child节点的next节点。
user-0 提问: 求帮助，邮槽通信问题【C语言】

回复:
user: user-0
content: 你的意思是用共享内存吗？这个我今天也刚刚自己打了，也是那个问题。你有例子吗，可以发给我看下吗

user: user-1
content: 要么改成内存映射文件好了，这个网上例子多。
user-0 提问: C语言，c primer plus 5，第七章求“ei"的次数

回复:
user: user-1
content: int count (const char *str) { 	int ret = 0 ; 	int state = 0 ; 	for (int i = 0 ; str[i] != '#' ; i++) { 		if (state == 0 && str[i] == 'e') { 			state = 1 ; 		} else if (state == 1 && str[i] == 'i') { 			ret++ ; 			state = 0 ; 		} else { 			state = 0 ; 		} 	} 	return ret ; }  int main () { 	printf ("%d\n" ,count ("eiieiieiss#")) ; 	return 0 ; }

user: user-1
content: =是赋值运算符 ==才是比较运算符
user-0 提问: 请问在VS2015上写的C程序给别人用都会提示缺少运行库，除了让别人提前安装运行库外，还有没有其他的方法？

回复:
user: user-1
content: 如果是小工程，就用低版本的vs 如果是大工程，就直接把所有需要的动态库一起拷贝过去

user: user-2
content: 项目菜单 -> 属性 ， 在对话框中 选择配置属性-->常规， 然后在配置类型中改。

user: user-3
content: 引用 4 楼 yyxgs 的回复:[quote=引用 2 楼 liups的回复:][quote=引用 1 楼 liups 的回复:] 你把运行库都拷上 或者静态编译[/quote] 静态编译？怎么操作呢？[/quote]  工程属性之类的地方找设置

user: user-0
content: 引用 3 楼 小灸舞的回复:用依赖库查看软件，比如procexp 将需要用到的DLL都一起拷贝过去就行了 除了这个，还有其他的方法吗？

user: user-0
content: 引用 2 楼 liups的回复:[quote=引用 1 楼 liups 的回复:] 你把运行库都拷上 或者静态编译[/quote] 静态编译？怎么操作呢？

user: user-4
content: 用依赖库查看软件，比如procexp 将需要用到的DLL都一起拷贝过去就行了

user: user-3
content: 引用 1 楼 liups 的回复:你把运行库都拷上 或者静态编译

user: user-3
content: 你把运行库都拷上
user-0 提问: c语言函数调用

回复:
user: user-1
content: 引用 14 楼 qaz_7 的回复:但是这样做运行结果什么都没有诶  我预想的运行结果是2 4 6 8 10 得到这种结果很容易，关键是不知道你的思路

user: user-2
content: #include<stdio.h> void fun(int n) { 	while (1) 	{ 		printf("%d ", n); 		n = n + 2; 		if (n == 12) 			return; 	} }  int main() { 	int n; 	printf("结果是:"); 	fun(2); 	 }

user: user-0
content: 但是这样做运行结果什么都没有诶  我预想的运行结果是2 4 6 8 10

user: user-1
content: fun(2); 替换成 n=fun(2);

user: user-1
content: 引用 11 楼 qaz_7 的回复:[quote=引用 9 楼 liups 的回复:] [quote=引用 7 楼 u010165006 的回复:] main函数也没有调用fun函数，楼主是不是写错了。  但是人家调用了printf[/quote]  #include<stdio.h> int fun(int n) { 	while(n%2==0) 	{ 		n=n+2; 	} 	if(n==10) 		return 0; 	else     	return n; }  int main()  { 	int n; 	fun(2); 	printf("结果是：%d",n); }[/quote]  调用了fun，但是丢弃了fun的返回值！

user: user-0
content: 引用 9 楼 liups 的回复:[quote=引用 7 楼 u010165006 的回复:] main函数也没有调用fun函数，楼主是不是写错了。  但是人家调用了printf[/quote]  #include<stdio.h> int fun(int n) { 	while(n%2==0) 	{ 		n=n+2; 	} 	if(n==10) 		return 0; 	else     	return n; }  int main()  { 	int n; 	fun(2); 	printf("结果是：%d",n); }

user: user-3
content: 路过

user: user-1
content: 引用 7 楼 u010165006 的回复:main函数也没有调用fun函数，楼主是不是写错了。  但是人家调用了printf

user: user-4

user: user-5
content: main函数也没有调用fun函数，楼主是不是写错了。

user: user-2
content: 编译器给你分配的虚拟地址。

user: user-6
content: 你用十六进制打印，就看起来正常一点！

user: user-0
content: 为什么n的地址是2293324？

user: user-0
content: 打印n的运算结果

user: user-0
content: printf("结果是：%d",&n); 这里多了一个&

user: user-2
content: 楼主想干嘛？ 你这个打印的是n的地址。。。
user-0 提问: 编写程序希望实现两个链表合成一个新链表，编译没报错但是实现不了，希望大神给看看~

回复:
user: user-1
content: 好像没啥问题。 1.你那两句malloc最好强转一下：List pnew = (List)malloc(sizeof(pnew)); 2.List ptemp = malloc(sizeof(ptemp));也不需要malloc（你这样直接造成内存泄漏），直接让它指向phead就行了  List addback(List phead, int data)//利用返回值实现尾插  { 	List pnew = (List)malloc(sizeof(pnew)); 	pnew->pNext = NULL; 	pnew->data = data;  	if (phead == NULL) 	{ 		phead = pnew; 	} 	else 	{ 		List ptemp = phead; 		while (ptemp->pNext != NULL) 		{ 			ptemp = ptemp->pNext; 		} 		ptemp->pNext = pnew; 	}  	return phead; }
user-0 提问: 求一个算法的思想和实现的方式

回复:
user: user-0
content: 引用 1 楼 cyfcsd 的回复:没看懂楼主的思路。。。  求给个思路 怎么实现赛马程序 上面这代码 你无视他就好！（因为我自己也看不明白了）

user: user-1
content: 没看懂楼主的思路。。。
user-0 提问: c/c++ 结构体分配内存问题 1C

回复:
user: user-1
content: strlen(t->fname)+1错了，strlen函数本身已经包含结束符了，你又加1，结果内存溢出了。

user: user-2
content: memcpy(p_rrq->req, t->fname, strlen(t->fname)+1);   memcpy(p_rrq->req + strlen(t->fname) + 1, t->mode,  strlen(t->mode)+1);  这样行吗？

user: user-0
content: 引用 5 楼 cyfcsd 的回复:[quote=引用 4 楼 dcy_xm 的回复:] 完整代码有点多 还需要自己的函数接口 没法给你 那是什么问题啊，编译通不过，还是运行时程序崩溃啊[/quote]  指针问题吧 结构体中的指针分配内存的时候是不是有问题。然后不能给其赋值？

user: user-0
content: 运行时 内存问题。程序崩溃。

user: user-2
content: 引用 4 楼 dcy_xm 的回复:完整代码有点多 还需要自己的函数接口 没法给你 那是什么问题啊，编译通不过，还是运行时程序崩溃啊

user: user-0
content: 完整代码有点多 还需要自己的函数接口 没法给你

user: user-2
content: 引用 2 楼 dcy_xm 的回复:VS2010 不是这个环境，是完整的代码的意思

user: user-0
content: VS2010

user: user-2
content: 请给出可运行的代码环境，这样太不好调试了