Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 如何将一个函数中的局部变量用指针调用到另一个函数中去

回复:
user: user-1
content: 引用 9 楼 zdlhsq 的回复:！！！要是定义了全局变量，要怎么实现在上一个函数里运算，下一个函数里调用上一个函数运算的值。！！！  赵老师已经给了这个问题和答案了. 全局变量即是全局的,  你的上一个函数可以把运算结果保存到这个全局变量中, 下一个函数就可以使用这个全局变量得到上一个函数运算的值.  我把赵老师的代码给你注释下  #include <stdio.h> int g_var;   //全局变量 定义 void fun1() {  gvar++;   //fun1中计算修改了全局变量, 相当于你计算了一个值, 保存在全局变量中了. } void fun2() {  gvar*=2;  //第二个函数中直接使用这个全局变量, 它不但使用这上一个函数的计算结果, 自己也会计算并保存一个值到全局变量中 } int main() {  g_var=1;  fun1();  //执行完这个, g_var = 2;  内部自加1了  fun2();  //执行完这个函数  g_var = 4;    内部使用上个函数计算结果2, 然后2*2=4  printf("%d\n",g_var);  //这里会输出4  return 0; }

user: user-2
content: 函数里用局部指针, 局部指针返回

user: user-3
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-3
content: 引用 16 楼 zdlhsq 的回复:感谢两位的指导，明白了，不过我采用了#15楼的方法。 引用 8 楼 zhao4zhong1 的回复:使用全局变量不会麻烦死人的。 不使用全局变量也不会爽死人的。  在今后的峥嵘岁月中，用心体会我这两句话。

user: user-0
content: 感谢两位的指导，明白了，不过我采用了#15楼的方法。

user: user-4
content: 在外部定义，然后作为这两个函数的参数。

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:使用全局变量不会麻烦死人的。 不使用全局变量也不会爽死人的。   要是定义了全局变量，要怎么实现在上一个函数里运算，下一个函数里调用上一个函数运算的值呢？

user: user-0
content: 引用 4 楼 xiaohuh421 的回复:既然是局部变量, 那就不要想了,  这是危险的, 结果是不可预知的.  可以是局部静态变量,全局变量等等  ！！！要是定义了全局变量，要怎么实现在上一个函数里运算，下一个函数里调用上一个函数运算的值。！！！

user: user-3
content: 使用全局变量不会麻烦死人的。 不使用全局变量也不会爽死人的。

user: user-5
content: 这么一个程序各种goto，真是醉了，要么加static了return，要么全局变量

user: user-6
content: 静态局部变量作用域受到限制， 搞一个全局变量。  为什么到处充满了goto

user: user-7
content: 同一文件可以static，否则只能全局，这种变量在小程序无所谓，程序大了就要小心

user: user-1
content: 既然是局部变量, 那就不要想了,  这是危险的, 结果是不可预知的.  可以是局部静态变量,全局变量等等

user: user-8
content: 全局变量吧..

user: user-3
content: 引用 10 楼 zdlhsq 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 使用全局变量不会麻烦死人的。 不使用全局变量也不会爽死人的。   要是定义了全局变量，要怎么实现在上一个函数里运算，下一个函数里调用上一个函数运算的值呢？[/quote] #include <stdio.h> int g_var; void fun1() {  gvar++; } void fun2() {  gvar*=2; } int main() {  g_var=1;  fun1();  fun2();  printf("%d\n",g_var);  return 0; }

user: user-9
content: 如果要使用的变量比较多，建议封装起来做成一个struct，然后定义一个全局的结构体实例，至于是不是static是你的需求而定，这样操作起来就比较方便了。

user: user-10
content: 函数内部的局部变量，在函数调用返回时，就已经无效了，返回指针当然可以访问，但是无意义了！ 原因：x86下，每次函数调用，都要在栈上生成一个新的栈帧，局部变量就在此栈帧中进行分配，当函数返回时，此栈帧就要撤销。 假设A call B, 从B中返回一个局部变量的指针p，然后A call C,那么p可能就指向了函数C的局部变量，因为B返回后再调C，栈帧就重新分配给C了

user: user-11
content: 你定义为全局变量 ，在任何一个子函数中都可以使用了。
user-0 提问: uva10106高精度乘法老是WA感觉没错啊

回复:
user: user-1
content: 两个255位十进制正整数相乘，最大可得255*2，即510位十进制正整数。

user: user-2
content: 没细看算法，不过memset显然错了。应该是  memset(a,0,sizeof(a)); 或者  memset(a,0,255 * sizeof(int));  还有，你确定255和505够用？数组稍微定义的大一点没啥坏处
user-0 提问: sqlite3中使用callback传递参数时的一点问题

回复:
user: user-1
content: 把 p->epc = (char)coulmn_value[1]; 改为 strcpy（p->epc，coulmn_value[1]）;

user: user-2
content: Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-0
content: 把struct 里面的 epc 改为char *型的会报Segmentation fault
user-0 提问: linux下从末尾读取文件

回复:
user: user-1
content: 仅供参考：#include <stdio.h> FILE *f; int c; long offset; char ln[100]; void main() {     f=fopen("a.txt","rb");//必须用b方式打开，否则文件当前读位置会受\x0d \x0a \x1a等字符的干扰     fseek(f,-1,SEEK_END);//倒数最后一个字节之前     while (1) {         c=fgetc(f);         if ('\n'==c) {             offset=ftell(f);//记住当前位置，即刚读字符后面             fgets(ln,100,f);             printf("%s",ln);             fseek(f,offset-2,SEEK_SET);//回到刚才读位置之前一个位置，即c所在位置之前一个位置         } else             if (fseek(f,-2,SEEK_CUR)) {//回到刚才读位置之前一个位置，即c所在位置之前一个位置失败，说明已读到文件开头                 fseek(f,0,SEEK_SET);                 fgets(ln,100,f);//读文件第一行内容                 printf("%s",ln);                 break;             }     }     fclose(f); }

user: user-2
content: 引用 4 楼 wangzuxi 的回复:如果行数不是很多，就把所有行读到一个二维数组中，反向遍历这个二维数组就可以了。  +1

user: user-3
content: 如果行数不是很多，就把所有行读到一个二维数组中，反向遍历这个二维数组就可以了。

user: user-4
content: 如果不是写程序的话，可以考虑使用工具

user: user-4
content: fopen指向文件末尾，反向扫描换行符，提取整行

user: user-1
content: 搜“tail命令“及其对应的源代码。
user-0 提问: 帮忙看下哪里错了？

回复:
user: user-1
content: #include<stdio.h> #include<math.h> int main() { int a,n; double all=0; while(scanf("%d,%d",&a,&n)!=EOF) { all = (pow(10,n+1)-10-9*n) / 81.0; printf("%f\n",all*a); } return 0; }

user: user-2
content: 下面是我自己写的一个程序，已经运行过了没什么问题，你可以参考一下 #include<stdio.h> #include<stdlib.h>  int f(int a,int n) { 	int sum; 	if(n==1) 		return a; 	else  		return f(a,n-1)*10+a;	 } int main() { 	int a,n; 	int sum[20],i,j; 		for(j=0;scanf("%d%d",&a,&n)!=EOF;j++) 		{ 			sum[j]=0; 			for(i=1;i<=n;i++) 				sum[j]+=f(a,i); 		} 	for(i=0;i<j;i++) 		printf("%d\n",sum[i]); 	return 0; }

user: user-3
content: 如果考虑到n可能会非常大，应该使用一些高精度算法 #include <stdio.h> #include <stdlib.h>  void Normalize(int * arr, int len) {     int i;     for (i = 0; i < len - 1; i++)     {         arr[i + 1] += arr[i] / 10;         arr[i] %= 10;     } }  int main(void) { 	int a, n, *arr;     while (scanf("%d%d", &a, &n) == 2)     {         arr = (int*)malloc((n + 1) * sizeof(int));         int i = 0, t = n;         for (i = 0; i < n; i++)         {             arr[i] = a * t--;         }         arr[i] = 0;         Normalize(arr, n + 1);         while (arr[i] == 0) i--;         do         {             printf("%d", arr[i]);         } while (i-- > 0);         printf("\n");         free(arr);     } 	return 0; }

user: user-1
content: 是不是结果超出最大表示值了~

