Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 初学者 求一个数的四色无人

回复:
user: user-1
content: C99和C++11有round()。 这里有一个实现 http://en.cppreference.com/w/c/numeric/math/round  要注意负数的情况，round(x)=sgn(x)*trunc(abs(x) + 0.5)。

user: user-2
content: 仅供参考：//Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); }

user: user-3
content: void main() { 	double x = 3.1159; 	double result = floor(x * pow(10.0, 2.0) + 0.5)/pow(10.0, 2.0); 	printf("%f四舍五入精确到小数点后两位为：%f\n",x,result); }

user: user-4
content: b = (int)(a + 0.5);
user-0 提问: 出现这个问题是怎么回事有没有大神解释下！

回复:
user: user-1
content: 引用 2 楼 kevin_IoT 的回复:贴代码的时候能不能规范点，你这样叫人哪有兴趣看你的代码666

user: user-2
content: Do not let me think! Keep it simple and stupid.

user: user-3
content: 不要使用这种语句，尽量在一行代码上，只写一条语句。这种代码没有任何好处，既不直观，又不能提高编译和执行速度。 if( fp = (fopen("file.dat", "w")) == NULL)  建议改为两句 fp = (fopen("file.dat", "w"))； if（NULL == fp）

user: user-0
content: 哦哦！谢谢，懂了！

user: user-4
content: #include<stdio.h> #include<stdlib.h> void main(int argc, char **argv) { 	FILE *fp; 	char ch; 	if ((fp = fopen("file.dat", "w")) == NULL) 	{ 		printf("Can not open file.\n"); 		exit(0); 	}  	//fopen("file.dat", "w"); 	ch = getchar(); 	while (ch != '#') 	{ 		fputc(ch, fp); 		putchar(ch); 		ch = getchar(); 	} 	fclose(fp); }

user: user-5
content: 贴代码的时候能不能规范点，你这样叫人哪有兴趣看你的代码

user: user-6
content: if( fp = (fopen("file.dat", "w")) == NULL)     if( (fp = fopen("file.dat", "w")) == NULL)   int main(int argc, char **argv)
user-0 提问: 急在线等！！！！！！！！！！！！！

回复:
user: user-1
content: 仅供参考：#include <stdio.h> long a=10000; long b; long c=2800; long d; long e; long f[2801]; long g; int main() {     for(;b-c;) f[b++]=a/5; //  while (1) { //      if (0==b-c) break; //      f[b]=a/5; //      b++; //  }      //f[0 - 2800] = 10000/5     for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)           for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); //  while (1) { //      d=0; //      g=c*2; //      if (0==g) break; //      b=c; //      while (1) { //          d+=f[b]*a; //          f[b]=d%--g; //          d/=g--; //          --b; //          if (0==b) break; //          d*=b; //      } //      c-=14; //      printf("%.4d",e+d/a); //      e=d%a; //  }      return 0; }
user-0 提问: 帮小弟看个代码呗。fatal error LNK1120: 2 unresolved externals

回复:
user: user-1
content: 最好使用中文编译器，显示的将是中文错误、警告信息。

user: user-0
content: 谢谢大家，我的问题解决了。

user: user-2
content: 看2楼的代码

user: user-3
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-4
content: prinft 改成 printf   拼写错误，一般编译器会用红线提示吧

user: user-5
content: #include <stdio.h> #define PI 3.14 void main() { 	double  r, k, s; 	scanf("%lf", &r); 	k = 2 * PI*r; 	s = PI*r*r; 	printf("circle:%.2f  area:%.2f\n", k, s); }

user: user-6
content: 编译提示：error C2065: 'prinft' : undeclared identifier，就要仔细看看了...printf

user: user-7
content: 楼主把prinft拼写错了
user-0 提问: 指针函数的问题。。。

回复:
user: user-1
content: 返回的是当前EAX寄存器中的值，而这个值是什么你是不能确定的，是未定义行为  能收到不表示正确，或许换个编译器就是错的，需要自己加上return tmp;

user: user-2
content: 返回的是EAX寄存器里的值（这里刚好是指针变量的值）

user: user-3
content: “未定义行为”

user: user-4
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-5
content: 函数没有return的话，返回的是EAX寄存器里的值（这里刚好是指针变量的值）
user-0 提问: 关于函数调用的问题

回复:
user: user-0
content: #include <stdio.h>  #include <stdlib.h>  char t[110];  int strlen(char s[])  {      int i;      for(i=0;s[i];i++);          return i;  }  void print(char t[])  {      int i;      for(i=0;t[i];i++)          printf("%c",t[i]);      printf("\n");  }  void concat(char t[],char s1[],char s2[])  {      int i,j;      t=(char *)malloc((strlen(s1)+strlen(s2))*sizeof(char));      for(i=0;s1[i];i++)          t[i]=s1[i];      for(j=0;s2[j];j++)          t[i++]=s2[j];          t[i]='\0';      }  int main()  {      char st1[110],st2[110];      while(gets(st1)!=NULL)      {          gets(st2);          concat(t,st1,st2);          print(t);      }      return 0;  } 这样就不对，为什么？

user: user-0
content: 不是那里的问题，上面的程序是对的，如果把我标记的print();放在主函数里调用，程序就运行不出结果，为什么；

user: user-1
content: t[i]='\0'； 这句后面的分号你打成中文的分号了，改成英文的

user: user-2
user-0 提问: 对方给了私钥的明文，如何用openssl来进行rsa加密呀

回复:
user: user-1
content: 私钥 = 解密 签名 公钥 = 加密 验证签名

user: user-2
content: 公钥加密 ，私钥解密，双方都要有对方的公钥

user: user-3
content: 当然可以了，不过一般是公钥加密，私钥解密。 私钥加密一般用在签名上面，签名的过程主要是先对数据做摘要，然后对摘要结果做私钥加密。
user-0 提问: 用栈写了一个“数值转换”的题目，执行时崩溃了。调试时显示“初始化”处第一行的s->base没办法进入，望指教

回复:
user: user-1
content: initstack里面s->base = (int *)malloc(STACK_INIT_SIZE  * sizeof(int));

user: user-0
content: 自己写的程序，总是容易崩溃，望大神们指教一下，问题何在？实在是不知道问题出在哪里，它崩溃了，我也好崩溃啊

user: user-0
content: 引用 3 楼 qq423399099 的回复:你这个很多处小错误： 1.需要为S分配空间才行，否则它指向的是未知区域（野指针），S = (sqstackp)malloc(sizeof(sqstack)); 2.scanf("%d", N);少了一个& 3.s->base = (int *)malloc(sizeof(int));应该是s->base = (int *)malloc(sizeof(int)* STACK_INIT_SIZE); 4.#define  STACK_INIT_SIZE 10后面多了分号  #include<stdio.h> #include<stdlib.h> #include<malloc.h>  #define  STACK_INIT_SIZE 10 #define  STACKINCREMENT  5 typedef struct{ 	int *base; 	int *top; 	int stacksize; }sqstack, *sqstackp;   int initstack(sqstackp &s){ 	s->base = (int *)malloc(sizeof(int)* STACK_INIT_SIZE); 	if (!s->base) 		return 0; 	s->top = s->base; 	s->stacksize = STACK_INIT_SIZE; 	return 1; }  int push(sqstackp s, int e){ 	if (s->top - s->base >= s->stacksize){ 		s->base = (int *)realloc(s->base, 10 * sizeof(int)); 		if (!s->base) 			return 0; 		s->top = s->base + s->stacksize; 		s->stacksize += STACKINCREMENT; 	} 	*s->top++ = e; 	return 1; }   int pop(sqstackp s, int &e){ 	if (s->top == s->base) 		return 0; 	e = *--s->top; 	return 1; }   int stackempty(sqstackp s){ 	if (s->top == s->base) 		return 1; 	else 		return 0; }  sqstackp S; int N, e;  int main(){   	S = (sqstackp)malloc(sizeof(sqstack)); 	initstack(S); 	scanf("%d", &N);  	while (N){ 		push(S, N % 8); 		N = N / 8; 	}  	while (!stackempty(S)){ 		pop(S, e); 		printf("%d", e); 	} 	return 0; }    谢谢你第一个问题最重要的，别人也跟我说过“野指针"会使程序崩溃，但我没懂，谢谢谢谢

user: user-0
content: 引用 2 楼 qq_28510761 的回复:initstack里面s->base = (int *)malloc(STACK_INIT_SIZE  * sizeof(int)); 那只是书上这样写的，真正运行时不对