user: user-4
content: int a, n; 	int sum = 0, curVal;  	while(scanf_s("%d%d",&a,&n) == 2) 	{ 	    sum = 0; 		curVal = 0;  		while ( n-- > 0 ) 		{ 		    curVal = curVal * 10 + a; 			sum += curVal;  		} 		printf( "%d ", sum ); 	}

user: user-0
content: 额。。。。老师，貌似跟我的题没关系啊

user: user-5
content: 仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110
user-0 提问: underfined reference to 'pthread_create'

回复:
user: user-0
content: -lpthread 是在链接的时候加

user: user-1
content: 把make的输出都贴出来吧，楼主问个问题，干嘛还藏着掖着！

user: user-2
content: 引用 2 楼 a30037338 的回复:cc  -c  $^  -o  $@  -I  ./include  -lpthread  多了一个-l 应该是一个大写的 ‘i’

user: user-2
content: cc  -c  $^  -o  $@  -I  ./include  -lpthread  多了一个-l

user: user-3
content: LD_LIBRARY_PATH -L（lib目录） -l（lib名称）
user-0 提问: 如何用C语言实现文本里面关键字的替换

回复:
user: user-1
content: 直接用shell不好吗？sed -e 's/[我你他谁]/\*/g' -e 's/朋友/\*\*/g' 1.txt sed -e 's/[我你他谁]/\*/g' -e 's/朋友/\*\*/g' -e 's/[^\*]//g' 1.txt | wc -L

user: user-2
content: 边读边处理，重点注重宽字符的处理

user: user-3
content: 额。。一边读取文件，判断字符进行转换不就ok啦

user: user-4
content: 那天，那个人看见那个人的那个把那个人的那个给那个了！

user: user-4
content: //定义“我”“你”“他”“谁”“朋友”为关键字，导入一个文本1.txt，文本内容为： //我和你是朋友，你和他是朋友，但是我不知道他是谁。 //要求将关键字替换为星号（*），输出： //*和*是**，*和*是**，但是*不知道*是*。 //并输出*号的个数 #include <stdio.h> #include <string.h> #include <locale.h> char k[5][5]={"我","你","他","谁","朋友"}; FILE *f; char ln[256]; int n,L,i,j; int main() {     setlocale(LC_ALL,"chs");     f=fopen("1.txt","r");     if (NULL==f) {         printf("Can not open file 1.txt!\n");         return 1;     }     fgets(ln,256,f);     fclose(f);     n=0;     L=strlen(ln);     for (i=0;i<L;i+=2) {         for (j=0;j<5;j++) {             if (0==strncmp(ln+i,k[j],strlen(k[j]))) break;         }         if (j<4) {             printf("*");             n++;         } else if (j<5) {             printf("**");             n+=2;             i+=2;         } else {             printf("%.2s",ln+i);         }     }     printf("%d\n",n);     return 0; } //*和*是**，*和*是**，但是*不知道*是*。 //11 //

user: user-4
content: 仅供参考：#include <stdio.h> #include <string.h> char s[256]; char *p; int r,n,i; int main() {     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //
user-0 提问: 服务器端如何区分UDP,TCP 给客户端返回数据？

回复:
user: user-1
content: 引用 3 楼 zhao4zhong1 的回复:“直接在各个命令处理分支，处理完成后，直接调用TCP/UDP的发送，把结果直接送给PC。。。” 如果是多线程处理的话，楼主和你的同事们就准备受死吧。 告诉你可能的一种死法： 线程1发送“ABCD” 线程2发送"abcd" 接收方收到“AaBCbcDd”

user: user-2
content: 引用 7 楼 wanyeye 的回复:[quote=引用 6 楼 my_live_123 的回复:] 服务器设计的时候就订好采用何种协议了吧！目前绝大多数都是TCP，用UDP的不多了吧！过程非常像，socket和connect的参数好像有区别 如果同时存在，可以检测报文的协议字段进行区分。但是话又说回来了，同时存在应该是两个服务器进程，不可能是同一个服务器进程服务两种协议吧？！  我们所谓的服务器，其实就是基于ARM跑linux的设备，当作一个服务器。  设备要与PC等控制端交互.... [/quote] 那应该属于驱动开发的范畴

user: user-0
content: 引用 6 楼 my_live_123 的回复:服务器设计的时候就订好采用何种协议了吧！目前绝大多数都是TCP，用UDP的不多了吧！过程非常像，socket和connect的参数好像有区别 如果同时存在，可以检测报文的协议字段进行区分。但是话又说回来了，同时存在应该是两个服务器进程，不可能是同一个服务器进程服务两种协议吧？！  我们所谓的服务器，其实就是基于ARM跑linux的设备，当作一个服务器。  设备要与PC等控制端交互....

user: user-1
content: “直接在各个命令处理分支，处理完成后，直接调用TCP/UDP的发送，把结果直接送给PC。。。” 如果是多线程处理的话，楼主和你的同事们就准备受死吧。

user: user-2
content: 服务器设计的时候就订好采用何种协议了吧！目前绝大多数都是TCP，用UDP的不多了吧！过程非常像，socket和connect的参数好像有区别 如果同时存在，可以检测报文的协议字段进行区分。但是话又说回来了，同时存在应该是两个服务器进程，不可能是同一个服务器进程服务两种协议吧？！

user: user-3
content: 区分 udp 与 tcp  的 fd . 1).  1楼 2).  记录  udp  的 fd, 接收/发送数据时判断处理... 3).  用 read() / write() 函数 操作 fd ,  udp/tcp 通吃

user: user-4
content: 1L +1,   什么时候用TCP,什么时候用UDP这个应该是设计的时候就规定好了吧， 不然为什么要搞两种协议。 如果没有规定，那么这个设计好凌乱

user: user-5
content: getsockopt SO_TYPE 可以获取socket类型，比如SOCK_RAW，SOCK_STREAM，SOCK_DGRAM等等。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:“直接在各个命令处理分支，处理完成后，直接调用TCP/UDP的发送，把结果直接送给PC。。。” 如果是多线程处理的话，楼主和你的同事们就准备受死吧。  我是不想死的，我坚持过我的意见，不建议这么干的，但是，同事年纪大，资格老，老大信他多一点， 既然这样，我就妥协了，任何事情总得有人的先妥协，哪怕以后发现我的建议是对的...   所以现在，我选了一个比较折中的办法，让老大拉人进项目中，整个项目我还负责其他部分的工作，借口工作内容多，没精力... 不要到最后，被你一语成谶了，，我成替罪羊了，所有问题都成了我的问题。。。
user-0 提问: cout,printf输出的结果不一致

回复:
user: user-1
content: http://bbs.csdn.net/topics/390676437 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-0
content: 改了一下格式符，出来这个  			for(int x = 0;x<3;x++) 			{ 				cout<<detaNEU[x][0]<<endl; 		     	printf("%g\n",detaNEU[x][0]);  			}             /*  输出结果 		4.07571         8.09323e-318         3.1305         2.12281e-314         10.7046         4.2448e-314*/

user: user-0
content: 引用 3 楼 zhangxiangDavaid 的回复:确实看不出问题  看了好久，不知道从哪里下手了

user: user-2
content: 确实看不出问题

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:从输出结果看，哪一个是对的呢？ cout的是对的

user: user-2
content: 从输出结果看，哪一个是对的呢？
user-0 提问: c语言