user: user-2
content: 你这个很多处小错误： 1.需要为S分配空间才行，否则它指向的是未知区域（野指针），S = (sqstackp)malloc(sizeof(sqstack)); 2.scanf("%d", N);少了一个& 3.s->base = (int *)malloc(sizeof(int));应该是s->base = (int *)malloc(sizeof(int)* STACK_INIT_SIZE); 4.#define  STACK_INIT_SIZE 10后面多了分号  #include<stdio.h> #include<stdlib.h> #include<malloc.h>  #define  STACK_INIT_SIZE 10 #define  STACKINCREMENT  5 typedef struct{ 	int *base; 	int *top; 	int stacksize; }sqstack, *sqstackp;   int initstack(sqstackp &s){ 	s->base = (int *)malloc(sizeof(int)* STACK_INIT_SIZE); 	if (!s->base) 		return 0; 	s->top = s->base; 	s->stacksize = STACK_INIT_SIZE; 	return 1; }  int push(sqstackp s, int e){ 	if (s->top - s->base >= s->stacksize){ 		s->base = (int *)realloc(s->base, 10 * sizeof(int)); 		if (!s->base) 			return 0; 		s->top = s->base + s->stacksize; 		s->stacksize += STACKINCREMENT; 	} 	*s->top++ = e; 	return 1; }   int pop(sqstackp s, int &e){ 	if (s->top == s->base) 		return 0; 	e = *--s->top; 	return 1; }   int stackempty(sqstackp s){ 	if (s->top == s->base) 		return 1; 	else 		return 0; }  sqstackp S; int N, e;  int main(){   	S = (sqstackp)malloc(sizeof(sqstack)); 	initstack(S); 	scanf("%d", &N);  	while (N){ 		push(S, N % 8); 		N = N / 8; 	}  	while (!stackempty(S)){ 		pop(S, e); 		printf("%d", e); 	} 	return 0; }
user-0 提问: 计算某日是该年的第几天

回复:
user: user-1
content: leap和number这两个函数重复定义了，应该是在其它源文件中也定义了这两个函数，然后你将这个源文件和你这个源文件一起编译了

user: user-2
content: COleDateTime::GetDayOfYear int GetDayOfYear( ) const;  Return Value  The day of the year represented by the value of this COleDateTime object.  Remarks  Call this member function to get the day of the year represented by this date/time value.  Valid return values range between 1 and 366, where January 1 = 1. If the status of this COleDateTime object is not valid, the return value is AFX_OLE_DATETIME_ERROR.  For information on other member functions that query the value of this COleDateTime object, see the following member functions:   GetDay   GetMonth   GetYear   GetHour   GetMinute   GetSecond   GetDayOfWeek  COleDateTime Overview |  Class Members |  Hierarchy Chart  See Also   COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus

user: user-3
content: 帮你测试了，能够正常编译链接，重新清理或重建工程再试一下

user: user-4
content: 你是还有别的文件吧？ 你是不是有个叫1.c的文件include了你这个文件

user: user-5
content: scanf  （"%d%d%d&year",这里写错了吧？ for（i=1；i＜m；i++）应该是这样吧？

user: user-5
content: for (i=0;i<m;i++)应该是这样吧？

user: user-6
content: 假设a年b月c日： 将a年b月c日转换成时间戳：timestamp_1 将a年1月1日转换成时间戳：timestamp_2 n = (timestamp_1 - timestamp_2) / (3600*24) + 1 则a年b月c日就是a年的第n天！ 在linux下转换时间戳的系统函数是：mktime

user: user-7
content: 代码没问题，检查一下你工程里多余的文件，清理一下然后重新生成

user: user-8
content: #include "stdio.h" int Day(int year ,int month,int date) {     int months[13]={0,31,0,31,30,31,30,31,31,30,31,30,31} ,i,days=0;     /*是否是闰年*/     if((year % 4 == 0 && year % 100 !=0)||(year % 400 ==0 ))         months[2]=29;     else         months[2]=28;     for(i=0;i<month;i++)      days = days + months[i];     days = days + date;     return days; }
user-0 提问: 段错误，求大家指教，程序代码如下

回复:
user: user-0
content: 恍然大悟，非常感谢两位的解答

user: user-1
content: p = "Lenovo";这样的写法，表示p指向的是常量字符串，一般是禁止进行写操作，要改成在堆栈上的字符串才行。  #include<stdio.h> #include<string.h> #include<stdlib.h>  void reverseMy(char *p);  void reverseMy(char *p) { 	char *t = p + strlen(p) - 1; 	char c;  	for (; p < t; p++, t--) 	{ 		c = *p; 		*p = *t; 		*t = c; 	} }  int main(void){ 	char s[100]; 	char *p = s;  	strcpy(p, "Lenovo");  	reverseMy(p);  	printf("%s\n", p);  	return 0; }

user: user-2
content: p指向的是常量区的字符串（p = "Lenovo";） 所以你不应该在reverseMy中修改该字符串  如果需要复制字符串到s中，使用strcpy
user-0 提问: C语言怎么像从标准输入流那样从字符串中读取指定格式的数据

回复:
user: user-1
content: 引用 11 楼 xiaot_cs001 的回复:引用 10 楼 zhao4zhong1 的回复:[quote=引用 9 楼 xiaot_cs001 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] scanf想读到EOF，输入Enter、Ctrl+Z、Enter是sscanf函数把字符串末尾的'\n'理解成EOF了吗？ 理解和讨论之前请先学会如何观察！  为什么不去看看或单步调试scanf,sscanf,fscanf对应的源代码比如 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c 呢？[/quote]学习了！这就去，再次感谢赵老师[/quote] 上联：人间正道是沧桑； 下联：软件本质是源码。 横批：IT人生

user: user-1
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-0
content: 引用 2 楼 q932104843 的回复:就是把字符串当作输入流这样一个字符一个字符的输入？？ 用指针可以实现吧。确实用指针是可以的，如果有库函数就更好了

user: user-2
content: http://en.cppreference.com/w/c/io/fscanf

user: user-3
content: 我的做法是，每次记录读入了多少长度，下次读取的时候对读取的字符串做个偏移。

user: user-4
content: 就是把字符串当作输入流这样一个字符一个字符的输入？？ 用指针可以实现吧。

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:引用 9 楼 xiaot_cs001 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] scanf想读到EOF，输入Enter、Ctrl+Z、Enter是sscanf函数把字符串末尾的'\n'理解成EOF了吗？ 理解和讨论之前请先学会如何观察！  为什么不去看看或单步调试scanf,sscanf,fscanf对应的源代码比如 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c 呢？[/quote]学习了！这就去，再次感谢赵老师

user: user-1
content: 引用 9 楼 xiaot_cs001 的回复:引用 8 楼 zhao4zhong1 的回复:scanf想读到EOF，输入Enter、Ctrl+Z、Enter是sscanf函数把字符串末尾的'\n'理解成EOF了吗？ 理解和讨论之前请先学会如何观察！  为什么不去看看或单步调试scanf,sscanf,fscanf对应的源代码比如 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c 呢？

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:scanf想读到EOF，输入Enter、Ctrl+Z、Enter是sscanf函数把字符串末尾的'\n'理解成EOF了吗？

user: user-1
content: scanf想读到EOF，输入Enter、Ctrl+Z、Enter

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End. 看了您的代码，明白了sscanf配合%n的这种用法，表示感谢！您的代码中sscanf是可以读到文件结束表及EOF的，随后我测试了一下scanf函数，代码如下： #include <stdio.h> int main() { 	int v = 0, k = 0; 	while (1) 	{ 		k = scanf("%d", &v); 		printf("k,v=%d,%d\n", k, v); 		if (EOF == k) 			break; 	} 	printf("End.\n"); } 输入：1  23  45  67  8 输出： k,v=1,1 k,v=1,23 k,v=1,45 k,v=1,67 k,v=1,8，然后又循环等待输入，并没有输出"End."为什么scanf函数就读不到EOF呢？

user: user-0
content: c++可以通过istringstream实现，我觉得C语言应该也可以的，有人实现过吗，麻烦指点一二
user-0 提问: 如何求二维数组的最大路径

回复:
user: user-1
content: 和你得到最大路径的个数方法大致一样，声明两个整数数组：一个临时性存储每一次尝试的路径的足迹（即所连的数字，逐个压入数组），在循环中每次尝试都被重置和填充。另一个存储到目前为止的最长路径所记录的足迹（即所连的数字）。当新计算的最大步数超过上一次最长的记录，更新最大步数时，也更新一下足迹数组。
user-0 提问: 怎么用位运算得到一个数是几位的

回复:
user: user-1
content: 引用 26 楼 java_charpnet 的回复:[quote=引用 25 楼 DelphiGuy 的回复:] 肯定比循环快。  像什么_BitScanReverse，你是什么地方学到的啊，我怎么闻所未闻[/quote]  学无止境...

user: user-1
content: 引用 11 楼 u010165006 的回复:这个应该int就32位、char就8位吧，不管值是多少。 int a; printf("a的位数是：%d\n",sizeof(a)*8);  他的意思是： ... 0 1 0 0  (0x4) ... 4 3 2 1

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

user: user-3
content: Cortex M3里面有个CLZ指令，可以返回前导零的数量，用32减之就是你要的结果。。。 另外有个RBIT指令将整个32位反转。。。

user: user-0
content: 引用 25 楼 DelphiGuy 的回复:肯定比循环快。  像什么_BitScanReverse，你是什么地方学到的啊，我怎么闻所未闻

user: user-1
content: 肯定比循环快。

user: user-0
content: 引用 23 楼 DelphiGuy 的回复:这个是标准写法呀   你这等于是循环，看来除了循环只能用cpu指令了

user: user-1
content: 这个是标准写法呀

user: user-4
content: 引用 21 楼 java_charpnet 的回复:[quote=引用 20 楼 DelphiGuy 的回复:] 这样的话你自己判断一下就可以了 if (输入 <= 8)   输入 = 8; else if (输入 <= 16)   输入 = 16; else   输入 = 32;  你怎么总是用什么方法，我看主要是凑代码行数的[/quote]  确实，他把else  if都分成两行

user: user-0
content: 引用 20 楼 DelphiGuy 的回复:这样的话你自己判断一下就可以了 if (输入 <= 8)   输入 = 8; else if (输入 <= 16)   输入 = 16; else   输入 = 32;  你怎么总是用什么方法，我看主要是凑代码行数的

user: user-1
content: 引用 16 楼 java_charpnet 的回复:[quote=引用 3 楼 DelphiGuy 的回复:] #include <intrin.h> _BitScanReverse _BitScanReverse64 注意结果位序是0起始的。  good good study, day day up   还有没有其他的方法啊，想统一用位运算不想用cpu指令，就是fft的输入不一定是2的幂，比如8那就是8，9要扩展到16[/quote]  这样的话你自己判断一下就可以了 if (输入 <= 8)   输入 = 8; else if (输入 <= 16)   输入 = 16; else   输入 = 32;

user: user-5
content: int msbBit(int n){          /// 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15         ///   0,0,1,1,2,2,2,2,3,3, 3, 3, 3,  3   ,3  ,3,          return "\0\0\1\1\2\2\2\2\3\3\3\3\3\3\3\3"[n];///相当于下面两行 //  static unsigned char bit[]= {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3};  //  return bit[n]; }

user: user-0
content: 引用 4 楼 mLee79 的回复:x86   BSF/BSR ARM  CTZ/CLZ  不用cpu指令还有什么方法啊，就是fft的输入，比如8那就是8，9要扩展到16

user: user-0
content: 引用 8 楼 lm_whales 的回复:哦搞错了 这是统计，1的个数  8Bits以内，还是查表快 超过8BIts分字节判断一下就可以了 这里给个4Bits的查表法 int bitsof(int n){          /// 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15              0,0,1,1,2,2,2,2,3,3, 3, 3, 3,  3   ,3  ,3,      return "\0\0\1\1\2\2\2\2\3\3\3\3\3\3\3\3"[n]; }  也可以的，不过数要2的幂，减1后算1的个数，你这是什么查表，怎么完全看不懂

user: user-0
content: 引用 3 楼 DelphiGuy 的回复:#include <intrin.h> _BitScanReverse _BitScanReverse64 注意结果位序是0起始的。  good good study, day day up   还有没有其他的方法啊，想统一用位运算不想用cpu指令，就是fft的输入不一定是2的幂，比如8那就是8，9要扩展到16

user: user-1
content: 也许显示的时候去掉前导0？

user: user-4
content: 引用 13 楼 DelphiGuy 的回复:[quote=引用 11 楼 u010165006 的回复:] 这个应该int就32位、char就8位吧，不管值是多少。 int a; printf("a的位数是：%d\n",sizeof(a)*8);  他的意思是： ... 0 1 0 0  (0x4) ... 4 3 2 1 [/quote]  不知道他这个用途是什么

user: user-4
content: 这个应该int就32位、char就8位吧，不管值是多少。 int a; printf("a的位数是：%d\n",sizeof(a)*8);

user: user-6
content: ln N +1

user: user-7
content: 可以试试用对数函数硬算。
user-0 提问: 求一下每一行代码的意思

回复:
user: user-1
content: time(&t); //应改为 t=time(NULL);  time_t time(time_t *time) time_t 类型其实事一个长整型 time（）函数：当函数传递参数×time为NULL是，返回一个长整型数值，当传递参数不为NULL时，即代表设定当前时间。 参考函数及数值类型 //参考函数及数值类型：struct tm struct tm {   int tm_sec;   int tm_min;   int tm_hour;   int tm_mday;   int tm_mon;   int tm_year;   int tm_wday;   int tm_yday;   int tm_isdst;   size_t strftime( char *str, size_t maxsize, const char *fmt, struct tm *time ); size_t strftime( 　　char *strDest, 　　size_t maxsize, 　　const char *format, 　　const struct tm *timeptr 　　); /×参数列表：函数strftime()的操作有些类似于sprintf()：识别以百分号(%)开始的格式命令集合，格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面，它们是区分大小写的。 　　%a 星期几的简写 　　%A 星期几的全称 　　%b 月分的简写 　　%B 月份的全称 　　%c 标准的日期的时间串 　　%C 年份的后两位数字 　　%d 十进制表示的每月的第几天 　　%D 月/天/年 　　%e 在两字符域中，十进制表示的每月的第几天 　　%F 年-月-日 　　%g 年份的后两位数字，使用基于周的年 　　%G 年分，使用基于周的年 　　%h 简写的月份名×/ }

user: user-2
content: 这个问题建议分别查一下每个函数的功能和使用方法；这个几行代码的功能是获取当前时间,然后以一定的格式存放到一个字符数组里；
user-0 提问: 大家好，听说Android NDK7已经可以使用纯C/C++开发安卓APP了，有谁用过吗?该用什么编译器呢?求大神告知。

回复:
user: user-1
content: 引用 2 楼 yyxgs 的回复:[quote=引用 1 楼 akirya 的回复:] VS2015 update3 可以创建 Native-Activity 应用程序  感谢大神，我估计不是update3的，请问怎么更新到3呢?[/quote] https://www.visualstudio.com/downloads/download-visual-studio-vs 安装的时候记得选上android相关的

user: user-2
content: 用纯C++开发安卓有什么优势呢。

user: user-0
content: 引用 4 楼 akirya 的回复:[quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 akirya 的回复:] VS2015 update3 可以创建 Native-Activity 应用程序  感谢大神，我估计不是update3的，请问怎么更新到3呢?[/quote] https://www.visualstudio.com/downloads/download-visual-studio-vs 安装的时候记得选上android相关的[/quote]  明白了！非常感谢！

user: user-0
content: 引用 3 楼 csshow 的回复:用纯C++开发安卓有什么优势呢。 引用 4 楼 akirya 的回复:[quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 akirya 的回复:] VS2015 update3 可以创建 Native-Activity 应用程序  感谢大神，我估计不是update3的，请问怎么更新到3呢?[/quote] https://www.visualstudio.com/downloads/download-visual-studio-vs 安装的时候记得选上android相关的[/quote]  请问这是整个VS吗?那我要卸载掉现在的吗?

user: user-0
content: 引用 1 楼 akirya 的回复:VS2015 update3 可以创建 Native-Activity 应用程序  感谢大神，我估计不是update3的，请问怎么更新到3呢?

user: user-1
content: VS2015 update3 可以创建 Native-Activity 应用程序
user-0 提问: 由输入语句顺序不同引起的差异和错误  不解

回复:
user: user-1
content: scanf不会接收换行符\n，换行符会留在缓冲区中  可以在scanf后加上 getchar(); 接收了这个换行符

user: user-2
content: scanf  1)不接收 '\n'  2)会跳过前导空白，包括 '\n' ,‘\t’,空格

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];
user-0 提问: dev c++求两个数较大者出错

回复:
user: user-1
content: 不知道，哎给了就好，不然下次我也没得问了 嘿嘿嘿 一起学习吧

user: user-1
content: 最下面这里不是有个结贴的按钮吗  你点进去就知道了

user: user-0
content: 引用 8 楼 axlblma的回复:我刚学的时候也犯过这个错，找了半天都不知道错在哪里当时。。。。 不过既然有用的话就希望你多给点分喽，我问问题也快没分了。。。 嘿嘿嘿 为什么每次都显示给的分和总分不一致…

user: user-0
content: 引用 8 楼 axlblma的回复:我刚学的时候也犯过这个错，找了半天都不知道错在哪里当时。。。。 不过既然有用的话就希望你多给点分喽，我问问题也快没分了。。。 嘿嘿嘿 还真不知道怎么给分…求教…

user: user-1
content: 我刚学的时候也犯过这个错，找了半天都不知道错在哪里当时。。。。 不过既然有用的话就希望你多给点分喽，我问问题也快没分了。。。 嘿嘿嘿

user: user-0
content: 引用 6 楼 axlblma的回复:是不是你输入的时候出现了错误呢   你输入的时候的输入方法是：先输入一个数字，再输入一个英文的逗号，然后再输入一个数字，最后回车 还真是…打成中文的逗号了…

user: user-1
content: 是不是你输入的时候出现了错误呢   你输入的时候的输入方法是：先输入一个数字，再输入一个英文的逗号，然后再输入一个数字，最后回车