回复:
user: user-1
content: 仅供参考：  int table[10][5] = { 	{1, 0}, 	{1, 1}, 	{4, 4, 8, 6, 2}, 	{4, 9, 7, 1, 3}, 	{2, 6, 4}, 	{1, 5}, 	{1, 6}, 	{4, 9, 3, 1, 7}, 	{4, 4, 2, 6, 8}, 	{2, 1, 9}, }; int main(void) { 	int res, n, N; 	printf("Input N:"); 	scanf("%d", &N); 	n = N % 10;    //n记录N的个位数大小 	if (N == 1) res = 1; 	else res = table[n][(N - 2) % table[n][0] + 1]; 	printf("the result is %d\n", res); 	return 0; }

user: user-2
content: a^N的最后一位数字不是4个一循环的吗？直接a^(N%4)不就可以了吗，没必要打表的吧。
user-0 提问: gcc 参数问题

回复:
user: user-1
content: gcc -v  --help

user: user-2
content: gcc编译器针对平台和cpu,编译参数都可能会有不同,比如在linux+x86,linux+mips,os+x86,交叉编译器 linux+arm,ios+arm等等.... 所以还是需要自己取查查帮助把

user: user-3
content: 可man gcc 可查到一些，你上帖中提到的有些查不到。
user-0 提问: 哪位大哥知道在VC的基于对话框的程序中实现对当前实例的数据库的备份与还原啊，本人水平很菜，求具体步骤。。

回复:
user: user-1
content: 使用方法     如何创建数据库备份 (Transact-SQL) 创建数据库备份   执行 BACKUP DATABASE 语句以创建数据库备份，同时指定：  要备份的数据库的名称。   数据库备份将写入的备份设备。  指定（可选）：  INIT 子句，通过它可以重写备份媒体，并在备份媒体上将该备份作为第一个文件写入。如果没有现成的媒体头，备份过程将自动写入一个。   SKIP 和 INIT 子句，通过它们可以在备份媒体中仍然存在未失效的备份，或在媒体本身的名称与备份媒体中的名称不匹配时重写备份媒体。   FORMAT 子句，通过它可以在第一次使用媒体时对备份媒体进行完全初始化，并覆盖任何现有的媒体头。  如果已经指定了 FORMAT 子句，则不需要指定 INIT 子句。    重要  当使用 BACKUP 语句的 FORMAT 子句或 INIT 子句时，一定要十分小心，因为它们会破坏以前存储在备份媒体中的所有备份。   示例 下例将整个 MyNwind 数据库备份到磁带上：  USE MyNwind GO BACKUP DATABASE MyNwind    TO TAPE = '\\.\Tape0'    WITH FORMAT,    NAME = 'Full Backup of MyNwind' GO   请参见  sp_addumpdevice  数据库备份  追加备份集  差异数据库备份  备份 master 数据库  删除数据库  还原 model、msdb 和 distribution 数据库  重写备份媒体  BACKUP  减少恢复时间  事务日志备份  初始化备份媒体  ©1988-2000 Microsoft Corporation。保留所有权利。

user: user-0
content: 我是说怎么添加代码，请说的详细点

user: user-2
content: 写存贮过程,  在程序里调用
user-0 提问: 计算N阶方阵合法结果的数量（N>=2）

回复:
user: user-0
content: 多谢四楼，这样的解决办法尚可行。。return n*(n-1)*(n-1)/2*((2*n-3)*aFun(n-2) + (n-2)*(n-2)*aFun(n-3));

user: user-1
content: http://oeis.org/A001499 鉴于这个数字增长极快，建议打表

user: user-2
content: 艹，晕了！穷举法吧

user: user-2
content: n*(n-1)/2 * n!/2

user: user-2
content: n*(n-1)*(n-1)/2
user-0 提问: 数据结构舞伴问题OJ提交上去一直是Runtme error，是什么问题

回复:
user: user-1
content: static char A[10000],B[1000],E1,E2; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
user-0 提问: 求助 求助    

回复:
user: user-1
content: 求最大公约数用欧几里德算法。 另附参考代码:#include<iostream> #include<set> using namespace std; inline unsigned int gcd(unsigned int a,unsigned int b,unsigned int curMax) { 	unsigned int t; 	while(b>curMax) 	{ 		t=a; 		a=b; 		b=t%b; 	} 	return b?0:a;	// b不为0表示a与b的最大公约数小于等于curMax }  int main() { 	unsigned int curMax, //用于存放最大的最大公约数 		T,n,a,gcdVal; 	set<unsigned int> aset; //用于存放a1-an 	set<unsigned int>::iterator it; 	cin>>T; 	for(unsigned int i=1;i<=T;++i) 	{ 		cin>>n; 		curMax=1; 		while(n--) 		{ 			cin>>a; 			if(a>curMax)	// 过滤掉小于等于curMax的数，因为一个数的最大公约数不会大于其本身，所以此值与其它值的最大公约数不会大于curMax 			{ 				for(unsigned int x:aset) 				{ 					gcdVal=gcd(a,x,curMax);	// 用欧几里德算法求最大公约数 					if(gcdVal) 						curMax=gcdVal; 				} 				for(it=aset.begin();it!=aset.end()&&*it<=curMax;++it); 				aset.erase(aset.begin(),it);	// 删去小于等于curMax的数，理由同30行 				aset.insert(a); 			} 		} 		cout<<"Case #"<<i<<": "<<curMax<<endl; 	} 	return 0; }

user: user-0
content: 哎     来人解决啊

user: user-0
content: 没人会吗，帮帮忙啊
user-0 提问: 文本结束符EOF与Ctrl+z的那点事

回复:
user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 9 楼 jusll 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。 如果我想单步调式对应处理的C源代码对应的汇编指令，怎么搞？用一个汇编器，把C源代码转为汇编指令吗？求赐教，简单说一下流程。谢谢了。[/quote] VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） [/quote] 谢谢指教！

user: user-0
content: 引用 10 楼 gzwgyfgpf 的回复:vc6.0调试的时候会出现汇编指令，你可以试试 我用Code::Blocks，不过还是有汇编窗口的，跟VC6相似，谢谢。

user: user-1
content: 引用 9 楼 jusll 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。 如果我想单步调式对应处理的C源代码对应的汇编指令，怎么搞？用一个汇编器，把C源代码转为汇编指令吗？求赐教，简单说一下流程。谢谢了。[/quote] VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: vc6.0调试的时候会出现汇编指令，你可以试试

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。 如果我想单步调式对应处理的C源代码对应的汇编指令，怎么搞？用一个汇编器，把C源代码转为汇编指令吗？求赐教，简单说一下流程。谢谢了。

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。 ，谢谢赐教！

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号getchar上点鼠标右键，选转到定义。 恩，谢谢。

user: user-1
content: VS IDE中，在不明白的符号getchar上点鼠标右键，选转到定义。

user: user-1
content: 看一万遍标准、解释、例子、…… 不如看一遍对应处理的源代码； 看一万遍对应处理的C源代码 不如单步调试一遍对应处理的源代码； 单步调试一万遍对应处理的C源代码 不如单步调试一遍对应处理的C源代码对应的汇编指令。

user: user-0
content: 引用 1 楼 user-4 的回复:http://blog.csdn.net/cxyol/archive/2006/03/18/628324.aspx 你看下这篇文章估计就懂了！ 链接已看过了，长知识了，不过好像对EOF、Ctrl+z介绍的不多。 我在c primer plus,第五版，P192找到一种说法：       要对减胖输入文件尾信号，需要一种键入EOF字符的方式。不，您不能简单地键入字母E、O、F，而且也不能只键入-1（键入-1会传送两个字符：一个连字符和数字1）。正确的方法是您必须知道您系统的要求。在大多数Unix系统上，在一行的开始键入Ctrl+D会导致传送尾信号，许多微型计算机系统将一行的开始位置键入的Ctrl+Z识别为文件尾信号，还有一些则是把任意位置的Ctrl+Z解释成文件尾信号。 很明显，这里的情况因该是第二种第二种情况（上面标红），当Ctrl+z不是在一行的开始位置时，系统就当做控制字符处理，ascii码为26. 还是很感谢。

user: user-0
content: 好的，我去瞅瞅。

user: user-3
content: 回复等加分。

user: user-4
content: http://blog.csdn.net/cxyol/archive/2006/03/18/628324.aspx 你看下这篇文章估计就懂了！
user-0 提问: KMP算法的C语言实现问题，希望大神来指点下。

回复:
user: user-1
content: KMP http://blog.csdn.net/zhangxiangdavaid/article/details/35569257

user: user-2
content: 网上现成的资料很多，自行搜索

user: user-3
content: 第一个第三个二楼的链接都解答了，第二个只要在int naiveStringMatching(const char* T, const char* P) 程序基础上再编写个程序调用，使T指针向后移动naiveStringMatching的返回值 就可以找出所有的匹配串
user-0 提问: makefile

回复:
user: user-1
content: 没个目录下写一个子makefile，然后不指定目标文件，利用make的潜规则，自动编译成源文件同名的目标文件，在上层makefile中调用各个子makefile

user: user-2
content: 搜“跟我一起写makefile”

user: user-0
content: 谢谢，顺便问一下 make 时候出现 undefined reference to 'pthread_create' 但是，我头文件加了，编译的时候-lpthread也加了，问什么还会出现这样的错误  makefile 中这句话如下： cc  -c  $^  -o  $@  -I  ./include  -lpthread

user: user-3
content: SRC := $(wildcard src/*.c) OBJ := $(patsubst src/%.c,obj/%.o,$(SRC))  这样基本就OK了，添加.c文件也不需要修改Makefile
user-0 提问: 怎么用C中的文件操作函数删除一部分数据？

回复:
user: user-1
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-2
content: 仅供参考：  /*1.dat Tom 15 98.3 Jim 14 99.5 Lyli 15 89.0 David 15 80.8 */ int main(void) { 	FILE *f, *nf; 	if (NULL == (f = fopen("1.dat", "rb"))) 	{ 		fprintf(stderr, "Can not open file 1.dat"); 		return 1; 	} 	if (NULL == (nf = fopen("11.dat", "wb"))) 	{ 		fprintf(stderr, "Can not create file 11.dat"); 		fclose(f); 		return 1; 	} 	char name[20]; 	char Name[20]; 	int year; 	double grade; 	int r; 	printf("input the delete name string:"); 	scanf("%20s", name); 	while (1) 	{ 		r = fscanf(f, "%s%d%lf\n", Name, &year, &grade); 		if (3 == r) 		{ 			if (strcmp(name, Name) == 0) continue; 			fprintf(nf, "%s %d %lg\n", Name, year, grade); 		} 		else break; 	} 	fclose(f); 	fclose(nf); 	return 0; }

user: user-0
content: OK  解决了  可以在重新写入数据的时候换成“wb+”模式，这样原文件已有的数据会被删除。然后重新开始添加记录
user-0 提问: TC30的多文件编译

回复:
user: user-1
content: C++必须要有函数原型，C语言可选  写在头文件里, 包含头文件

user: user-2
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。文不对题啊大哥，，，而且这个问题这么做也找不出问题啊
user-0 提问: C语言或者C++中关于字符串两两转换成无符号字符类型即MAC格式

回复:
user: user-1
content: 使用的头文件： #include <tchar.h> #include <vector> using namespace std;

user: user-1
content: 仅供参考，unsigned char pChar[32];我设置的固定值，视情况自己改。否则出现Bug概不负责。   void get16(string strBuffer) { 	vector<string> vctStr; 	for (int i=0;i<strBuffer.size();i=i+2) 	{ 		string strTemp = strBuffer.substr(i,2); 		vctStr.push_back(strTemp); 	} 	vector<string>::size_type first; 	int isize = vctStr.size(); 	unsigned char pChar[32]; 	for (first = 0;first < isize;first++) 	{ 		pChar[first] = _tcstol(vctStr[first].c_str(),NULL,16); //转换成十六进制 	} }
user-0 提问: 用C实现SMS4国密算法，我实在是找不出来哪里溢出了，大神们求帮助TAT

回复:
user: user-1
content: 弱爆，S盒固定的啊？不能根据密钥生成？

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: //你的K_function和F_function函数中都存在内存违规访问的问题，见注释 //这样的问题，调试运行的话很容易找到的 unsigned int K_function(unsigned int a0,unsigned int a1,unsigned int a2,unsigned int a3,unsigned int rk) { 	unsigned char t,temp; 	unsigned char *tc; 	t = a1 ^ a2 ^ a3 ^ rk; 	tc = &t;         //tc保存的仅仅是t的地址   	//S盒替代运算 	tc[0]=S[tc[0]]; //tc[0]相当于访问t，所以这里没有内存越界访问 	tc[1]=S[tc[1]]; //越界访问 	tc[2]=S[tc[2]]; //越界访问 	tc[3]=S[tc[3]]; //越界访问  	//线性变换L 	temp = t << 13; //t <<< 13 	t = t ^ temp;  	temp = temp << 10;     //t <<< 23  	t = t ^ temp;   	t = a0 ^ t;   	return t;  }
user-0 提问: 可以这样吗？

回复:
user: user-1
content: 可以的！！！

user: user-2
content: 可以是可以，但这样一来代码会很容易出错的，多写一行代码算什么呢？对于大程序而言，错一行也是大事啊……

user: user-3
content: 存在不安全因素 比如kind为 ++a 就变成if(0 < ++a && ++a < 20),这可能不是自己想要的  如果你想写成联等的，可以使用C++语言的运算符重载机制

user: user-4
content: 要命，不喜欢C的风格就换个别的语种吧。

user: user-5
content: 不要这样写！！！！！！ 这种代码看了会吐的，OK。

user: user-6
content: 合法，但不好。

user: user-7
content: 只要预编译后和原表达式一样即可，但是这种宏无法解决“所有”的可能性。 建议写个函数。

user: user-8
content: 最好给X套上括号#define R(X) (X) && (X)

user: user-9
content: 可以啊。但是表达式可能会出问题。

user: user-10
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-10
content: 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。
user-0 提问: 求助C语言一个基础数组问题

回复:
user: user-1
content: 数组元素有类型，数组的首地址进行数值运算时，偏移量要乘以数组元素类型大小 换言之 a + 1 = 0x0030f85c + 1 * sizeof(int)

user: user-2
content: Pointer Arithmetic Additive operations involving a pointer and an integer give meaningful results only if the pointer operand addresses an array member and the integer value produces an offset within the bounds of the same array. When the integer value is converted to an address offset, the compiler assumes that only memory positions of the same size lie between the original address and the address plus the offset.  This assumption is valid for array members. By definition, an array is a series of values of the same type; its elements reside in contiguous memory locations. However, storage for any types except array elements is not guaranteed to be filled by the same type of identifiers. That is, blanks can appear between memory positions, even positions of the same type. Therefore, the results of adding to or subtracting from the addresses of any values but array elements are undefined.  Similarly, when two pointer values are subtracted, the conversion assumes that only values of the same type, with no blanks, lie between the addresses given by the operands.

user: user-2
content: A[B] *(A+B) *(B+A) B[A] 以上四行等价

user: user-3
content: 建议多看看指针的加减法！  如 int a[10];  a[i] 等价于 *(int*)( reinterpret_cast<BYTE*>(a）+ i * sizeof(int) );
user-0 提问: 请问在C语言中如何判断类型？

回复:
user: user-1
content: 在API上加一个参数，传入类型  typedef enum {  type1 = 0,  type2 = 1,  ... } TYPE; void fun(const void *value, TYPE type) {  switch(type) {  case type1:      xxx *v = (xxx *)value;  break;  ...  } }

user: user-2
content: 引用 12 楼 zhao4zhong1 的回复:仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5] typeinfo.h不是C语言的头文件吧。#ifndef __cplusplus   #error This header requires a C++ compiler ...   #endif  /* __cplusplus */

user: user-3
content: 参考VARIANT的定义。

user: user-3
content: 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 试了一下,gcc4.9 可以用C11的_Generic了。 #include<stdio.h>  #define V(X) \ 	printf(#X " is %s\n", \ 		_Generic((X), \ 			int:"int", \ 			char:"char", \ 			float:"float", \ 			double:"double", \ 			char*:"char*", \ 			int*:"int*", \ 			float*:"float*", \ 			default:"default" \ 		) \ 	)  int main() { 	int a;float b; 	V(1); 	V((char)'s'); 	V(1.2f); 	V(3.4); 	V("s"); 	V(&a); 	V(&b); 	V(main); 	return 0; } /* output: 1 is int (char)'s' is char 1.2f is float 3.4 is double "s" is char* &a is int* &b is float* main is default */

user: user-4
content: 强制类型转换啊

user: user-5
content: 使用gcc的typeof

user: user-6
content: 这就是说你形参什么类型的都可以，自己调用时给什么类型都可以

user: user-7
content: int main (void) {     int f (void);     return f (); }  static int f (void) {/* …… */}

user: user-8
content: 自定义type，入口判断。

user: user-9
content: 编译器是指不上的了，靠自己想办法。

user: user-10
content: 参照微软的做法, 在 void * 类型使用时, 再定义一个类型符 我用得最多的就是 SystemParametersInfo, 其中 uiAction 就表示了 pvParam 是何种类型 在函数内部 switch 这个类型符, 每个 case 处理一种

user: user-11
content: const void*   value,  这表明接收任何类型。但要使用的话，你得知道具体类型。

user: user-0
content: 引用 1 楼 mewiteor 的回复:C语言没有反射 我知道没反射才来这里问答呢！

user: user-2
content: C语言没有反射
user-0 提问: 关于p++先取值，再加１的问题。

回复:
user: user-1
content: 很详细自己看吧！http://bbs.csdn.net/topics/370153775

user: user-2
content: 不知道为什么，这类问题好多人问呀  p++ 表达式展开就是豆号表达式:  (tmp = p, p += 1, tmp) 最终返回值是 tmp ... 就算放到 函数里也是 func(  (tmp = p, p += 1, tmp), n) ...

user: user-3
content: 对。 void foo(int p) { 	cout << p << endl; }  int main() { 	int a = 10; 	foo(a++); 	cout << a << endl; 	return 0; }
user-0 提问: 一道笔试题，相同地址的int变量，不同内容是为何

回复:
user: user-1
content: 因为代码是错的  这是未定义行为  结果毫无意义

user: user-2
content: 引用 6 楼 u013163178 的回复:搜“常量折叠” 正解

user: user-3
content: 2，4，6，8楼都对的，不过我记得的是C++才这样的，C是不是这样我没有考查过。

user: user-4
content: 这应该和c++的编译器有关吧，c++对const的编译应该会类似define， 如果这个用c来执行对a进行强制转换，两次输出都应该是0

user: user-5
content: 搜“常量折叠”

user: user-6
content: 编译器会帮你做很多它认为理所应当的事，2楼4楼说的已经很全面了。

user: user-7
content: 因为a是个const限定，导致编译器直接把a常量化了，也就说你输出a时，已被编译器转化为cout << 0;虽然你已经修改了值，但是输出已经不再从内存中读取了，而实际的*j还是从内存中读取 你可以在a上加上volatile试试，肯定就一样了  + volatile const int a = 0;

user: user-8
content: 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout！ 使用scanf、printf。

user: user-9
content: 1.你用指针改掉了a在内存中的值，虽然打印出的还是原来的0,但实际上它已经被改了 2.地址当然是一样的，j不是指向的是a吗，所以打印的地址是一样的  你在a前面加个volatile修饰，就知道了。

user: user-10
content: 引用 楼主 llghwll 的回复:加上了(int *)，指针j指向的内容被赋值为了1  我还想问问楼主为何加了强制转换，就赋值为1了？？？
user-0 提问: （抓狂）几乎一样的两段代码，一段总报错。

回复:
user: user-1
content: 自已看看哪不一样就知道了。typedef出来的别用用的太早了。

user: user-2
content: “几乎一样”，就在于哪里不一样

user: user-0
content: 唉！羞愧！谢谢大家

user: user-3
content: 楼上的+1.

user: user-4
content: 楼上的+1.

user: user-5
content: 1楼+1， 这个结构定义完成才起别名， 在结构内，别名还没有生效

user: user-6
content: 第一个结构体里边“struct TREENODE *...”有问题，不要用TREENODE，要使用TreeNode。也就是说，在结构体里边使用结构体本身时，最好使用原类型，不要使用typedef之后的类型

user: user-7
content: 几乎这词用到了好处

user: user-8
content: 既然使用C++，就不要使用 typedef struct Tt { } TT; 的语法了，这样的语法 TT 只是个别名，实际不存在名叫 TT 的类型。  直接使用 struct TT { } ;

user: user-9
content: C语言分大小写所以struct TreeNode和struct TREENODE是不同的名字（struct是名字的一部分）
user-0 提问: 有关TCP/IP中持续上传新数据问题

回复:
user: user-1
content: connect send close 都是对socket操作，和数据库连接没关系。 要更稳妥，请改为  connect send recv收到对端对应刚才send内容已收到的应答 close

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:建立数据库连接 while(1) {   usleep(1000000);  从数据库获取数据到buf  connect  send  close } 断开数据库连接  您好，我想问一下在while中close后，下次循环时还能再connect么，使用close不就是关闭客户端了么

user: user-1
content: 建立数据库连接 while(1) {   usleep(1000000);  从数据库获取数据到buf  connect  send  close } 断开数据库连接

user: user-0
content: 这样发一次数据就要打开关闭客户端一次，感觉好傻，想不出来怎样改变buf的值

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:你没close当然不能再connect了。  恩，好像是的，但是加了还是报错

user: user-1
content: 你没close当然不能再connect了。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:connect send close 都是对socket操作，和数据库连接没关系。 要更稳妥，请改为  connect send recv收到对端对应刚才send内容已收到的应答 close  不好意思啊，我试了下，把connect放在循环中执行一次后，第二次就会报错	  while(1) {      int r = connect(fd, (struct sockaddr *)&addr, sizeof(addr));//连接 	if(r == -1) 	{ 		DEBUG_MSG("connect err : %d\n", errno); 		return 1; 	} 	DEBUG_MSG("connect success\n");                  memset(buf, 0, 127);           fread(buf, 1, 1, fp);    //测试只用了文件操作，读取一个txt文本中的数据           send(fd, buf, 127, 0);          DEBUG_MSG("data send\n") }  运行结果 create socket success connect success data send connect err : 106  如果把close放入循环也会报错 create socket success connect success data send connect err : 9  把connect拿出循环就成功了  基于文件操作的灵感，我想在sqlite3里有没有读取数据后，偏移到下一条数据的函数，这样执行实现我的想法
user-0 提问: 关于Dijkstra算法求源节点到其余各个顶点的最短路径

回复:
user: user-1
content: 你再往后翻翻，应该有floyd算法，数据结构书上一般都要讲这两个的！如果没有，自行搜素，关键字“floyd最短路径”

user: user-2
content: Dijkstra算法 http://blog.csdn.net/zhangxiangdavaid/article/details/38360337
user-0 提问: 这个怎么破？关于花括号的问题

回复:
user: user-1
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-2
content: 我只想说，楼主用的编辑器太弱智

user: user-3
content: 这是垃圾代码

user: user-4
content: 引用 14 楼 mbctb 的回复:[quote=引用 10 楼 my_live_123 的回复:] [quote=引用 8 楼 mbctb 的回复:] [quote=引用 7 楼 my_live_123 的回复:] 如果使用的CB IDE，你可以设定常见的模板格式，而且也可以设定自己的风格 你说的是CB，是C++ Builder吗？[/quote] codeblack[/quote] codeblack能用于ＶＳ２００８吗？[/quote] 不是谁用谁的关系，二者都是IDE

user: user-5
content: 引用 13 楼 mbctb 的回复:[quote=引用 12 楼 super_miker 的回复:] 16：9的显示器分两栏编辑应该挺舒服的，顺便我用的是notepad++ 分两栏编辑？怎么用？求指教。 [/quote] 在标签上点击“复制到另一视图”（notepad++，其他编辑器不知道）

user: user-0
content: 引用 10 楼 my_live_123 的回复:[quote=引用 8 楼 mbctb 的回复:] [quote=引用 7 楼 my_live_123 的回复:] 如果使用的CB IDE，你可以设定常见的模板格式，而且也可以设定自己的风格 你说的是CB，是C++ Builder吗？[/quote] codeblack[/quote] codeblack能用于ＶＳ２００８吗？

user: user-0
content: 引用 12 楼 super_miker 的回复:16：9的显示器分两栏编辑应该挺舒服的，顺便我用的是notepad++ 分两栏编辑？怎么用？求指教。

user: user-5
content: 16：9的显示器分两栏编辑应该挺舒服的，顺便我用的是notepad++

user: user-4
content: 如果使用的CB IDE，你可以设定常见的模板格式，而且也可以设定自己的风格

user: user-6
content: 没有必要减少行数，某些公司员工还得故意增加行数应付kpi呢  可读性很重要

user: user-4
content: 好像是微软的风格 for(int i = 0; i < 128; i ++) {     for(int j = 0; j < 25; j ++)     {         x = 0;     } } a ++;  ASCII风格 for(int i = 0; i < 128; i ++) {     for(int j = 0; j < 25; j ++)  {         x = 0;     } } a ++;  当循环内只有一条语句时简化风格 for(int i = 0; i < 128; i ++)     for(int j = 0; j < 25; j ++)         x = 0;  a ++;

user: user-1
content: for(int i = 0; i < 128; i ++){     for(int j = 0; j < 25; j ++){         x = 0;     } }  for(int i = 0; i < 128; i ++){ for(int j = 0; j <  25; j ++){     x = 0; }}

user: user-7
content: 为了多看几行， 而导致代码可读性变低。 现实工作中最好不要这么做。  不过你可以使用这样的代码风格 for(int i = 0; i < 128; i ++){     for(int j = 0; j < 25; j ++){         x = 0;     } } 但令是减少了两行

user: user-8
content: 反正屏宽，写一行算了 for(int i = 0; i < 128; i ++) for(int j = 0; j < 25; j ++) x = 0; // 或者 for(int i = 0; i < 128; i ++) for(int j = 0; j < 25; j ++) {       x = 0; }

user: user-9
content: for(int i = 0; i < 128; i ++) {     for(int j = 0; j < 25; j ++)     {         x = 0;     } } a ++ 这么写，错不了

user: user-4
content: 引用 8 楼 mbctb 的回复:[quote=引用 7 楼 my_live_123 的回复:] 如果使用的CB IDE，你可以设定常见的模板格式，而且也可以设定自己的风格 你说的是CB，是C++ Builder吗？[/quote] codeblack

user: user-10
content: 我只想说微软的VS系列编辑器基本都有Alt+F8自动排版的，当然仅限于格式异常不大的位置，要是全部都是乱的，估计也没辙。

user: user-0
content: 引用 7 楼 my_live_123 的回复:如果使用的CB IDE，你可以设定常见的模板格式，而且也可以设定自己的风格 你说的是CB，是C++ Builder吗？
user-0 提问: c语言紧急作业，求大神帮助，给思路就可以！感谢不尽

回复:
user: user-1
content: cout<<hex<<*(long long *)&d<<' '<<*(int *)&f

user: user-2
content: http://bbs.csdn.net/topics/390676437

user: user-3
content: 首先， 实数也就是浮点数，可能是保存到double中也可能是float中。 那么你需要定义两种类型的变量接收这个浮点数。 然后，你需要理解数据在内存中都是以二进制保存。 （假设double是64bit，float是32bit, 并且是小端） 然后就有如下代码。 float val; cin>>val; double dVal=val;  int64  llValue = *(int64*)&dVal;        //保存到64bit的类型中 DWORD dwVal = *(DWORD*)&val; //保存到32bit类型中。  然后就可以取得  位与 得到每个bit的值是0还是1. 比如我要判断最低位是否为1，就是  if( (dwVal&0x00000001)==1) { }
user-0 提问: 求大神帮忙

回复:
user: user-0
content: 谢谢大神回帖，主要是我做的程序就是用Matlab，导师不让调用c语言，那段程序我也没看太懂，所以在这儿求帮助，你要是有空就帮我编一下呗

user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！
user-0 提问: 如何学习C语言

回复:
user: user-1
content: 我推荐郝斌的《C语言自学教程》和小甲鱼的《零基础学C语言》，这两套视屏都很好很详细，前者是郝斌老师的培训视屏，有180课，看似很多很吓人，其实每一课只有一个知识点，有些视屏只有两三分钟，所以真正的内容并不多。后者是小甲鱼出的，他的视屏都不错。大家选择其中的一套学习就行了。练习至关重要，我们要每天保证练习100行以上的程序，前期不会写，可以模仿、改写等。不多说了，全身心投入的话，3个月可以把C语言基础学的不错。
user-0 提问: 初学c语言 想编一个rpc····求大神帮看看这啥错误····

回复:
user: user-0
content: 谢谢iyomumx大师，是这个链接库

user: user-1
content: 链接Rpcrt4.lib _T("字符串")

user: user-0
content: 8	IntelliSense: "unsigned char *" 类型的实参与 "RPC_WSTR" 类型的形参不兼容 d:\documents\visual studio 2010\projects\helloworld\helloworld\server.c	18	28	hellowrd 9	IntelliSense: "unsigned char *" 类型的实参与 "RPC_WSTR" 类型的形参不兼容 d:\documents\visual studio 2010\projects\helloworld\helloworld\server.c	18	61	hellowrd   那这两个错误是怎么回事呢大师们

user: user-2
content: 将错误信息中出现的标识符放在google里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-3
content: 楼主说的RPC俺不懂，但是这种RpcServerUseProtseqEp没有定义的问题，我猜测应该是楼主没有把相应的链接库放进工程里面 不管是VC还是GCC，都可以网上搜索一下如何添加动态链接库或静态链接库，当然还要查一下RPC的链接库是哪个
user-0 提问: 关于c语言程序进程管理的一个问题

回复:
user: user-1
content: TCHAR cmdline[] = TEXT(path); 楼主你的工程编译的是宽字符的还是单字符的，单字符的没问题，TCHAR跟char是一样的，但是宽字符的程序编译可不能这么转 如果真要用单字符转宽字符字符串，楼主查一下调用什么函数
user-0 提问: 如果一个常量大于int所能表示的范围，需要用它作为循环的终止条件怎么办？

回复:
user: user-0
content: 引用 7 楼 xiaohuh421 的回复:编写程序的时候， 你就需要考虑到溢出的问题。 不管你使用多大的数据类型，都是需要考虑的。 不然， 你以为“千年虫”是怎么发生的。 您说的对。

user: user-0
content: 引用 6 楼 mewiteor 的回复:[quote=引用 5 楼 rockpk008 的回复:] [quote=引用 2 楼 mewiteor 的回复:] 至于3和0FB397A74，你打开计算器，选择程序员模式，输入17099750004，切换到16进制，一看就明白了。  是的用了long long Int就没有问题了。我想问一下，方框中的汇编，为什么要这样比较呢？[/quote] 比较大小要从高位比起，这里相当于2的32次方进制的数比较大小，对于17099750004转化成2的32次方进制的数就是 (3,0FB397A74)2^32 所以就是先比高位3,再比低位0FB397A74。[/quote]  多谢指点

user: user-1
content: 编写程序的时候， 你就需要考虑到溢出的问题。 不管你使用多大的数据类型，都是需要考虑的。 不然， 你以为“千年虫”是怎么发生的。

user: user-2
content: 引用 5 楼 rockpk008 的回复:[quote=引用 2 楼 mewiteor 的回复:] 至于3和0FB397A74，你打开计算器，选择程序员模式，输入17099750004，切换到16进制，一看就明白了。  是的用了long long Int就没有问题了。我想问一下，方框中的汇编，为什么要这样比较呢？[/quote] 比较大小要从高位比起，这里相当于2的32次方进制的数比较大小，对于17099750004转化成2的32次方进制的数就是 (3,0FB397A74)2^32 所以就是先比高位3,再比低位0FB397A74。

user: user-0
content: 引用 2 楼 mewiteor 的回复:至于3和0FB397A74，你打开计算器，选择程序员模式，输入17099750004，切换到16进制，一看就明白了。  是的用了long long Int就没有问题了。我想问一下，方框中的汇编，为什么要这样比较呢？

user: user-3
content: 使用一楼的方法试一试

user: user-4
content: 在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。

user: user-2
content: 至于3和0FB397A74，你打开计算器，选择程序员模式，输入17099750004，切换到16进制，一看就明白了。

user: user-2
content: c语言中，有一种数据类型是long long,它是64位的，占8个字节。 c语言中，还有一个头文件是stdint.h，里面有1、2、4、8个字节的有/无符号整数类型。
user-0 提问: buf[tnum++] = 0x0d; 是先取tnum的值，再加1吗？

回复:
user: user-1
content: int i = 10; 00C595FE  mov         dword ptr [i],0Ah   	int num = i++; 00C59605  mov         eax,dword ptr [i]   00C59608  mov         dword ptr [num],eax   00C5960B  mov         ecx,dword ptr [i]   00C5960E  add         ecx,1   00C59611  mov         dword ptr [i],ecx     	int i = 10; 000795FE  mov         dword ptr [i],0Ah   	int num = ++i; 00079605  mov         eax,dword ptr [i]   00079608  add         eax,1   0007960B  mov         dword ptr [i],eax   0007960E  mov         ecx,dword ptr [i]   00079611  mov         dword ptr [num],ecx

user: user-2
content: 引用 3 楼 user-5 的回复:[quote=引用 2 楼 mbctb 的回复:] 更进一步的，我想问：  buf[tnum +＝ 2] = 0x0d;  是不是相当于： buf[tnum] = 0x0d; tnum += 2; 这个倒不是了，这个是这样的 tnum += 2; buf[tnum] = 0x0d; 所以++和--是比较奇葩的，其实具体你可以写个小程序看反汇编就知道了。[/quote]

user: user-3
content: 是的，先引用后增值

user: user-4
content: ++有两种， 一种在前面： ++k，一种在后面： k++，它们应该看作是两种完全不同的操作符。 +=，与它们没有可比性。

user: user-5
content: 引用 4 楼 mbctb 的回复:[quote=引用 3 楼 user-5 的回复:] [quote=引用 2 楼 mbctb 的回复:] 更进一步的，我想问：  buf[tnum +＝ 2] = 0x0d;  是不是相当于： buf[tnum] = 0x0d; tnum += 2; 这个倒不是了，这个是这样的 tnum += 2; buf[tnum] = 0x0d; 所以++和--是比较奇葩的，其实具体你可以写个小程序看反汇编就知道了。[/quote] 好的，非常感谢！[/quote] 客气了，同学，共同探讨，共同研究，共同进步！

user: user-0
content: 引用 3 楼 user-5 的回复:[quote=引用 2 楼 mbctb 的回复:] 更进一步的，我想问：  buf[tnum +＝ 2] = 0x0d;  是不是相当于： buf[tnum] = 0x0d; tnum += 2; 这个倒不是了，这个是这样的 tnum += 2; buf[tnum] = 0x0d; 所以++和--是比较奇葩的，其实具体你可以写个小程序看反汇编就知道了。[/quote] 好的，非常感谢！

user: user-5
content: 引用 2 楼 mbctb 的回复:更进一步的，我想问：  buf[tnum +＝ 2] = 0x0d;  是不是相当于： buf[tnum] = 0x0d; tnum += 2; 这个倒不是了，这个是这样的 tnum += 2; buf[tnum] = 0x0d; 所以++和--是比较奇葩的，其实具体你可以写个小程序看反汇编就知道了。

user: user-0
content: 更进一步的，我想问：  buf[tnum +＝ 2] = 0x0d;  是不是相当于： buf[tnum] = 0x0d; tnum += 2;

user: user-5
content: 是这样的，如果++在前面，那么就把你写的那个顺序反一下。
user-0 提问: 关于fwrite函数

回复:
user: user-1
content: 跟大小端无关，3楼是对的。

user: user-2
content: 大小端----字节序.. 网络字节序：大端   big-endian, 这是网络传输协议中规定采用的字节序 主机字节序：跟据主机而定,  可能是 大端与可能是小端  little-endian  htons(), ntohs().  等系列函数将主机字节序与网络字节序(大端)相互转换 如果楼主想  fwrite 到文件 时保持跟  输入 时看到的一样   packet = htons(packet); // 转换成    (大端---大尾序---网络序---be序----------  N多种叫法 fwrite (&packet, 2, 1, pFile1);  当fread 时 也要做相应的转换   ntohs() ,  转换回主机字节序  // -------------------------------------------- htons(), ntohs().  等系列函数 在 windows 中头文件好像是  winscok.h,  需要添加   ws2_32.lib linux 在 arpa/inet.h ..... 具体可查资料.

user: user-0
content: 刚按照二楼所说的百度了一下，只是大小端这种问题可以改变吗？比如我现在是小端如何改为大端呢

user: user-3
content: 第一张图片上面的下标是0 和1 第二张图片，按照人类可读方式，按字节从右向左，因此还是和第一张保持一致的

user: user-0
content: 引用 1 楼 dooX8086 的回复:整数packet ? 这个是 short packet  ？ 大小端问题: short packet  = 0x0ffc;  小端 :  fc  0f 大端:  0f  fc  详细可搜索:  内存 大小端  求教，这要怎么改代码呢？

user: user-2
content: 整数packet ? 这个是 short packet  ？ 大小端问题: short packet  = 0x0ffc;  小端 :  fc  0f 大端:  0f  fc  详细可搜索:  内存 大小端
user-0 提问: 新人求助。

回复:
user: user-1
content: malloc realloc free

user: user-2
content: 也觉得你应该调试一下看看问题在哪。 另外，那个冒泡排序难道不是  for(int i=0; i<N; i++) for(int j = 0; j<N-i; j++) ... 么？ 我也是新手

user: user-3
content: 调试一下看看哪里出问题

user: user-0
content: 引用 1 楼 FightForProgrammer 的回复:调试一下看看哪里出问题  原来调试以后是这样的……感觉就没读入数字……输出的是未初始化的随机值?

user: user-0
content: 引用 4 楼 user-5 的回复:你是在读取之后才为它分配内存的，这不行。。。 i初始值应为0. 主要是想让这个排序算法能够自动分配内存空间……所以……如果人为分配的话，还要靠人去数出个数，感觉并不是很好……所以……

user: user-0
content: 引用 4 楼 user-5 的回复:你是在读取之后才为它分配内存的，这不行。。。 i初始值应为0. 一开始我是想把i初始化0的，但是后面发现如果我要用在数组里，如果i=0，第一次读取一个数据以后，想要扩大数组……就无法实现了，因为我是用i*sizeof(int)，这个时候还是原来的大小（i++后i=1）,所以我就想是不是从1开始……把0那个空出来……

user: user-4
content: 修改如下  int main(void) { 	int *n; 	int i = 1, t; 	if ((n = (int*)malloc(sizeof(int))) == NULL) 	{ 		printf("Not able to allocate memory.\n"); 		exit(1); 	} 	while (scanf_s("%d", &n[i - 1], 1))  //这里是i-1 	{ 		i++; 		if ((n = (int*)realloc(n, i*sizeof(int))) == NULL) 		{ 			printf("Not able to allocate memory.\n"); 			exit(1); 		} 		//n = (int*)realloc(n, i*sizeof(int));   //这句不要 	} 	//其它…… 	return 0; }

user: user-5
content: 你是在读取之后才为它分配内存的，这不行。。。 i初始值应为0.
user-0 提问: 关于函数中传参的名称

回复:
user: user-1
content: 引用 17 楼 xiaohuh421 的回复:[quote=引用 16 楼 zhao4zhong1 的回复:] 别急着++,在64位系统上编译链接调试看看结果吧。  赵老师教训得是。  代码的正确性可能有待考证， 但思路还是可行的。[/quote] 64位上，前几个参数默认是通过寄存器传递的。

user: user-2
content: 当然你定义函数的时候，不写名字，函数内你不能直接用不上了，但是可以间接方式，使用内联汇编取出函数参数的值 像这样  #include <stdio.h> #include <stdlib.h>  void fun(int a, int b) { 	unsigned int i, j; 	long ret;  #if 1 	asm volatile ( 			"movl 12(%%ebp), %%eax\n\t"//参数b 			"movl 8(%%ebp), %%ebx\n\t" //参数a 			"movl 4(%%ebp), %%ecx\n\t" //ret 			:"=a"(i), "=b"(j), "=c"(ret) 			:); 	printf("p2 = %x; p1 = %x; ret = %p\n", i, j, ret); #endif }  int main(int argc, char *argv[]) { 	fun(1, 2); 	exit(0); }

user: user-3
content: 函数声明的时候可以只给出参数类型，不给出变量名。 但在定义的时候，如果也不给出变量名，一般情况下则无法使用该变量

user: user-4
content: 引用 16 楼 zhao4zhong1 的回复:别急着++,在64位系统上编译链接调试看看结果吧。  赵老师教训得是。  代码的正确性可能有待考证， 但思路还是可行的。

user: user-1
content: 引用 11 楼 xiaohuh421 的回复:[quote=引用 10 楼 kkk2017 的回复:] void foo(int,int) { 	int myparam[1]; 	int *pmyp=myparam; 	printf("myparam0=%d,myparam1=%d\n",*((int*)pmyp+4),*((int*)pmyp+5)); }  int _tmain(int argc, _TCHAR* argv[]) { 	foo(56,45); 	return 0; } ++[/quote] 别急着++,在64位系统上编译链接调试看看结果吧。

user: user-0
content: 引用 5 楼 a461874693 的回复:既然要用到形参，为什么要省略它的名字呢，加一个能表示它作用的形参名不更好吗 我觉得c居然可以这样写，应该有他的道理，可能在什么情况下会用得到

user: user-0
content: 嗯，我的意思是这样写什么含义，我认为你没有名称根本就用不了这个参数，但是我听别人说可以用指针对其进行操作，就是不知道这里怎么做

user: user-0
content: 引用 10 楼 kkk2017 的回复:void foo(int,int) { 	int myparam[1]; 	int *pmyp=myparam; 	printf("myparam0=%d,myparam1=%d\n",*((int*)pmyp+4),*((int*)pmyp+5)); }  int _tmain(int argc, _TCHAR* argv[]) { 	foo(56,45); 	return 0; }  什么意思呀

user: user-4
content: 引用 20 楼 zhao4zhong1 的回复:64位上，前几个参数默认是通过寄存器传递的。  原来如此， 谢谢赵老师指点。

user: user-5
content: void foo(int ,int ); //这里可以没有形参名 int main void){ foo(56,45); return 0; } void foo(int a, int b){ 这里使用a，b }

user: user-6
content: 如果你传进去的参数没有使用foo（）参数里面想写几个，写几个，当然不写最省事，既然要用，没形参，怎么使用实参的值。支持1，2楼

user: user-4
content: 引用 10 楼 kkk2017 的回复:void foo(int,int) { 	int myparam[1]; 	int *pmyp=myparam; 	printf("myparam0=%d,myparam1=%d\n",*((int*)pmyp+4),*((int*)pmyp+5)); }  int _tmain(int argc, _TCHAR* argv[]) { 	foo(56,45); 	return 0; } ++

user: user-7
content: void foo(int,int) { 	int myparam[1]; 	int *pmyp=myparam; 	printf("myparam0=%d,myparam1=%d\n",*((int*)pmyp+4),*((int*)pmyp+5)); }  int _tmain(int argc, _TCHAR* argv[]) { 	foo(56,45); 	return 0; }

user: user-1
content: 引用 6 楼 xiaohuh421 的回复:void foo(int ,int ){   ...... } 这里没有变量名, 一般方式就没办法用了. 当然, 这种情况你可以通过内嵌汇编来访问这两个变量,  但是SB才会在这种情况下用内嵌汇编. 不是SB，是ZB！

user: user-8
content: 楼主不是逗吗？想使用传进去的变量竟然需要加变量名  声明的时候可以不加，或者使用与定义时不一样的变量名字

user: user-9
content: 《汇编语言》 -- 王爽 “综合研究部分 -- 不定参函数实现机制”

user: user-4
content: void foo(int ,int ){   ...... } 这里没有变量名, 一般方式就没办法用了. 当然, 这种情况你可以通过内嵌汇编来访问这两个变量,  但是SB才会在这种情况下用内嵌汇编.

user: user-10
content: 既然要用到形参，为什么要省略它的名字呢，加一个能表示它作用的形参名不更好吗

user: user-10
content: 引用 1 楼 wwwboyxa 的回复:hehe 函数声明时可以这样，函数定义时不能这样  #include <iostream> using namespace std; int foo(int, int) { 	return 5; }  int main() { 	cout << foo(10,20) << endl; 	return 0; } 定义写成这样并不会报错

user: user-11
content: 支持上面两位
user-0 提问: 按键扫描程序

回复:
user: user-1
content: 这要根据实际电路来理解，搜索4*4矩阵键盘。

user: user-2
content: 这个应该是4*4的键盘 所以先扫X行，对应端口P1.0-P1.3 接着再扫Y列，对应端口P1.4-P1.7 最终得出键值。

user: user-0
content: AD转换的精度是什么意思？

user: user-3
content: 这个得计算AD转换的精度，

user: user-4
content: 在百度图片中搜“键盘扫描电路”
user-0 提问: gcc 参数

回复:
user: user-1
content: http://blog.csdn.net/digent1/article/details/40477773

user: user-1
content: -l是一个单独的参数，表示要链接后面紧跟着的库，在这里就是要链接nsl.a 类似的例子： gcc -lpthread test.c

user: user-2
content: 1.man gcc 2.gcc在线手册 http://tps://gcc.gnu.org/onlinedocs/5.1.0/

user: user-3
content: man gcc

user: user-4
content: gcc -v --help

user: user-4
content: gcc --help
user-0 提问: 这个表达式怎么理解？for(int j = 0, have = 1; j < num; j++)

回复:
user: user-1
content: #7   正解!

user: user-2
content: 引用 5 楼 mbctb 的回复:[quote=引用 4 楼 hhhhhhhhhhkkkkkkkkkk 的回复:] 那个int j=0,have=1;就是一个变量声明语句而已。这是c++的风格。标准C没有。  这表示什么？是定义int j，再改变已有变量have的值，而不是定义新变量have？[/quote] 不是，定义了j和have这两个变量，都是int型的，同时为他们赋了初始值。

user: user-3
content: C99从C++引入的新特性 1.定义循环变量 2.作用域据域仅在for循环体 3.不算赋值表达式，算初始化

user: user-4
content: int j=0,have=1;等于int j=0;int have=1;int j=0,have=1;这样写方便，是C++的基础语法

user: user-0
content: 引用 4 楼 hhhhhhhhhhkkkkkkkkkk 的回复:那个int j=0,have=1;就是一个变量声明语句而已。这是c++的风格。标准C没有。  这表示什么？是定义int j，再改变已有变量have的值，而不是定义新变量have？

user: user-2
content: 那个int j=0,have=1;就是一个变量声明语句而已。这是c++的风格。标准C没有。

user: user-5
content: 这个事典型的c++生命语句。

user: user-6
content: 随用随声明是C++语法。

user: user-7
content: for的第一部分可以是变量声明也可以是表达式，在这个例子中是声明。 int直到分号前都有效。
user-0 提问: backtrace_symbols返回值，取值导致程序崩溃。

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

回复:
user: user-1
content: 我和你在这方面知道的一样多。 在百度或百度图片搜“音频FFT”

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:0..1023 1024..2047 2048..3071 3072..4095 ...如果这样取n个1024段，那么是不是就得到了n个频谱图了？老师能不能留个qq交流下，拜托了

user: user-1
content: 0..1023 1024..2047 2048..3071 3072..4095 ...

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:连续取。 频谱是随时间变化的。 推荐学习使用Audition软件。您好，那么请问下频谱随时间变化应该是怎么变的呢？就是所取的1024个点在时间轴上依次滑动吗？应该以怎样的速率华东呢？

user: user-1
content: 连续取。 频谱是随时间变化的。 推荐学习使用Audition软件。
user-0 提问: Linux 时间 日期

回复:
user: user-1
content: sleep(24 * 60 * 60); A();

user: user-0
content: 还是不算很明白，希望大家帮忙啊。~~~~

user: user-2
content: #inclue"time.h" 	time_t t; 	time( &t); 	struct tm* starttime = localtime(&t); 	 ... 	time(&t); 	struct tm *endtime = localtime(&t); 	if(endtime->tm_hour - 24 == starttime->tm_hour) 	{ 		time( &t); 		struct tm* starttime = localtime(&t); 		func(); 	}

user: user-3
content: 执行A程序，只需要捕捉SIGALRM信号即可

user: user-3
content: 1.定时  #include <unistd.h> unsigned int alarm(unsigned int seconds); Returns: 0 or number of seconds until previously set alarm   2.设置时间  #include <sys/time.h> int clock_settime(clockid_t clock_id, const struct timespec *tsp);

user: user-4
content: 参考crontab命令

user: user-5
content: 先使用sigaction或者signal设置到达时间时执行的函数, 然后 #include <unistd.h> unsigned int alarm(unsigned int seconds);

user: user-6
content: 启动时记录下时间，起一个定时器，定时检测是否到24小时。 到了就执行你要的工作。 时间可以直接用time_t的格式，以秒为单位相减。

user: user-7
content: 不想写代码就用crontab  或者用libevent也行，轮询的方式要不得精度低，耗资源

user: user-0
content: 引用 4 楼 a30037338 的回复: #inclue"time.h" 	time_t t; 	time( &t); 	struct tm* starttime = localtime(&t); 	 ... 	time(&t); 	struct tm *endtime = localtime(&t); 	if(endtime->tm_hour - 24 == starttime->tm_hour) 	{ 		time( &t); 		struct tm* starttime = localtime(&t); 		func(); 	}    这样做感觉要专门用一个线程来处理时间吧，一直在获取本地时间才可以  有其他的方式没有啊。