user: user-0
content: 引用 4 楼 jennyvenus 的回复:默认的就是int型的函数，如果是int返回值，可以写在后面。不懂……能具体说下吗

user: user-2
content: 默认的就是int型的函数，如果是int返回值，可以写在后面。

user: user-0
content: @Rewen

user: user-0
content: 引用 1 楼 Rewen 的回复:int max(int x, int y);  要写在main前面，不能写在main函数里面。   int max(int x, int y); main() {      int a, b, c;还是不行

user: user-3
content: int max(int x, int y);  要写在main前面，不能写在main函数里面。   int max(int x, int y); main() {      int a, b, c;
user-0 提问: 求助软件中函数高亮的问题

回复:
user: user-1
content: http://bbs.csdn.net/topics/390467268

user: user-2
content: 将IDE的字体，改成等宽字体，所有空格、字母、数字占一个相同宽度，所有汉字占两个宽度，看起来代码整齐。

user: user-0
content: 谢谢版主，安装成功了！

user: user-3
content: 安装个VA插件
user-0 提问: C语言里面的作用域

回复:
user: user-1
content: 加static前缀的局部变量，其生命期和全局变量一样长。

user: user-2
content: 这2个东西，也一直没弄清楚，谢谢，高手，解释

user: user-3
content: int main() {         char  *str = NULL;                  p = Get_Str();         puts(str);                 return 0; } 第一段代码出错了，main函数中有未定义的str，应改为str=Get_Str();   至于你说的问题，首先第一段代码是用一个指针去指定一个字符串，返回字符串的首地址值，子函数结束之后，指针被回收，字符串海存在于内存当中，当主函数put（str）时，自然能把字符打印出来。  另外第二段代码，显然子函数调用之后子函数的局部变量生命周期结束，自然无法打印出来。

user: user-4
content: 引用 3 楼 cfjtaishan 的回复:这个应该不是作用域的问题,确切的说应该是生命域；全局变量的生命域是整个程序,而局部变量的生命域是从所在函数的调用开始,到函数调用结束； 也可以称为:生命周期!

user: user-5
content: 你第一个程序能输出Hello World？？ p = Get_Str();这个p都没定义……

user: user-4
content: 这个应该不是作用域的问题,确切的说应该是生命域；全局变量的生命域是整个程序,而局部变量的生命域是从所在函数的调用开始,到函数调用结束；

user: user-6
content: 不要返回局部对象的指针 这两种代码都是有隐患的，结果也是不确定的

user: user-7
content: 因为你第一种写法，返回的是常量字符串的地址（它不会因为Get_Str函数调用结束就释放） 而第二种写法，char p[] = "Hello World";是在栈上开辟的字符数组，Get_Str函数调用结束就释放了
user-0 提问: 图形库 如ImageMagick或者libgd之类的有人用过吗？请帮下忙

回复:
user: user-1
content: C:\Program Files\ImageMagick-6.6.9-Q16>convert /? Version: ImageMagick 6.6.9-6 2011-04-14 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC Features: OpenMP  Usage: convert [options ...] file [ [options ...] file ...] [options ...] file  Image Settings:   -adjoin              join images into a single multi-image file   -affine matrix       affine transform matrix   -alpha option        activate, deactivate, reset, or set the alpha channel   -antialias           remove pixel-aliasing   -authenticate password                        decipher image with this password   -attenuate value     lessen (or intensify) when adding noise to an image   -background color    background color   -bias value          add bias when convolving an image   -black-point-compensation                        use black point compensation   -blue-primary point  chromaticity blue primary point   -bordercolor color   border color   -caption string      assign a caption to an image   -channel type        apply option to select image channels   -colors value        preferred number of colors in the image   -colorspace type     alternate image colorspace   -comment string      annotate image with comment   -compose operator    set image composite operator   -compress type       type of pixel compression when writing the image   -define format:option                        define one or more image format options …… Image Stack Operators:   -clone indexes       clone an image   -delete indexes      delete the image from the image sequence   -duplicate count,indexes                        duplicate an image one or more times   -insert index        insert last image into the image sequence   -reverse             reverse image sequence   -swap indexes        swap two images in the image sequence  Miscellaneous Options:   -debug events        display copious debugging information   -help                print program options   -list type           print a list of supported option arguments   -log format          format of debugging information   -version             print version information  By default, the image format of `file' is determined by its magic number.  To specify a particular image format, precede the filename with an image format name and a colon (i.e. ps:image) or specify the image type as the filename suffix (i.e. image.ps).  Specify 'file' as '-' for standard input or output.

user: user-1
content: convert /?

user: user-2
content: CxImage，OpenCV ？

user: user-0
content: 自己顶一下，希望有人帮帮忙
user-0 提问: 在下新手，请教一个关于c语言中for循环的问题，求赐教！

回复:
user: user-1
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-0
content: 感谢2楼，现在终于明白了

user: user-2
content: n-- 下个循环要重新初始化，不然直接退出了

user: user-3
content: #include<stdio.h> void inverse(int *p, int n) { 	int *q; 	q = p + n - 1; 	for (;p < q;p++, q--) 	{ 		int t;t = *q;*q = *p;*p = t; 	}  } int main(void) { 	int a[] = { 1,3,5,7,9 }; 	int *m, k;  	for (m = a,k=0;k<5;k++) 		printf("%d", *m++); 	puts(""); 	inverse(a, 5);  	//for (m = a,k=0;k<5;k++) 	int n = 5; 	for(m=a;n>0;n--) 		printf("%d", *m++); 	puts(""); 	return 0; } 输出结果没有问题呀！
user-0 提问: 请问高手，用C语言表示数字从1变化到0（或0变化到1）

回复:
user: user-0
content: 引用 3 楼 lm_whales 的回复:if (a!=a0) 就可以了 如果是硬件编程，直接设置为沿触发即可  对 这样硬件编程也可以 那是不是还的跟软件编程相结合啊

user: user-1
content: 纯软件，可以用两个位或者变量来描述 一个表示现在状态，一个表示新状态  如果二者一致，那就没变化 如果一个为0 一个为1 那就是变化了 如果变了，新状态为1 那就是上升沿来了 如果新状态为0 那就是下降沿来了

user: user-0
content: 哥们我是个初学者  能不能详细的解释一下   尤其是那副图    你用while语句 好像一直就跳不出去了   你这里是不是用到指针了   我这个高压断路器，开关原理是这样的，有个小车它分有实验位置和工作位置  //{小车是可以推动的 }， 当小车处于实验位置或工作位置是断路器都可以合闸，当小车处于实验位置是为实验1， 此时工作位置显示为工作0，当小车处于工作位置是为工作1，此时实验位置显示为实验0； 当小车处于实验位置是断路器合闸正常工作，这是如果继续推进小车把它推进到工作位置， 它要有报警功能  会语音提示"请分断路器”;   下面是我错误的程序  输入信号 断路器=1  输入信号 工作位置=1 if(断路器==1//工作位置==1）   输出  请分断路器；  如果这段程序这样写会把正常工作也给PASS掉   正确的程序原理应该是这样 输入信号 断路器=1  输入信号 工作位置=1 if(断路器==1//工作位置变化从0变为1) 输出  请分断路器； 这样才不会把正常工作也给当成报警了

user: user-1
content: if (a!=a0) 就可以了 如果是硬件编程，直接设置为沿触发即可

user: user-2
content: 用一个变量b记录a的上个值，a为1且b为0是你要的，然后更新b=a

user: user-3
user-0 提问: 谁能回答我下一下腾讯服务器为什么把数据都加载到内存里？

回复:
user: user-1
content: 内存速度快，就是比普通硬盘造价高一些，其实可以，如果资金够充分

user: user-2
content: 有钱的

user: user-3
content: 快啊, 要啥原因, 腾讯这种土豪用不是蛮好的么.   网上不是有人晒过 2T 内存的服务器么, 好像是 4CPU, 128*16G 的条子,  光看着就爽啊...

user: user-4
content: 引用 4 楼 u010165006 的回复:存储是分层次的，cache——内存——硬盘、闪存——磁带、光盘、U盘等  闪存改为固态硬盘

user: user-4
content: 存储是分层次的，cache——内存——硬盘、闪存——磁带、光盘、U盘等

user: user-4
content: 闪存？运行时数据？持久化肯定要存在非易失性存储介质。

user: user-5
content: 主要存在数据库里. .
user-0 提问: c语言写的dll如何返回int数组呢，急等

回复:
user: user-1
content: C 语言不能返回数组，如果想让其返回一个数组，可以让函数返回一个指针，通过指针操作数组。

user: user-2
content: 为了节约硬件资源，最初设计c语言的时候 主函数传递的数组的首地址（这么说不准确，地址只有地址，指针不仅包括地址还包含类型）或者指向数组的指针，要返回也是返回一个指针。

user: user-3
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

user: user-4
content: C语言不能返回数组类型，如果需要返回数组，可以通过传入的参数返回

user: user-5
content: C语法不能返回数组的，只能返回一个int型指针，你的函数原型已经定了吗
user-0 提问: C语言中，对一段函数进行超时判断，请问怎么实现?

回复:
user: user-1
content: 计时器的回调函数和工作函数不在一个线程中，你在回调函数中跳到main函数，会让回调函数的线程崩溃

user: user-2
content: longjmp 不能跨线程。 如果要控制一段函数的运行时间，建议开一个新进程来跑 开新线程理论上是可以的，但问题在于如果函数超时了，你怎么办。用 TerminateThread 很容易发生内存泄漏，因为新线程中申请的内存都无法释放。如果有可靠的中止线程的方法，可以考虑。 开新进程就没那么多顾虑了，超时了就 kill 掉，系统会帮它擦屁股。

user: user-0
content: 我已经解决了   #include <stdio.h>    #include <windows.h>    //子线程函数     char flag = 0; char result = 0;  DWORD WINAPI longTimeFunction(LPVOID pM)   { 	while(1){ 		printf("opreating...\n"); 		Sleep(20); 	} 	result = 1; 	flag = 1; }   //主函数，所谓主函数其实就是主线程执行的函数。    int main()   {       printf("simple multi thread,INFINITE:%d\n",INFINITE);       printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");        	flag = 0;     HANDLE longTimeFunctionHandle = CreateThread(NULL, 0, longTimeFunction, NULL, 0, NULL);       WaitForSingleObject(longTimeFunctionHandle, 200);     if(flag == 0){     	printf("Timeout!\n");     	result = -1;     } 	printf("result: %d\n", result);          return 0; }

user: user-3
content: 执行timeSetEvent的回调函数OneMilliSecondProc()的是另外一个线程，即使不出错，你执行main()的主线程仍然永远阻塞在longTimeFunction上。 一个会阻塞的API，尤其是会无限期阻塞的API应该设计为可设置超时值，超时后返回。如果你的这个第三方dll中有一个API，不支持设置超时值，且会发生无限期阻塞，则只能说明设计这个API的程序员水平实在一般。 而你又无法修改这个DLL的代码，只能走一些偏路来帮他擦屁股了。 开一个线程去调用这个会阻塞的函数，主线程判断过了一段时间还没有返回结果就kill这个线程。这种方法虽然可以实现效果，但十有八九要发生资源泄漏。 一个相对较好的办法就是开一个进程(CreateProcess)去调用这个会阻塞的函数，如果获取到了结果，就通过进程通信技术把结果发回主进程，如果主进程过了一段时间没有得到结果，则可判定为超时，将那个进程杀掉(TerminateProcess)。

user: user-4
content: 《Windows核心编程》

user: user-0
content: 引用 1 楼 iyomumx 的回复:longjmp 不能跨线程。 如果要控制一段函数的运行时间，建议开一个新进程来跑 开新线程理论上是可以的，但问题在于如果函数超时了，你怎么办。用 TerminateThread 很容易发生内存泄漏，因为新线程中申请的内存都无法释放。如果有可靠的中止线程的方法，可以考虑。 开新进程就没那么多顾虑了，超时了就 kill 掉，系统会帮它擦屁股。  我查了一下，是不是用fork函数，启动另一个进程？

user: user-0
content: 有没有一种方法，在主程序里计时，开一个线程执行长时间函数，计时到了以后去内存地址看看数值，如果数值没有赋值，就知道那个线程超时了，把那个线程杀掉，返回timeout异常。

user: user-0
content: 引用 1 楼 iyomumx 的回复:longjmp 不能跨线程。 如果要控制一段函数的运行时间，建议开一个新进程来跑 开新线程理论上是可以的，但问题在于如果函数超时了，你怎么办。用 TerminateThread 很容易发生内存泄漏，因为新线程中申请的内存都无法释放。如果有可靠的中止线程的方法，可以考虑。 开新进程就没那么多顾虑了，超时了就 kill 掉，系统会帮它擦屁股。  哥们儿，帮我想想办法
user-0 提问: 看完Cprimerplus却好多代码看不懂。。

回复:
user: user-1
content: 首先头文件很多你可能暂时用不太到…其次关键字编译器都是有提示的，如果你用重了会报错的，多看错误信息以后什么错误一眼就能看出来，如果你觉得这需要死记硬背只能说编程不太适合你……多练练就会熟悉头某个文件的主要功能

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-3
content: 你的情况可以分两步走，先买本薄的入门的书，没有太多不太常用的细节，学习基本概念、程序编写的基本方法、C语言的大部分基础的语法，入门以后对C语言有了一定了解和整体概念，在回头看C Primer Plus重新学习、加深认识、扩展知识，这样学习应该比较扎实。

user: user-4
content: 很正常，其实看primer还是需要一些基础的。

user: user-5
content: 我个人觉得这本是入门C领域的好书，因为内容极其详细，但对于未有基础的学习者来说，这也成为一大障碍。潭浩强的那本C虽然有个别地方错误，但无关紧要，有了基础后再用CPrimerPlus来提高强化C。

user: user-6
content: 看本易懂的书，比如谭浩强的C程序设计
user-0 提问: 关于联合体的小问题

回复:
user: user-1
content: p3、p5共用内存 p4、p6共用内存 最近写入的有效

user: user-1
content: 因为它们都是指向char型的指针 间接取值，取出了0x22 当然就是十进制的34了
user-0 提问: 数学问题,知道直角三角形2点坐标,3边长度,求第三点坐标

回复:
user: user-1
content: 可以先求直角三角形旋转到与XY轴平行的角度和新的C点坐标，然后再把坐标旋转回去。 大致是这样的（没有验证，错了不要怪我）： angle = arcsin((Xa - Xb) / AB) Xc' = Xa + AC Yc' = Ya Xc = cos(angle) * Xc' - sin(angle) * Yc'; Yc = cos(angle) * Yc' + sin(angle) * Xc';

user: user-2
content: 这样算的话，因为计算机计算过程中会出现 截断的过程，所有 计算机算的值与精确值 之间是存在一定的误差的，所有 像是用数学问题来编程时，一般都要给两者一定的误差值！

user: user-0
content: 引用 2 楼 ID870177103 的回复:公式是对的，肯定是你实现的问题，精度损失什么的 恩,我带入数据,验证这方程式是ok的, 只是不知道是在哪一步解出错了,

user: user-3
content: 公式是对的，肯定是你实现的问题，精度损失什么的

user: user-4
content: 参考《高中数学》三角函数
user-0 提问: 为什么不能直接将getc(stdin) !=EOF做比较？

回复:
user: user-0
content: 感谢各位大神

user: user-1
content: 楼主这种也可以  另外ch=getc(stdin) !=EOF; ch得到的是比较后的布尔值  而 (ch=getc(stdin)) !=EOF 是让ch等于函数返回值，再与EOF比较

user: user-2
content: 它喜欢写成那样。 不代表getc(stdin) !=EOF就不行

user: user-0
content: 但是 while(get(in) !=EOF) 不能实现 while((ch=get(in)) != EOF) 的功能

user: user-3
content: 输出---->输入

user: user-3
content: 能，但是输出不仅仅是为了检测是否EOF 的吧 如果，不是EOF总得做点什么吧 那么，用一个变量存储getc的返回值，不就很自然了么？

user: user-4
content: 怎么不能？谁说不能了？
user-0 提问: 如何使用指针和malloc函数，输入未知长度的字符串到数组

回复:
user: user-1
content: #include <stdio.h>  /* printf, scanf, NULL */ #include <stdlib.h>  /* malloc, free, rand, system */  int main () {     int i,n;     char * buffer;      printf ("输入字符串的长度：");     scanf ("%d", &i);      buffer = (char*)malloc(i+1);  // 字符串最后包含 \0     if(buffer==NULL) exit(1);  // 判断是否分配成功      // 随机生成字符串     for(n=0; n<i; n++)         buffer[n] = rand()%26+'a';     buffer[i]='\0';      printf ("随机生成的字符串为：%s\n",buffer);     free(buffer);  // 释放内存空间      system("pause");     return 0; }

user: user-2
content: /*使用说明*/ /*     linux 下在a.out 后面加一个空格 再输入你想要的字符串 就会malloc内存 然后把你的字符串cpy 进内存了     windows下生成的是.exe 一样的在 先在cmd 模式下进入.exe 目录 在cmd模式中输入 什么什么.exe 空格 再你想要的字符串，就会malloc内存 然后把你的字符串cpy 进内存了 */ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>  int main(int argc, char* argv[]) { 	char* ch = (char*)malloc(strlen(argv[1]) + 1); 	strcpy(ch, argv[1]); 	printf("%s", ch); 	return 0; }

user: user-0
content: 谢谢！不过我还是没有搞懂动态分配的空间是怎么通过指针与数组联系上的。今天回家再好好看看书。自学真是难啊，心中好多疑问，似懂非懂。

user: user-3
content: 1.因为有'\0' 3. 第一种方法是：让用户先输入一个整数来指定接下来要输入的字符串长度，然后malloc输入的整数+1个字节空间就好。 第二种方法是：你只能先开辟一个大一点的空间，让用户输入字符串，然后可以strlen(字符串)，然后malloc对应长度+1的空间

user: user-0
content: 请教： 1.”char *pva=(char *)malloc(sizeof(str));这句话只申请了一个字节的空间，你打印下sizeof(str)就知道了。“ 问：只申请了一个字节的空间是不是我初始化为{0},只有一个元素的原因？ 3.”你让pva指向str?你输入的字符串是写在pva所malloc出来的空间里的，而不是str里的“ 问：相当于代码中声明数组其实是多余的了吧？那么我想把输入字符存入数组，但数组的字符数量又是由用户自己来确定，那又怎么操作呢?因为直接用char srt[LENGTH]来声明数组，好像占用的字节空间很大。  感谢大神的耐心回答！

user: user-3
content: 你这个逻辑完全不对。 1.char *pva=(char *)malloc(sizeof(str));这句话只申请了一个字节的空间，你打印下sizeof(str)就知道了 2.printf("%s",*pva);不需要加* 3.你让pva指向str?你输入的字符串是写在pva所malloc出来的空间里的，而不是str里的  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(void) { 	const int LENGTH = 50; 	char str[] = { 0 };//用于存放字符串 	printf("sizeof(str):%d\n", sizeof(str)); 	char *pva = (char *)malloc(LENGTH + 1); 	//pva = str; //指针指向数组 	 	printf("\nPlease enter a string up to %d characters:", LENGTH); 	scanf("%s", pva); 	printf("%s\n", pva); 	return 0; }
user-0 提问: C 打印二维数组出错

回复:
user: user-0
content: 引用 1 楼 qq423399099 的回复:printf("%d\t", &arrayMap[i][j]);你这句，多加了&吧？ 对数组元素取地址，然后%d打印，打印出来的是地址 出来了，谢谢，确实这个&是多余的

user: user-1
content: printf("%d\t", &arrayMap[i][j]);你这句，多加了&吧？ 对数组元素取地址，然后%d打印，打印出来的是地址
user-0 提问: c语言读文件遇到的一个很奇怪问题：文件读取时文件指针突然变成一个无效地址

回复:
user: user-1
content: 可以改成strncat,如果为了拼接字符串可以用sprintf

user: user-0
content: 找到问题了，中间处理代码使用strcat出了点问题，应该是和结尾字符有关，导致内存越界，感谢上面两位解答。多谢！

user: user-2
content: 越界不一定是fread那句导致的，也可能是你的别的变量越界导致的 你可以把别的语句都注释掉，就光光fread,然后fclose看看有没有问题

user: user-0
content: 引用 2 楼 qq423399099 的回复:你这个肯定是有变量越界了，覆盖到k变量甚至是fp文件指针所在的内存。 极有可能是你fread(buff,1023,1,fp);后面的语句造成的，建议楼主自己检查下，或者贴出来。  每条记录长度固定，绝对小于1023,。变量越界指的是数据超出了变量的表示范围？

user: user-0
content: 引用 1 楼 CharlesSimonyi 的回复:估计是向数组写入数据时越界了。 用GDB 设置一个watch point 监视fp，这样一旦fp被改变便可以断下来看是哪里出了问题  前面忘记说了，数据量是固定的，每条记录绝对小于1023

user: user-2
content: 你这个肯定是有变量越界了，覆盖到k变量甚至是fp文件指针所在的内存。 极有可能是你fread(buff,1023,1,fp);后面的语句造成的，建议楼主自己检查下，或者贴出来。

user: user-3
content: 估计是向数组写入数据时越界了。 用GDB 设置一个watch point 监视fp，这样一旦fp被改变便可以断下来看是哪里出了问题
user-0 提问: 指针的星号到底应该靠前还是靠后呢？

回复:
user: user-0
content: 引用 3 楼 lm_whales 的回复:int*p;//感觉不舒服，可读性不好。 int* p;//强调，p是指针 int * p;//不强调什么，但是多输入一个空格 int *p;//强调指针p 指向整型。  那种都一样，唯一不同的是，感觉不同。 以及暗喻不同。  int* p; 强调 p是（int 类型的）指针类型。 int *p;强调指针 p 指向整型。  明白了，我当然知道编译出来的结果是一样的，只是想看看大家对不同写法的主观感受而已。

user: user-0
content: 引用 7 楼 CharlesSimonyi 的回复:请教一下，上楼梯的时候，应该先抬左脚还是先抬右脚呢？  先抬左脚 先抬右脚  以上两种抬法，大家推荐哪一种抬法呢？  也希望大家说说为什么吧。  我建议先抬左脚，因为我是左撇子，呵呵。

user: user-0
content: 引用 2 楼 Intel0011 的回复:纯C派的喜欢 int *p; C++派的喜欢 int* p; 没什么固定格式  [quote=引用 1 楼 qq423399099 的回复:] 建议靠后，写成int *p; 否则如果是这样：int* p,q; 是不是会把q误当成int *类型呢？ 这个最好还是用typedef解决吧 [/quote]  为什么C++派的喜欢 int* p呢？

user: user-1
content: 这个属于代码风格的问题,建议靠近变量；

user: user-2
content: 引用 8 楼 lm_whales 的回复:

user: user-3
content: int* p1,p2; 我觉得不是误会p2的类型，而是这俩不同类型这么写一块真的好吗...

user: user-2
content: 请教一下，上楼梯的时候，应该先抬左脚还是先抬右脚呢？  先抬左脚 先抬右脚  以上两种抬法，大家推荐哪一种抬法呢？  也希望大家说说为什么吧。

user: user-4
content: 引用 7 楼 CharlesSimonyi 的回复:请教一下，上楼梯的时候，应该先抬左脚还是先抬右脚呢？  先抬左脚 先抬右脚  以上两种抬法，大家推荐哪一种抬法呢？  也希望大家说说为什么吧。 这个估计，大家没啥想法， 但是统计下来，可能是先抬左脚的多 （也许这个猜测是错的，但是不会是一半对一半，这是没问题的，可能是3：7 或者差距更大一点） 因为现实中，左撇子少，大家都是右撇子。 很多应该对称的，实际上并不对称。

user: user-5
content: 个人习惯问题，你喜欢还可以int  *  p

user: user-6
content: 靠后边的变量好一些

user: user-7
content: 个人感觉写在后边应该更好点吧

user: user-8
content: 引用 1 楼 qq423399099 的回复:建议靠后，写成int *p; 否则如果是这样：int* p,q; 是不是会把q误当成int *类型呢？ 同意

user: user-4
content: int*p;//感觉不舒服，可读性不好。 int* p;//强调，p是指针 int * p;//不强调什么，但是多输入一个空格 int *p;//强调指针p 指向整型。  那种都一样，唯一不同的是，感觉不同。 以及暗喻不同。  int* p; 强调 p是（int 类型的）指针类型。 int *p;强调指针 p 指向整型。

user: user-9
content: 纯C派的喜欢 int *p; C++派的喜欢 int* p; 没什么固定格式  引用 1 楼 qq423399099 的回复:建议靠后，写成int *p; 否则如果是这样：int* p,q; 是不是会把q误当成int *类型呢？ 这个最好还是用typedef解决吧

user: user-10
content: 建议靠后，写成int *p; 否则如果是这样：int* p,q; 是不是会把q误当成int *类型呢？
user-0 提问: 关于什么情况下不需要include 头文件

回复:
user: user-1
content: 留心warning。

user: user-2
content: 你只要把真正使用的声明信息 写到 .c 中 并不一定要包含头文件 但是包含头文件，是一个简单方便的方法， 是一个习惯，大家都爱用而已   例如头文件 有函数声明 .c 中只需要有同样的声明就可以了，不是一定要包含头文件的  PS： 包含头文件，最简单，最方便 所以，大家都喜欢这样用，没有几个人自己去写头文件中已经有的代码。

user: user-2
content: 头文件.h，c 文件.c 本质上，都是文本文件 分为.h,.c 只是为了方便 你也可以 把头文件的东西，全部放到.c  不过，容易被误解为真正的.c  头文件往往不含实现代码  编译它是多余的,包含头文件，往往是把头文件的代码复制一份到.c 生成新的文件 然后编译新的文件 如果把.c存储为.h，并且用于包含 自动编译的时候，往往会出问题

user: user-3
content: 如果你A B C三个文件，B包含了A，C再包含B，那么相当于C也包含了A

user: user-4
content: 你头文件B包含了头文件A 你文件C虽然没包含A，但是不是包含了B？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:有些编译环境会隐含#include一些头文件。  你好 我举例说的头文件A B 和原文件D  都是我自己定义的 不是系统自带的

user: user-5
content: 有些编译环境会隐含#include一些头文件。

user: user-6
content: 引用 10 楼 mfcappwizard 的回复:[quote=引用 9 楼 qq423399099 的回复:] [quote=引用 8楼我是你的主体 的回复:][quote=引用 7 楼 qq423399099 的回复:] 不行的，要用extern 而且头文件里尽量不要定义变量，因为很容易出现重定义  是的 头文件 可以用来声明变量 最好不要定义变量  假如在头文件A中声明一个全局变量  头文件B 用到 但是并不include 头文件A  这种情况是否可以 （如果可以的话，就和宏的枪框一样了） 注意是全局变量 不是局部变量[/quote]不行[/quote]  谢谢你这么多次的回答，能否解释一下为什么只有宏可以做到 而其他变量却不能，是在编译的时候或运行的时候，有些地方不允许变量这样吗？ 除了宏，您还知道其他参数可以做到和宏一样的吗？[/quote] 和宏毫无关系，头文件本身是不需要编译的，只要cpp里面的所有变量能自解释就行了，这就是为什么很多人的头文件内容都不全，想复用的时候编都编不过。

user: user-0
content: 引用 9 楼 qq423399099 的回复:[quote=引用 8楼我是你的主体 的回复:][quote=引用 7 楼 qq423399099 的回复:] 不行的，要用extern 而且头文件里尽量不要定义变量，因为很容易出现重定义  是的 头文件 可以用来声明变量 最好不要定义变量  假如在头文件A中声明一个全局变量  头文件B 用到 但是并不include 头文件A  这种情况是否可以 （如果可以的话，就和宏的枪框一样了） 注意是全局变量 不是局部变量[/quote]不行[/quote]  谢谢你这么多次的回答，能否解释一下为什么只有宏可以做到 而其他变量却不能，是在编译的时候或运行的时候，有些地方不允许变量这样吗？ 除了宏，您还知道其他参数可以做到和宏一样的吗？

user: user-4
content: 引用 8楼我是你的主体 的回复:[quote=引用 7 楼 qq423399099 的回复:] 不行的，要用extern 而且头文件里尽量不要定义变量，因为很容易出现重定义  是的 头文件 可以用来声明变量 最好不要定义变量  假如在头文件A中声明一个全局变量  头文件B 用到 但是并不include 头文件A  这种情况是否可以 （如果可以的话，就和宏的枪框一样了） 注意是全局变量 不是局部变量[/quote]不行

user: user-0
content: 引用 7 楼 qq423399099 的回复:不行的，要用extern 而且头文件里尽量不要定义变量，因为很容易出现重定义  是的 头文件 可以用来声明变量 最好不要定义变量  假如在头文件A中声明一个全局变量  头文件B 用到 但是并不include 头文件A  这种情况是否可以 （如果可以的话，就和宏的枪框一样了） 注意是全局变量 不是局部变量

user: user-4
content: 不行的，要用extern 而且头文件里尽量不要定义变量，因为很容易出现重定义

user: user-0
content: 引用 5 楼 qq423399099 的回复:https://www.zhihu.com/question/38235552  谢谢，你的链接解释了这个，这个是不是仅限于宏定义，其他类型的变量是否可以，宏是放在全局变量的区域，如果定义全局变量，也可以这么干吗？ 在头文件B中使用头文件A的变量，而头文件B不include头文件A？

user: user-4
content: https://www.zhihu.com/question/38235552

user: user-0
content: 引用 3 楼 qq423399099 的回复:你头文件B包含了头文件A 你文件C虽然没包含A，但是不是包含了B？  可能没说清楚，上面两种情况是独立的，所以没有源文件D包含头文件B的情况
user-0 提问: 练习使用多case解题

回复:
user: user-1
content: main函数改成下面这样行不行的？ int main() { 	int n, i, j = 0; 	int a[MAX][2];         scanf("%d",&n); 	while(scanf("%d%d",&a[j][0], &a[j][1]) != EOF){ 		j++; 	}        for (i = 0; i < n; i++)       {              printf("%d\n", max_element(a[i][0], a[i][1]));       }     printf("group 1 done\n");     while (a[i][0] != 0 || a[i][1] != 0)     {         printf("%d\n", max_element(a[i][0], a[i][1])); 		i++;     }     printf("group 2 done\n"); 	i++;     for(; i < j; i++)     {         printf("%d\n", max_element(a[i][0], a[i][1]));     }     printf("group 3 done\n"); 	     return 0; }
user-0 提问: 在网上下载了一个jquery.qrcode生成二维码，要怎样保存到本地的文件夹中呀?

回复:
user: user-1
content: 专门登录给楼上点赞，靠谱

user: user-2
content: $('#output').qrcode({                 width: 500,                 height: 500,                 text: trClick.utf16to8(localhref + "?" + qrCode),                 imgWidth: 300/4,            //图片宽                 imgHeight: 300 / 4,           //图片高\                 src: "../img/icon.png"             });             $('#output').css('display', 'block');             var canvas = $('#output').find("canvas")[0];             try {//解决IE转base64时缓存不足，canvas转blob下载                 var blob = canvas.msToBlob();                 navigator.msSaveBlob(blob, qrCode + '.png');             } catch (e) {//如果为其他浏览器，使用base64转码下载                 var url = canvas.toDataURL('image/jpeg');                 $("#download").attr("download", qrCode + '.png')                 $("#download").attr('href', url).get(0).click();             }

user: user-3
content: QR 这种东西, 开源代码一大堆, 为虾米不直接写段代码生成下就是了,  发个jquery 是为虾米啊...  就是用 qrencode 自己生成png也没几行代码的说...

user: user-0
content: 保存图片 不是代码

user: user-4
content: 貌似楼主要保存的是代码吧

user: user-5
content: 从浏览器临时文件夹下将最新的图片文件拷贝出来？
user-0 提问: C语言gets（）函数得到的字符串结尾的是什么？

回复:
user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:查MSDN是Windows程序员必须掌握的技能之一。

user: user-2
content: gets() 函数是 按 行 读入。读入到回车结束。 在内部实现中用'\0'代替回车

user: user-3
content: 查MSDN是Windows程序员必须掌握的技能之一。

user: user-4
content: http://en.cppreference.com/w/c/io/gets

user: user-5
content: s[3]= 0‘\000’，没问题啊 s[3]的值是0 写成字符型就是‘\000’，转义字符，值是八进制的0

user: user-6
content: 怎么不对啊，就是‘\0’啊，‘\000’就是八进制的0的意思，也就是十进制的0，而‘\0’对应的ASCII码就是0，是一回事儿

user: user-7
content: char * gets ( char * str );  Get string from stdin Reads characters from the standard input (stdin) and stores them as a C string into str until a newline character or the end-of-file is reached.  The newline character, if found, is not copied into str. A terminating null character is automatically appended after the characters copied to str.

user: user-8
content: gets 是读取换行符的，不过它会把换行符转换为'\0' http://www.cplusplus.com/reference/cstdio/gets/?kw=gets
user-0 提问: 如何编写一个类的测试类

回复:
user: user-1
content: 测试类中去调用被测试类的各成员函数，看是否正确执行

user: user-2
content: 最简单的应该是直接从这个类派生出一个子类吧，类似这样：假设有一个类A，则它的测试类可以这么写;  class TestA: public A { public:     bool test(int argc, char *argv) {     } }

user: user-3
content: 专门测试这几个类的测试类吗？那就是直接写就行了，和在main函数里测试差别不大吧，最简单的，直接写一个static函数，把主函数里写的东西放进去就行了，不过这么做好像没啥意义啊
user-0 提问: vs2012求两个整数中的较大者

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

user: user-2
content: 引用 12 楼 Gump4231 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] [quote=引用 10 楼 Gump4231 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 【code=c】将代码放在这里【/code】 上面的【】用[ ]代替。您好，为什么我直接按F5不能像ctrl+F5那样出结果呢[/quote] 没准你设置了断点[/quote]我用重新建了一下项目  这次还是F5不行，ctrl+F5行[/quote] 在VS里，使用CTRL+A全选，再按ALT+F8（或者按CTRL+K、CTRL+F），将代码格式化，修正缩进，看起来方便些。

user: user-3
content: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> int Max(int a, int b) { 	return a > b ? a : b; }  int main(int argc, char* argv[]) { 	int a, b; 	scanf("%d%d", &a,&b); 	printf("%d", Max(a, b)); 	getchar(); 	getchar();  }

user: user-4
content: 引用 4 楼 Gump4231 的回复:发现问题了，直接ctrl+F5就能出来结果，点本地windows调试器出来的黑框里输数就没结果，这是什么原因呢。 刚开始学，太菜了，让大家见笑了。。。  是不是你输入完数据之后，黑框那个命令行窗口就消失了？  你可以在程序结束之前加一句 system("pause")，让程序暂停，这样你就可以看到黑框消失前的结果了。

user: user-5
content: 标准库中可能定义了叫max的宏，导致编译出错  所以把你max函数换一个名字

user: user-6
content: 两点： 1.输入的时候两个数字是否使用逗号分隔的（注意不能是空格） 2.最好不要叫max,换个名字

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 10 楼 Gump4231 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 【code=c】将代码放在这里【/code】 上面的【】用[ ]代替。您好，为什么我直接按F5不能像ctrl+F5那样出结果呢[/quote] 没准你设置了断点[/quote]我用重新建了一下项目  这次还是F5不行，ctrl+F5行

user: user-1
content: 引用 10 楼 Gump4231 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 【code=c】将代码放在这里【/code】 上面的【】用[ ]代替。您好，为什么我直接按F5不能像ctrl+F5那样出结果呢[/quote] 没准你设置了断点

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:【code=c】将代码放在这里【/code】 上面的【】用[ ]代替。您好，为什么我直接按F5不能像ctrl+F5那样出结果呢

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:【code=c】将代码放在这里【/code】 上面的【】用[ ]代替。 非常感谢

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:【code=c】将代码放在这里【/code】 上面的【】用[ ]代替。  #include<stdio.h>  int main(){ int max(int x,int y);

user: user-1
content: 【code=c】将代码放在这里【/code】 上面的【】用[ ]代替。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:#include <stdio.h> int mymax(int x,int y); int main() {     int a,b,c;      scanf("%d,%d",&a,&b);     c=mymax(a,b);     printf("max=%d\n",c);      return 0; } int mymax(int x,int y) {     int z;      if(x>y) z=x;     else    z=y;     return(z); } 谢谢，弱弱问一句，怎么能把代码像你这样复制。。。

user: user-0
content: 引用 楼主 Gump4231 的回复:#include<stdio.h>  int main(){ int max(int x,int y); int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("max=%d\n",c); return 0; } int max(int x,int y) { int z; if(x>y)z=x; else z=y; return(z);  }  为什么用gcc编译器能出来，用vs2012出不来结果谢谢，弱弱问一句，怎么能把代码像你这样复制。。。

user: user-0
content: 发现问题了，直接ctrl+F5就能出来结果，点本地windows调试器出来的黑框里输数就没结果，这是什么原因呢。 刚开始学，太菜了，让大家见笑了。。。

user: user-1
content: #include <stdio.h> int mymax(int x,int y); int main() {     int a,b,c;      scanf("%d,%d",&a,&b);     c=mymax(a,b);     printf("max=%d\n",c);      return 0; } int mymax(int x,int y) {     int z;      if(x>y) z=x;     else    z=y;     return(z); }
user-0 提问: vs2012下这段程序运行结果跟gcc下不同，求教什么原因

回复:
user: user-0
content: 是因为越界了，会改了

user: user-0
content: 线程 0x1178 已退出，返回值为 -1073741510 (0xc000013a)。 显示这个，是不是超出范围了

user: user-0
content: 第一个vs2012的结果在MATLAB里出的图，第二个是gcc结果在MATLAB里出的图，应该出第二个那样的，同样的程序在vs2012下怎么就运行出这样的数据了。求救啊
user-0 提问: uint32转uint8[4]-----------------------------------------------

回复:
user: user-1
content: uint8_t   aa = 9; uint32_t  bb = 0x12345678; uint32_t  cc = 0x87654321;  uint8_t   dd[2][9];  dd[0][0] = aa; memcpy(&dd[0][1], &bb, sizeof(bb)); memcpy(&dd[0][5], &cc, sizeof(cc));  int i; for(i=0;i<9;i++) printf("%d----------------%x\n", i, dd[0][i]);

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-3
content: uint8   dd[2][9];             //这里定义 dd[2] 实际只能用 dd[0] 和 dd[1]      dd[0][0]=aa;     memcpy(&dd[0][1],&bb,4);     memcpy(&dd[0][5],&cc,4);       for(i=0;i<9;i++)      printf("%d----------------%x\n",i,dd[0][i]);

user: user-0
content: 引用 1 楼 user-3 的回复:   uint8   dd[2][9];             //这里定义 dd[2] 实际只能用 dd[0] 和 dd[1]      dd[0][0]=aa;     memcpy(&dd[0][1],&bb,4);     memcpy(&dd[0][5],&cc,4);       for(i=0;i<9;i++)      printf("%d----------------%x\n",i,dd[0][i]);  汗。。。。。。尽然犯这种低级错误
user-0 提问: 数组计算元素个数问题

回复:
user: user-1
content: 直接得到的就是地址长度～长度也会根据类型不同而发生变化的。

user: user-2
content: 数组传入函数时，传入的就是数组的首地址，而地址在的大小就是4个字节。如果你要将数组传入函数，需要再传入数组的大小

user: user-3
content: template <unsigned int _SIZE> void getSize(char(&arr)[_SIZE]) {     cout << _SIZE << endl; }   int main() {     char buff[8];     getSize(buff);       return 0; }  可以像这样写

user: user-4
content: 数组作为参数传进去的话会退变为指针，所以需要再加一个数组个数参数才可以

user: user-5
content: 因为数组传参会退化为指针。 你此时如果用sizeof去算的话，32位机上恒为4 一般都是多传一个参数用以指定数组的长度。
user-0 提问: 数组

回复:
user: user-1
content: 因为自然数从0开始，C语言中unsigned类型的整数也是从0开始，而不是从1开始

user: user-2
content: 很多语言数组不是从0开始的（比如 MATLAB），但是一位计算机科学先驱 Edsger Dijkstra（发明 Dijkstra 最短路算法的那位）在 1982年写过文章，推崇从0开始做下标，叫 “为啥得从0开始数数”。  全文在这里：Why numbering should start at zero (EWD 831)

user: user-3
content: 不从零开始  到时候估计又得 抱怨为什么不从零开始

user: user-4
content: 那只是你现在的感觉…从0开始的好处有很多，楼上就讲了一大堆…以后你深入学习就能发现了…

user: user-0
content: 多谢各位大神，观摩了各位的解答，感觉有点似懂非懂了（之前是一点都不懂）。  另外：本人30岁，物流行业从业8年，曾今一人8小时内装了23吨货物。怎么可能是女的？！~~~~~~

user: user-5
content: 比如将12个连续的数b[12]看作是3×4个二维数组a[3][4]的时候 从0开始数：    b[0..11],a[0..2][0..3]    y=0..2,x=0..3    a[y][x]=b[y*4+x] 从1开始数：    b[1..12],a[1..3][1..4]    y=1..3,x=1..4    a[y][x]=b[(y-1)*4+(x-1)+1] 试比较两种办法哪种更简单直观，更不容易出错？

user: user-6
content: 个人见解：  因为 a[0] == *(a+0) 所以从0开始比较方便  否则变成了  a[1] == *(a+0)

user: user-7
content: 赵四老师又在这教育小白了。。。

user: user-5
content: 三生有幸

user: user-8
content: 引用 5 楼 zhao4zhong1 的回复:0就是道 道生一，一生二，二生三，三省万物。  。。。。精辟。。。就是这个省，，，

user: user-9
content: 代码写多了，你就会觉得从0开始挺方便的

user: user-5
content: 0就是道 道生一，一生二，二生三，三省万物。

user: user-10
content: （这个不重要 你想从1开始也可以 0可以做预留的边界防左溢出） 主要是同余的时候（编程常用技巧） x % 3 的余数集合是 0 1 2 所以你就懂了噻 取模很有用的 而有的时候（算法）里面直接递推边界不好处理，此时我们预留出0，可以直接递推而不用在里面写很多判断条件。 写多了你就懂了。 这个是语言特性orz

user: user-11
content: 习惯就好了。

user: user-12
content: 因为最小的非负数是0 所以，就采用0 开始的编法，这样的好处是 假设地址为32Bits 那么，全体无符号整数，就可以表示所有4G的内存单元了 如果，从1开始，那么最后一个单元的地址，就不在32Bits可表示范围了

user: user-13
content: 一看你就是新手，等你再多学一点儿就会发现，坑人的地方多了去了，这点儿事儿根本不值一提

user: user-14
content: 众所周知，C语言的数组是直接操作内存，那我们肯定得从内存的寻址开始说起： 以“以行为主序”的分配为例：设数组的基址为LOC(a c1 c2)，每个数组元素占据l 个地址单元，那么aij 的物理地址可用一线性寻址函数计算： LOC(aij)=LOC(a c1 c2)+( (i- c1) *( d2 - c2 + 1)+ (j- c2) )*l 推广到一般的三维数组：A[c1..d1] [c2..d2] [c3..d3]，则aijk 的物理地址为： LOC(i,j,k)=LOC(a c1 c2 c3)+( (i- c1) *( d2 - c2 + 1)* (d3- c3 + 1)+ (j- c2) *( d3- c3 + 1)+(k- c3))*l 显然，此处的c1 c2 c3 为0 会大大简化计算有木有啊！！越是多维数组效果越明显 这对于计算机寻址计算来说显然好处是大大的啊 这就是为什么最早C语言的数组起始都是0 至于什么其他的原因觉得美啊什么的都是后来人们YY的 事实上，在现在很多时候计算不再是瓶颈的时候，数组的下标也有从1开始的 比如matlab 难道matlab就不美了么= =

user: user-15
content: 引用 楼主 qq735963484 的回复:数组真是可恶，为什么第一个元素要用0编号来代替   哈哈哈哈  楼主是女生  鉴定完毕

user: user-5
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？