Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: VC6.0中的RC资源文件怎么打不开，求解

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 左侧选项栏，选择 “ResourceView” 选项

user: user-3
content: 其实是打开了 因为rc是空的啊

user: user-4
content: VC++ 2005以上版本，右击rc文件，可以选择打开方式，默认是图形化编辑方式打开的，所以你看不到资源源代码。  VC++ 6.0，貌似只能在资源浏览器中编辑。

user: user-4
content: 右击rc文件，可以选择打开方式，默认是图形化编辑方式打开的，所以你看不到资源源代码。

user: user-5
content: rc文件可以在资源视图中打开

user: user-6
content: rc文件一般不直接编辑，在资源视图中创建各种资源  右键--打开代码可查看里面内容
user-0 提问: 一个C语言常见的例题

回复:
user: user-1
content: //编写嵌套循环显示下面的输出内容： //0 //01 //012 //0123 //01234 //012345 //01234 //0123 //012 //01 //0 #include <stdio.h> #define abs(a) ((a)>=0?(a):(-(a))) int main() {     for (int i=-5;i<=5;i++) printf("%.*s\n",6-abs(i),"012345");     return 0; }
user-0 提问: 交换指针（直接赋值）与交换字符串（字符串复制函数）的区别，为什么下面1不能用字符串复制函数和2为什么两种都可以用？谢谢。

回复:
user: user-0
content: 引用 2 楼 cfjtaishan 的回复:主要是看传入函数sort内的实参是指针数组，还是二维字符数组。如果实参是字符指针数组，那么没问题，可以用直接交换指针的形式实现字符串排序，若是二维字符数组，那么就只能用交换字符串实现字符串排序；  char*str[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; 没必要这么初始化，这样一样可以实现将所有指针初始化 char*str[10]={NULL}; 初始化了一个，后面都是默认初始化位0（void *)

user: user-1
content: 主要是看传入函数sort内的实参是指针数组，还是二维字符数组。如果实参是字符指针数组，那么没问题，可以用直接交换指针的形式实现字符串排序，若是二维字符数组，那么就只能用交换字符串实现字符串排序；  char*str[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; 没必要这么初始化，这样一样可以实现将所有指针初始化 char*str[10]={NULL}; 初始化了一个，后面都是默认初始化位0（void *)

user: user-2
content: 把一个值传进一个函数，函数中修改了这个值，函数返回后值不变 同理！把一个指针传给一个函数，函数中修改了这个指针的地址，函数返回后这个指针指向的地址，不变！
user-0 提问: 有关指针和初始化的问题

回复:
user: user-1
content: t==(bintree*)malloc(sizeof(bintree));是什么？==是比较运算符

user: user-2
content: 下面一个是对的，因为它传递的是一个指针指向的值，在整个过程中指针的本身的值（地址）并没有改变。 上面一个是错的，是因为你在main函数中的地址值以形参的形式传递过去，而之后你却又重新malloc一块内存（这里地址应该是不一样的），改变了指针本身的地址，所以是错的。

user: user-3
content: void change(bintree** t) {     *t==(bintree*)malloc(sizeof(bintree));     (*t)->num=123; } 因为t是局部变量，它不能将申请到的空间和赋值的123带到main函数里。但是若用二重指针就可以了。因为使用二重指针，形参指向的是main函数里的b，对*t申请空间和对t的num元素赋值就是对main函数里的b变量申请空间（其实就是将堆上申请的空间首地址给了b）和赋值 调用时注意b前加&

user: user-4
content: 上面的代码是不行的， 因为函数是按值传递的 直接对指针操作，只能修改指针的值 要对指针进行修改，就需要使用指针的指针

user: user-5
content: 前者t==(bintree*)malloc(sizeof(bintree)); 这里==应该是=，但就算这样，也是错的，因为你函数参数是按值传递的，你函数中的参数只是外面的一个复制品，你将申请的内存赋值给它并不会影响到main中的变量t，后者是对的，因为你函数中并没有修改指针的值，而是修改指针指向的内存中的值
user-0 提问: linux下c语言字符串指针问题

回复:
user: user-1
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

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

user: user-2
content: 首先越界访问本身就会出现未定义行为。就是出现的结果是随机的，当然你可以根据结果来推断可能的执行方向，但是这个不是一定出现的。比如在我的Linux环境下执行的结果是： before, i=0	after, i=0 before, i=1	after, i=1 before, i=2	after, i=2 before, i=3	after, i=3 before, i=4	after, i=4 before, i=5	after, i=5 before, i=6	after, i=6 before, i=7	after, i=7 before, i=8	after, i=8 before, i=9	after, i=9 welcome...   因此不要做越界访问的操作

user: user-3
content: 引用 3楼faihung 的回复:首先，c的ASCII码的值为99 其次，你前面定义变量区域，发现没有dest［3］之后，就是int i了。 其实这里就是一个栈区间，根据入栈的顺序，dest［3］之后就是变量i了。 所以&dest3就是&i。因为dest数组越界，所以就会影响到i的值，i前一刻还是3，这里就会变成99了。

user: user-3
content: 首先，c的ASCII码的值为99 其次，你前面定义变量区域，发现没有dest［3］之后，就是int i了。 其实这里就是一个栈区间，根据入栈的顺序，dest［3］之后就是变量i了。 所以&dest3就是&i。

user: user-4
content: 试着输出dest[3] 和 i的地址比较 应该相同

user: user-4
content: 数组越界 将c赋给越界的位置 也就是i i=c  = 99
user-0 提问: 建立一个指针数组，存储n种颜色的单词，然后把它们按字典序排序后输出。      我怎么出现了这样子，哪里错了

回复:
user: user-0
content: -------可以了

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

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  int main() { 	int n, i, j; 	char **str, *c;    	while(scanf("%d", &n) != EOF) 	{ 		str = (char **)malloc(sizeof(char *) * n); 		if (!str) { 			fprintf(stderr, "malloc error!\n"); 			exit(0); 		} 		for(i = 0; i < n; i++) 		{ 			str[i] = (char *)malloc(sizeof(char) * 80); 			if (!str[i]) { 				fprintf(stderr, "malloc error!\n"); 				exit(0); 			} 			scanf("%s", str[i]); 		} 		for (i = 0;i < n - 1; i++) 		{ 			for (j = 0; j < n - i - 1; j++) { 				if(strcmp(str[j], str[j+1]) > 0) { 					c = str[j]; 					str[j] = str[j+1]; 					str[j+1] = c; 				} 			} 		} 		putchar(10); 		for(i=0;i<n;i++) { 			printf("%s\n", str[i]); 			free(str[i]); 		} 		free(str); 	} 	return 0; }  for(int j=0;j<n-i;j++) j < n - i会导致越界； 字符串比较应该用strcmp

user: user-3
content: j<n-i    i=0时   j最大为n-1

user: user-3
content: j+1 最大可能是n 越界了
user-0 提问: C语言中直接常量是不是表达式的一种

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:http://blog.csdn.net/astrotycoon/article/details/50857326 这个博客似乎可以回答你的问题  好的。之前在百度文库看到一篇PPT，里面讲表达式必须要有运算符。现在知道了，谢谢啦

user: user-1
content: http://blog.csdn.net/astrotycoon/article/details/50857326 这个博客似乎可以回答你的问题
user-0 提问: C语言time库time()函数源码问题

回复:
user: user-1
content: Return value  Current calendar time encoded as time_t object on success, (time_t)(-1) on error. If arg is not a null pointer, the return value is also stored in the object pointed to by arg.

user: user-1
content: (time_t) -1 表示的是出错的情况，此时这个值不作为一个时间，你可以检没函数返回值，如果为(time_t)(-1)表示函数执行失败。  http://en.cppreference.com/w/c/chrono/time

user: user-2
content: baidu一下 time_t; struct tm; time()函数 和gmtime（）函数 另外给你一段代码，比较一下p1,p2,t1,t2 是否相等，另外两次cout输出是否一样！ tm *p1,*p2; 	time_t t1,t2; 	t1= time(NULL); 	cout<<ctime(&t1)<<endl; 	t2= time(NULL); 	cout<<ctime(&t2)<<endl; 	p1 = gmtime(&t1); 	p2 = gmtime(&t2);
user-0 提问: C语言运行突然变得很慢，请问这是为什么？

回复:
user: user-1
content: 是啊 不只是你运行C++ 程序比较慢吧 比如打个游戏怎么样 任务管理器看一下CPU、内存使用情况

user: user-2
content: 能慢到这么夸张， 那应该是所有的程序运行都慢吧

user: user-3
content: 事件查看器里面看一下系统事件中有没有硬盘读写坏块相关事件。 关闭UAC、防火墙、杀毒软件 以管理员身份运行 ……

user: user-4
content: 是品牌机的正规售后吗，那应该不会换你的配件。

user: user-3
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-5
content: 告诉你一个恐怖的事，怕不是店家把你硬盘换了个旧的哦！！！哈哈。你自己换个系统再看看嘛。

user: user-6
content: 是不是因为电脑坏了影响了性能。不知道你说的电脑坏了一次，是哪方面出了问题。另外，新装的c++编译器和上次的是同一个版本吗？
user-0 提问: 有关C语言文件的操作求助

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>   int main(void) { 	FILE *in, *out; 	 	in = fopen("./stdin", "r"); 	if(in == NULL){ 		exit(-1); 	}  	out = fopen("./stdout", "a"); 	if(out == NULL){ 		exit(-1); 	}  	int ch, cnt = 0; 	while((ch = fgetc(in)) != EOF){ 		(void)fputc(ch, out);  		if(ch == '$'){ 			cnt++; 		} 	}  	(void)fclose(in); 	(void)fclose(out);  	printf("\'$\' exsit %d times\n", cnt);  	return 0; }  '$' exsit 3 times

user: user-2
content: 也学习到了！

user: user-3
content: 以文本方式读写，因为根据你题目要求，需要读入和写入的都是文本，此外，ch = getchar()并不是从文件中读取字符，而是从控件台读取，你可以使用fgetc

user: user-4
content: #include <stdio.h> #include <stdlib.h>  int main() { 	/* 	FILE *fp; 	FILE *fp2; 	fp2 = fopen("stdout","a+");  	char count=48; 	char ch; 	if((fp=fopen("stdin","wb+"))==NULL) { 		printf("can not open the file"); 		exit(0); 	} 	*/ 	int count = 0, ch;  	ch = getchar(); 	while (ch != EOF) 	{ 		fputc(ch, stdout); 		ch = getchar(); 		if(ch == '$') 			count++; 	} 	printf("%d\n", count); 	/* 	fclose(fp); 	fclose(fp2); 	*/ 	return 0; }  标准输入输出已经是打开状态，不需要再打开。 标准输入比如键盘，标准输出比如终端，显示器等。
user-0 提问: 这是一个按照数学成绩排列学生信息的程序，xcode里面运行时bad access

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

user: user-2
content: 此外student[i + 1]已经越界了，当是为N的时候，i可以为N-1，student[i + 1]则为student[N]，越界了，有效索引值只是0~N-1

user: user-2
content: for (int j = N;j > 0;j++) 这里应该是j--吧

user: user-3
content: #include<string.h> #include<iostream> //#include<vector> #include<stdio.h> #include<stdlib.h>  using namespace std;  void bubble_sort(struct students student[],int s);  struct students{ 	char a[32]; 	int math; 	int computer; };  int main() { 	int N; 	printf("Please input the number of the students:\n"); 	scanf("%d",&N); 	struct students *student; 	//struct students student[N]; 	student=(struct students*) malloc(N*sizeof(struct students)); 	for(int i=0;i<N;i++) 	{   printf("Please input the information of the %d th student",i+1); 		scanf("%s%d%d",student[i].a,&student[i].math,&student[i].computer); 		printf("\n"); 	} 	struct students temp; 	for(int j = N;j>0;j--) 		for(int i = 0;i < j-1;i++) { 			printf("i = %d\n", i); 			if(student[i].math > student[i+1].math)    //就是这句话bad access 			{ 				temp=student[i]; 				student[i]=student[i+1]; 				student[i+1]=temp; 			} 		}  	for(int i=0;i<N;i++) 	{ 		printf("%s  %d  %d",student[i].a,student[i].math,student[i].computer); 		printf("\n"); 	} 	return 0; }  参考一下吧  出现的原因是因为地址越界； for(int j=N;j>0;j++) 看一下这个循环，j是从N开始，但是j还是j++;很明显已经越界了。 另外：    for(int i=0;i<j;i++)  这个地方也越界，比如当j=N时， i < j即i < N;那么交换时i+1就会越界。
user-0 提问: 新人，请教各位~~帮我看看程序哪里错了

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

user: user-2
content: #include <stdio.h>  int s(int *a[],int n);  int main(void) { 	int a[4][3]={{1,2,3},{4,5,6},{7,8,9}}; 	int *b[12]; 	int k = 0; 	for(int i = 0; i < 4; i++) 	{ 		for(int j = 0; j < 3; j++) 		{ 			b[k] = &a[i][j]; 			k++; 		} 	}   	int sum; 	sum=s(b,12); 	printf("%d ",sum); 	return 1; } int s(int *a[],int n) { 	int i,sum = 0;  	for(i = 0; i < n; i++) { 		printf("%d\t", *a[i]); 		sum += *a[i]; 	} 	return sum; } 参考一下； 数组下表是从0开始不是从1开始。出现异常，主要是数组越界。

user: user-3
content: C语言中数组下标从0开始.....

user: user-0
content: #include <stdio.h> int s(int a[],int n); int main(void) { 	int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 	int *b[9]; 	int k=1; 	for(int i=1;i<4;i++) 	{ 		for(int j=1;j<3;j++) 		{ 			b[k]=&a[i][j]; 			k++; 		} 	}  	 	int sum; 	sum=s(*b,9); 	printf("%d ",sum); 	return 0; } int s(int a[],int n) { 	int i,sum=1; 	for(i=1;i<n;i++) 	{sum+=a[i];} 	return sum; } 改成这样，编译通过 但结果显示（段错误，核心已转储）

user: user-4
content: 你4行3列的数组怎么变成了，3行3列的。
user-0 提问: c 语言 malloc  写入数据

回复:
user: user-1
content: p[0] = "aaaaa";得到的地址其实是常字符串"aaaaa"的地址。不是你malloc出来的内存地址. 另外就是变量的作用域的问题了.  最后想说一句，楼主写代码还是要先释放下内存，再置为NULL

user: user-2
content: 引用 3 楼 qq_21193563 的回复:malloc后最好要对malloc分配的内存进行初始化，因为malloc分配得到的是一个虚拟地址，不一定会有指向的物理地址，而malloc,后然后用memset对其进行初始化后就一定会有对应的物理内存。详细自己看看系统内存管理。  这句话“malloc,后然后用memset对其进行初始化后就一定会有对应的物理内存”有歧义吧，那么这么说不用memset，就不能往malloc申请的空间里写数据，那么用malloc做啥呢？ 虚拟内存和物理内存有一个映射，这是由于MMU做的。我们看到虚拟内存（连续的内存）在物理内存上可能不是连续的，但是malloc的空间也是对应物理内存的（虚拟内存比物理内存大也是有可能的，MMU会通过其他方式换页，使用磁盘空间也好，都是有对应物理内存的）

user: user-3
content: malloc后最好要对malloc分配的内存进行初始化，因为malloc分配得到的是一个虚拟地址，不一定会有指向的物理地址，而malloc,后然后用memset对其进行初始化后就一定会有对应的物理内存。详细自己看看系统内存管理。

user: user-2
content: 从createcontent函数的两种赋值（写入）方法，没发现有什么问题，问题应该不是出在这个函数的写入操作里。建议查一下其他的函数。  另外，建议将错误信息贴出来之外，也将代码贴出来，这样定位问题会更全面一些。

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

回复:
user: user-0
content: 答案是贾可说的： 源码扩展名如果如果是 c 或 cc 时，也就是必须按 C 语言来解释。如果 extern "C" 不报错的话，那编译器就有问题。一个正常的 C 编译器都不应该支持 extern "C" 这种写法。

user: user-1
content: 同样的问题，应该就是.c文件不能这么用

user: user-0
content: 引用 16 楼 SXJIAKE 的回复:源码扩展名如果如果是 c 或 cc 时，也就是必须按 C 语言来解释。如果 extern "C" 不报错的话，那编译器就有问题。一个正常的 C 编译器都不应该支持 extern "C" 这种写法。果真如此

user: user-2
content: 如果是c语言就不需要加extern "C" 吧，应该是有些C编译器不支持extern "C" ，嗯嗯

user: user-3
content: 源码扩展名如果如果是 c 或 cc 时，也就是必须按 C 语言来解释。如果 extern "C" 不报错的话，那编译器就有问题。一个正常的 C 编译器都不应该支持 extern "C" 这种写法。

user: user-4
content: 主要是为了兼容性，当然还有其它

user: user-5
content: 如果按照C++编译/或者是C++工程，那么就用extern "C"进行导出。否则（C）不需要使用这个

user: user-6
content: _cplusplus 应该是按照c++的方式编译！

user: user-0
content: 引用 3楼勤奋的执着 的回复:你这篇帖子的推荐里的链接~  http://blog.csdn.net/y511374875/article/details/72846266 http://blog.csdn.net/u012234115/article/details/43272441我不是问这个，我是问为什么加ifdefine那一句，为什么不直接extern C

user: user-0
content: 引用 5楼paschen 的回复:C语言里没有 extern "C" { 这种用法嗯，不过我在gcc下也编得过去。可能这样写是因为某些编译器编不过吧

user: user-7
content: C语言里没有 extern "C" { 这种用法

user: user-7
content: http://en.cppreference.com/w/cpp/language/language_linkage

user: user-8
content: 引用 2 楼 bandaoyu 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] https://www.cnblogs.com/stonecrazyking/archive/2006/09/23/512552.html http://www.cppblog.com/ownwaterloo/archive/2009/04/20/predefined_macro___cplusplus.html  答非所问[/quote] 那好吧，请其他人来回答你的所问。

user: user-9
content: 你这篇帖子的推荐里的链接~  http://blog.csdn.net/y511374875/article/details/72846266 http://blog.csdn.net/u012234115/article/details/43272441

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:https://www.cnblogs.com/stonecrazyking/archive/2006/09/23/512552.html http://www.cppblog.com/ownwaterloo/archive/2009/04/20/predefined_macro___cplusplus.html  答非所问

user: user-8
content: https://www.cnblogs.com/stonecrazyking/archive/2006/09/23/512552.html http://www.cppblog.com/ownwaterloo/archive/2009/04/20/predefined_macro___cplusplus.html

user: user-0
content: 引用 13楼自信男孩 的回复:[quote=引用 8 楼 bandaoyu 的回复:] [quote=引用 3楼勤奋的执着 的回复:]你这篇帖子的推荐里的链接~  http://blog.csdn.net/y511374875/article/details/72846266 http://blog.csdn.net/u012234115/article/details/43272441我不是问这个，我是问为什么加ifdefine那一句，为什么不直接extern C[/quote] 别人给你推荐的链接为啥不看呢，链接里除了回答你的问题之外，还有其他知识。非要针对你的问题，来一个专场博客你才喜欢呢。 两个问题：一个问题是如何去寻找答案（路径），一个是如何在在大量信息中找出自己需要的答案。这个都需要自己亲力亲为的去做，而不是坐享其成[/quote]嗯，你的其中的一篇文章才有说明，但我要的就只是那一句话而已，其他整篇内容都是多余的，我又不是不知道为什用extern C。另外一篇对我来说通票废话。为了一句话让我看2篇文章，简直不能忍。  另外我在gcc下 直接extern C 通过了……这才是导致我问这个问题的原因

user: user-8
content: 引用 8 楼 bandaoyu 的回复:[quote=引用 3楼勤奋的执着 的回复:]你这篇帖子的推荐里的链接~  http://blog.csdn.net/y511374875/article/details/72846266 http://blog.csdn.net/u012234115/article/details/43272441我不是问这个，我是问为什么加ifdefine那一句，为什么不直接extern C[/quote] 别人给你推荐的链接为啥不看呢，链接里除了回答你的问题之外，还有其他知识。非要针对你的问题，来一个专场博客你才喜欢呢。 两个问题：一个问题是如何去寻找答案（路径），一个是如何在在大量信息中找出自己需要的答案。这个都需要自己亲力亲为的去做，而不是坐享其成

user: user-10
content: 如果你用 C 编译器来编译， extern "C" 是错误的语法。 她只能使用 extern 。

user: user-11
content: 应该是有些C编译器不认识extern “C”
user-0 提问: c/c++ 编程求教

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

user: user-2
content: 引用 2 楼 user-3 的回复:因为你的b是float类型，float的有效位数（不是小数位数）只有7~8位，你用double就正常了一语惊醒梦中人...

user: user-3
content: 因为你的b是float类型，float的有效位数（不是小数位数）只有7~8位，你用double就正常了

user: user-2
content: 楼主说的是小数点第3位吧，为什么.789变成.781。我也很好奇，下面一个就是正确的，b的精度是浮点型的。
user-0 提问: 关于进程同步。。

回复:
user: user-0
content: 引用 1 楼 paschen 的回复:比如使用事件,CreateEvent  我的前提是这两个进程都会维护同一个数据结构，也就是说如果进程A在干别的事情时，进程B会往这个数据结构里添加节点，当进程A再次操作该数据结构时，他能感知到进程B往这个数据结构上添加到节点。

user: user-1
content: 《Windows核心编程》 《Unix编程艺术》

user: user-2
content: 可以考虑一下信号量，若是两个进程间同步，可以用互斥信号量，其实和锁机制类似的，适用于进程间同步和线程间同步； 若是多进程间通信，可以考虑PV操作  https://www.cnblogs.com/bizhu/archive/2012/05/17/2506285.html

user: user-3
content: 引用 2 楼 JerKii的回复:[quote=引用 1 楼 paschen 的回复:] 比如使用事件,CreateEvent  我的前提是这两个进程都会维护同一个数据结构，也就是说如果进程A在干别的事情时，进程B会往这个数据结构里添加节点，当进程A再次操作该数据结构时，他能感知到进程B往这个数据结构上添加到节点。[/quote] 共享内存那就只有使用内存映射机制，可配合其他同步方法如事件、信号量等

user: user-4
content: 加锁同步，信号量 等

user: user-5
content: 用共享锁控制，只有获得共享锁的句柄才能使用共同的资源

user: user-3
content: 比如使用事件,CreateEvent
user-0 提问: spintf格式化double类型怎样保证小数精度准确？

回复:
user: user-1
content: 你自己应该知道自己需要多少位精度，在满足需要的情况下尽可能少输出 比如你举的第一个例子，实际上输出小数点后14位应该就不错了 普通应用很少有需要这么多小数位的精度要求

user: user-2
content: sprintf_s(buf, "%.2f", d);

user: user-3
content: double类型的数据应该用%lf输出。  精度本身就是有有效值的。

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

user: user-5
content: 1、很多十进制浮点数在二进制本身就没法精确表示，要精确表示可用BCD等方式存储，所以浮点数本身就是会存在精度误差的  2、如果不加%.n控件符的话默认就只有那么多位，你可以通过%.n设置你希望的值

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:%.15g

user: user-4
content: %.15g
user-0 提问: 结构体被强制转换问题？？？求解  谢谢！！！！！！

回复:
user: user-1
content: 引用 1 楼 cfjtaishan 的回复:不一定需要一样。  efg_t* BBB= (efg_t*)( (char*)AAA+ 2 ); 这个操作是AAA指向的内存向后偏移2个字节，然后把地址赋值给指针BBB;为什么是偏移2个字节呢，因为AAA在偏移前做了强制类型转换char *，否则偏移的长度就不是2了，而是sizeof(abc_t) * 2个字节了。  另外赋值的是内存首地址，因为不论是abc_t类型的指针，还是efg_t的指针，都是存放的地址值，因此不能说BBB编程AAA，而是AAA偏移2个字节的地址赋值给了BBB，这样BBB就可以按照efg_t类型去访问这块地址。若AAA指向的的空间小于BBB的空间，在使用BBB访问结构体成员时会导致越界。因此，需要AAA指向有效内存空间需要比BBB的结构体类型长度要大，至少大于等于sizeof(abc_t) - 2分析的很全面，学习了。

user: user-2
content: 不一定需要一样。  efg_t* BBB= (efg_t*)( (char*)AAA+ 2 ); 这个操作是AAA指向的内存向后偏移2个字节，然后把地址赋值给指针BBB;为什么是偏移2个字节呢，因为AAA在偏移前做了强制类型转换char *，否则偏移的长度就不是2了，而是sizeof(abc_t) * 2个字节了。  另外赋值的是内存首地址，因为不论是abc_t类型的指针，还是efg_t的指针，都是存放的地址值，因此不能说BBB编程AAA，而是AAA偏移2个字节的地址赋值给了BBB，这样BBB就可以按照efg_t类型去访问这块地址。若AAA指向的的空间小于BBB的空间，在使用BBB访问结构体成员时会导致越界。因此，需要AAA指向有效内存空间需要比BBB的结构体类型长度要大，至少大于等于sizeof(abc_t) - 2

user: user-0
content: 非常感谢层主，但是还有点小疑问，应该是至少大于等于sizeof(efg_t) + 2吧？？？ 因为最终转换是要转换为efg_t类型，因此应该是要满足sizeof（abc_t）>=（efg_t）+2 ， +2是因为考虑到AAA偏移了两个字节。

user: user-3
content: AAA给地址到BBB，不是表示BBB变成了AAA，而是按BBB的方式去解释AAA内存中的值，对于你的例子，(char*)AAA+ 2是AAA地址后面2个字节的位置，这个位置强制转换成了BBB结构体指针，这个地址可以是任意数据，但通常情况下应该刚好是个BBB类型的成员

user: user-4
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
user-0 提问: 对C语言sqrt函数的一些的疑问

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

user: user-2
content: 浮点数的比较是否相等是两个浮点数相减得到的差值的绝对值小于1e-6即表示两个浮点数相等；

user: user-3
content: 浮点数的计算是有精度误差的，不要直接比较两数是否相等，应该比较两数的差的绝对值是否足够小，如小于1e-6
user-0 提问: 请教各位大佬，如何用C实现RSA公钥加密和解密，不调用库纯实现

回复:
user: user-1
content: 贴主实现了吗？我也需要用纯C实现RSA的解密，在单片机上实现大数据的解密

user: user-2
content: 如果限于windows，可以用CryptoAPI，这里有现成的例子：https://blogs.msdn.microsoft.com/alejacma/2008/01/28/how-to-generate-key-pairs-encrypt-and-decrypt-data-with-cryptoapi/

user: user-3
content: RSA的实现是最简单的了，不要想着从openssl那里抄，它那个很全面的，导致代码很复杂。

user: user-3
content: p,q为素数，保密 long KEY1 = pq（公开），KEY1为公钥1 long oula = (p-1) * (q-1) 保密 随机选KEY2，令满足 gcd(KEY2, oula ) = 1,  KEY2为公钥2，  gcd最大公约数，网上有算法  计算KEY3，满足(KEY2*KEY3% oula  == 1), 则KEY3为私钥  加密过程 unsigned char msg; unsigned char  cipher =  pow（msg, KEY2）% KEY1 ;   pow库函数，是次方  解密 unsigned char msg2 = pow(cipher, KEY3) % KEY1

user: user-4
content: 之前做项目时想自己实现一下RSA加密算法，但是在大数运算上遇到了很多问题，最后还是了解原理之后老老实实用openssl了，自己实现太麻烦了

user: user-5
content: 大数运算开源代码这个世界上目前至少有100个版本，我猜。

user: user-6
content: 也就写个 大数运算库， 没啥麻烦的， 就是简单写的跑的有点慢， 网上很多的，  随便找一个，  不需要动态内存分配的也很好找,   我写了个跑 secp256k1 还行， 跑 RSA 解密/签名就慢的没边了... 你那CPU是 ARM 的吧， ARM 的移植 gmp 好， 这个跑的快 ...

user: user-7
content: 引用 9 楼 zhao4zhong1 的回复:大数运算开源代码这个世界上目前至少有100个版本，我猜。 我猜101种至少~

user: user-0
content: 引用 6 楼 cfjtaishan 的回复:能找到RSA源码吗？如果能找到是不是就可以破译了呢？  OpenSSL是用源码，官方的库文件中源码中仍然有封装的接口函数，并且OpenSSL太大，破解起来难度更高

user: user-8
content: 能找到RSA源码吗？如果能找到是不是就可以破译了呢？

user: user-2
content: 把OpenSSL中的代码抄出来...

user: user-0
content: 各位大佬我需要不调用库（OpenSSL），纯C自己实现，谢谢

user: user-2
content: https://github.com/openssl/openssl https://stackoverflow.com/questions/21980495/generate-rsa-1024-key-pair-using-openssl

user: user-0
content: 百度能找到的都是一些简单的rsa加密实现，秘钥很小，并且没有pkcs填充算法，java那边是用1028生成的秘钥，百度和google我都找了，百度根本没有，Google相关的回复也很少

user: user-5
content: 百度搜相关关键字。
user-0 提问: C语言数组赋值问题

回复:
user: user-1
content: 引用 4 楼 weixin_37847078 的回复:push_data函数改成了这样，结果正确  //queue[capacity] = data; queue[capacity] = malloc( strlen( data ) + 1 ); strcpy( queue[capacity], data );  这样是可以的。 建议再判断一下malloc的返回值

user: user-0
content: push_data函数改成了这样，结果正确  //queue[capacity] = data; queue[capacity] = malloc( strlen( data ) + 1 ); strcpy( queue[capacity], data );

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:queue是不存放数据的，而是存储tmp的地址，这个是需要理解和注意的  了解了，不过我怎么在每次循环时都开辟新的空间呢？能不能帮我写个demo，多谢！

user: user-1
content: 这是正常的，因为queue是指针数组，并且每个指针都是指向data，即tmp字符数组的。每次调用push_data都会修改tmp的内容，所以每个指针都指向tmp，得到的都是最新的tmp修改之后的字符串；

user: user-1
content: queue是不存放数据的，而是存储tmp的地址，这个是需要理解和注意的
user-0 提问: 编写的学生宿舍管理系统中关于按学号从小到大排序这一部分怎么样也实现不了，愁死我了

回复:
user: user-1
content: 引用 3 楼 qq_41641007 的回复:那这个语法错误怎么改呀？ 我的结构体是这样定义的 struct STU { 	char num[STU_NUM];//学号 	char bj[CLASS_NUM];//班级 	char name[STU_NUM];//姓名 	char build_number[DOR_NUM];//楼号 	char dor_number[DOR_NUM];//寝室号 	char bed_number[DOR_NUM*4];//床位号 	char sex[3];//性别 	char beizhu[STU_NUM];//备注 }student[1000],datachance;  我以为char型会方便一点，是不是不可以全部用它来定义呢？ 可是学号万一在十位数以上，然后其他的有中文和数字混合的情况…… 你如果把num定义成char类型数组，那么比较就不能用compare参数类型了，需要用strcmp了。 都定义成char类型没问题，但是比较，赋值等等操作都需要按照字符串的格式来。  建议定义成int类型比较起来更简单。

user: user-0
content: 那这个语法错误怎么改呀？ 我的结构体是这样定义的 struct STU { 	char num[STU_NUM];//学号 	char bj[CLASS_NUM];//班级 	char name[STU_NUM];//姓名 	char build_number[DOR_NUM];//楼号 	char dor_number[DOR_NUM];//寝室号 	char bed_number[DOR_NUM*4];//床位号 	char sex[3];//性别 	char beizhu[STU_NUM];//备注 }student[1000],datachance;  我以为char型会方便一点，是不是不可以全部用它来定义呢？ 可是学号万一在十位数以上，然后其他的有中文和数字混合的情况……

user: user-1
content: int (*compare)(float a,float b); void assortbynum()//交换两个字符数组 {     int i,j,k,t;     for(i=0;i<N-1;i++)     {         k=i;         for(j=i+1;j<N;j++) {             if((*compare)(student[j].num,student[k].num))                 k=j;         }         if(k!=i) {             tmp = student[k];             student[k] = student[i];             student[i] = tmp;              /*             swapchar(&student[k].name,&student[i].name);//交换姓名             swapchar(&student[k].num,&student[i].num);             swapchar(&student[k].bj,&student[i].bj);             swapchar(&student[k].build_number,&student[i].build_number);             swapchar(&student[k].dor_number,&student[i].dor_number);             swapchar(&student[k].bed_number,&student[i].bed_number);             swapchar(&student[k].sex,&student[i].sex);             swapchar(&student[k].beizhu,&student[i].beizhu);             */         }     } } 结构体交换，其实可以直接对结构体变量进行赋值的。另外，不知道你的结构体定义，所以tmp没有定义类型，建议你自己加上；  用自己的定义的函数来赋值也是可以的，但是使用strcpy是不可以的。strcpy是字符串拷贝函数，那么它的适用对象就是字符串，所以对于非字符串是不能使用的，可能会导致越界和程序崩溃；建议还是直接用结构体对象赋值即可。 另外，你的排序中比较函数使用的不对，应该以参数的形式传进函数指针，应该这样：  void assortbynum(int (*compare)(float a,float b))

user: user-2
content: 实在不行，你在网上搜冒泡排序也可以的。
user-0 提问: 多线程下一个线程等待其他多个线程处理完成的问题

回复:
user: user-1
content: 引用 2 楼 cfjtaishan 的回复:用信号量吧，pthread_cond_signal, pthread_cond_wait，为什么不等线程组B都执行完（做一个计数器，B线程组里有多少个线程，计数器就到了线程数就发信号pthread_cond_signal)再发信号呢。 就是把B线程组作为一个整体，等B线程组都执行完，执行完一个计数器加1，等执行完再向A发信号。

user: user-1
content: 用信号量吧，pthread_cond_signal, pthread_cond_wait，为什么不等线程组B都执行完（做一个计数器，B线程组里有多少个线程，计数器就到了线程数就发信号pthread_cond_signal)再发信号呢。

user: user-2
content: 《Windows核心编程》
user-0 提问: 两个float型相除 结果与预期不符 求大神解答

回复:
user: user-1
content: 引用 4楼paschen 的回复:printf("%f\n", a[0][3]);  这里的3已经越界了，有效的索引只是0、1、2赞同

user: user-2
content: printf("%f\n", a[0][3]);  这里的3已经越界了，有效的索引只是0、1、2

user: user-3
content: a[i][2]被除数没有从终端接收到数据，输入的是a[i][0], a[i][1]；另外，a[0][3];也不是相除之后的数据。 #include <stdio.h>  int main(void)  {  	float a[20][3]; 	int i,n; 	scanf("%d", &n); 	for (i = 0; i < n; i++) 	{ 		scanf("%f%f", &a[i][0], &a[i][1]); 		a[i][2] = (float)((a[i][0]) / (a[i][1])); 		printf("%f\n", a[0][2]); 	} 	return 0; } 参考一下吧

user: user-4
content: a[i][2] = (float)((a[i][1]) / (a[i][0]));         printf("%f\n", a[0][2]); 下标用乱了导致的

user: user-0
content: 求助嘤嘤嘤.......
user-0 提问: 宏定义使用请教，宏定义可以改值么

回复:
user: user-1
content: 是的 宏定义在函数内定义的话，只在函数内生效是不对的  宏定义根本并不知道函数，从定义的位置开始到本编译单元结束都可以使用

user: user-2
content: #undef 之前使用 #ifdef 来判断是否定义了，如果是，那么 #undef 她。 #宏仅仅是编译前做词法分析的时候有效，然后就无效了。等不到运行时。

user: user-3
content: 引用 9 楼 sys0613 的回复:引用 8 楼 paschen 的回复:2、可以再次改变MMMM的值，但这都是静态的（在编译前），而不是动态的（运行时调用函数时）收到，多谢，那也就是说，我想根据func1的入参的值来决定MMMM值，这个想法行不通吧？不可能等到调用函数以后，再定义MMMM的值是这个意思吧？还有一个问题，刚才有小伙伴说#define  在函数内定义的话，只在函数内生效？如果只是我的func2函数，没有函数func1，那么函数func2里面#define的宏定义，在函数外还可见么？还能用么？谢谢  1、是的  2、”#define  在函数内定义的话，只在函数内生效“ 这句是错的！  #define根本并不知道函数，从定义的位置开始到本编译单元结束都可以使用

user: user-0
content: 引用 8 楼 paschen 的回复:2、可以再次改变MMMM的值，但这都是静态的（在编译前），而不是动态的（运行时调用函数时） 收到，多谢，那也就是说，我想根据func1的入参的值来决定MMMM值，这个想法行不通吧？不可能等到调用函数以后，再定义MMMM的值是这个意思吧？ 还有一个问题，刚才有小伙伴说#define  在函数内定义的话，只在函数内生效？如果只是我的func2函数，没有函数func1，那么函数func2里面#define的宏定义，在函数外还可见么？还能用么？谢谢

user: user-0
content: 引用 10 楼 paschen 的回复:引用 9 楼 sys0613 的回复:[quote=引用 8 楼 paschen 的回复:]2、可以再次改变MMMM的值，但这都是静态的（在编译前），而不是动态的（运行时调用函数时）收到，多谢，那也就是说，我想根据func1的入参的值来决定MMMM值，这个想法行不通吧？不可能等到调用函数以后，再定义MMMM的值是这个意思吧？还有一个问题，刚才有小伙伴说#define  在函数内定义的话，只在函数内生效？如果只是我的func2函数，没有函数func1，那么函数func2里面#define的宏定义，在函数外还可见么？还能用么？谢谢  1、是的  2、”#define  在函数内定义的话，只在函数内生效“ 这句是错的！  #define根本并不知道函数，从定义的位置开始到本编译单元结束都可以使用[/quote]  简单易懂，多谢

user: user-3
content: 2、可以再次改变MMMM的值，但这都是静态的（在编译前），而不是动态的（运行时调用函数时）

user: user-3
content: 2、宏是在编译前静态替换的，定义在函数内并不表示执行这个函数才修改，而是从定义位置开始往下都按宏定义进行替换。如果人你要在函数中改变就要用变量，而不是宏

user: user-3
content: 1、可以没有，但如果已经定义过，编译器会给出一个警告，所以建议保留

user: user-4
content: https://baike.baidu.com/item/%23undef/7727332?fr=aladdin

user: user-4
content: 你的宏定义不是变量，它是立即数，也是常量，不占用内存。因此没有释放和不释放之说。 宏定义可以定义在函数内，甚至是结构体内定义宏定义也可以，也可以定义在头文件里，源文件里的任何位置，定义的位置只会影响其作用域。  #undef是取消宏定义的指令，即一个宏定义已经定义，可以通过#undef取消定义，即取消它的作用，不能称为释放。这样可以重新定义，实现修改初始定义的大小；

user: user-5
content: 引用 1 楼 jianwen0529 的回复:1）要用，除非你的两个宏定义一模一样，否则会报重定义 2）可以的，在哪个地方定义都一样，属于全局性的东西。而且又#ifndef MMMM进行判断，那么也不会造成重定义的错误 1）中的前提是你同时也包好了b.h头文件，没使用到是否会报重定义你可以测试下

user: user-5
content: 1）要用，除非你的两个宏定义一模一样，否则会报重定义 2）可以的，在哪个地方定义都一样，属于全局性的东西。而且又#ifndef MMMM进行判断，那么也不会造成重定义的错误
user-0 提问: OSE架构下使用ipcom-sendto函数从DSP向PC段发数据包，循环多次后程序停止运行

回复:
user: user-1
content: 建议提出对应的代码，这样分析是不是程序逻辑的问题

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

user: user-3
content: 一般都是内存問題啦，從循環多次后崩潰來看，是不是數組越界？
user-0 提问: 返回函数指针

回复:
user: user-1
content: 你的确需要这么写一个静态的函数。 如果确实需要像lambda 那样的话，最好添加一个 void * 这样的参数。 这个参数就像回调函数的用户参数一样，也像 C++ 的 this 一样。 这样你可以在呼叫函数之前，定义一个结构，在结构里面设置 left operator right 这三个参数。 然后根据这参数参数去调用指定的函数，这用户指针就是这个结构的地址。

user: user-0
content: 引用 12 楼 TDTO_O 的回复:可以将函数作为函数参数传入呀，然后再外面定义你需要用到的函数。楼主写的没问题呀，只要你那个what的函数指针指向的函数在外面实现了的话还是能用的。 我想做的是,编写函数  Test and( Test t1, Test t2)

user: user-2
content: 可以将函数作为函数参数传入呀，然后再外面定义你需要用到的函数。楼主写的没问题呀，只要你那个what的函数指针指向的函数在外面实现了的话还是能用的。

user: user-3
content: 不能嵌套函数（在函数中定义函数），你可以将指向不同的函数（如and,or...）指针作为参数传递给另一个函数，然后在该函数中使用函数指针调用相应的函数

user: user-4
content: 嵌套函数是语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。

user: user-5
content: 引用 3 楼 user-7 的回复:引用 2楼user-7 的回复:不能以那样搞，因为函数分配在栈空间里，函数调用完了，就会释放掉。也就是说返回函数的指针没有任何意义，除非你给这个指针加上static 函数指针指向的是函数的首地址（执行函数的开始位置），返回了函数指针为什么就没有意义了呢？使用函数指针就是对相应函数的重新调用，怎么会出现没有意义了呢？

user: user-5
content: 嵌套函数，如果是定义肯定是不行的。 如果想实现不同的条件下调用对应的函数，可以做成函数指针数组，即有函数指针组成的数组。

user: user-6
content: 可以，百度 stl::sort

user: user-7
content: 不能以那样搞，因为函数分配在栈空间里，函数调用完了，就会释放掉。

user: user-7
content: 引用 2楼user-7 的回复:不能以那样搞，因为函数分配在栈空间里，函数调用完了，就会释放掉。也就是说返回函数的指针没有任何意义，除非你给这个指针加上static

user: user-4
content: 想写嵌套函数请使用javascript，嵌套死你！

user: user-0
content: 我想做的是,编写函数  Test and( Test t1, Test t2)

user: user-0
content: _Bool f1(int  n){ }  //代码略 n为3的倍数 _Bool f2(int  n){ } //n含5 _Bool f3(int  n){ } 打印满足f1 or f2 and f3，我有一个笨办法：  _Bool test(int  n){  return f1(n) || f2(n) && f3(n)  } 然后用test为solve2的实参

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:嵌套函数是语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。  还活在这里啊。
user-0 提问: 新人求助

回复:
user: user-1
content: CPU 和编译器 有关

user: user-2
content: 出现两个结果很正常，因为 你写的这行代码：a*=a/=a+=a++; 不同的编译器编译处理的计算顺序不一样， 一般实际编程中 都要写出稳定的代码   比如楼主的这个代码 换个编译器 就结果不一样了

user: user-3
content: 在c语言中并没有规定计算的顺序规则，这个计算的顺序是要靠编译器来定的，所以你这里采用了不同的编译器， 这个式子的计算结果就不一样了。

user: user-0
content: 老师说叫我把这两个的区别搞清楚的

user: user-4
content: 答案是1。。。。

user: user-5
content: 你赋值那行没有意义啊，你是想实现什么？

user: user-6
content: 浮点数格式 http://bbs.csdn.net/topics/390676437 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-7
content: a是浮点数，然后计算a++,为什么？

user: user-8
content: 我很疑惑为什么说自己是新人，怎么纠结这些表达式做什么？学习编程，我想是不是应该向代码更简洁，更稳定，效率更高方面的努力。写一些自己都弄不明白，然后还让自己自信心受挫的代码做什么？  代码的可读性还是很重要的，与其写一些复杂的，并且自己都看不懂的代码，不如多去研究和巩固基础编程知识，多练习编程能力。  个人建议，不要纠结这些复杂表达式，如果自己不懂，那么写一些自己能看懂，让别人也能看懂的codes。另外，在项目中也很少会遇到这样的代码，至少我是不回去写这样的代码。因为自己看了就会有点疑惑。  另外，建议楼主使用目前流行的编译和编辑器，楼主用的环境已经比较老了，应该跟上时代才好。
user-0 提问: 新手求问！QT里面生成的txt图像数据怎么才能在label中显示成图片形式

回复:
user: user-1
content: 引用 8 楼 u010165006 的回复:Qt不太了解，如果用C++ Builder很简单，逐个像素赋值就是了： http://blog.163.com/tab_98/blog/static/11924097201711395726948/  仅供参考： http://blog.163.com/tab_98/blog/static/11924097201772333237782/

user: user-2
content: 引用 10 楼 qq_38635841 的回复:[quote=引用 9 楼 h595636059 的回复:] 二进制流？数据 数据是图像的每个点的像素值，二进制流什么的我不太懂[/quote]  http://tracey2076.blog.51cto.com/1623739/539690这个应该有帮助

user: user-0
content: 引用 9 楼 h595636059 的回复:二进制流？数据 数据是图像的每个点的像素值，二进制流什么的我不太懂

user: user-2
content: 二进制流？数据

user: user-1
content: 图像数据形式，是什么形式？

user: user-0
content: 引用 2 楼 u010165006 的回复:图像数据是点就画点，是线就画线，诸如此类。 能在说的具体点吗？谢谢！ 新手上路查了很多资料也不太明白

user: user-3
content: 百度搜相关关键字。

user: user-1
content: Qt不太了解，如果用C++ Builder很简单，逐个像素赋值就是了： http://blog.163.com/tab_98/blog/static/11924097201711395726948/

user: user-0
content: 引用 5 楼 u010165006 的回复:图像数据形式，是什么形式？  应该是图像的像素灰度值

user: user-4
content: 那你要看你数据文件的格式是怎么规定的。 就比如给出 1 2 3，没有一个约定，怎么知道第一位第二位第三位数字代表的含义  读取文件，分析出这些含义。然后用绘制点线面填充等等方式把图像描绘出来

user: user-1
content: 图像数据是点就画点，是线就画线，诸如此类。

user: user-0
content: 求大神来指点啊啊啊啊`~
user-0 提问: 帮忙看下我对对c语言编译和链接的一点认知是否正确

回复:
user: user-1
content: 为什么不参考Tiny C Compiler源代码呢？

user: user-2
content: 运行之前会编译生成一个可执行文件。这个文件已经不是之前的.o文件里。所以，运行时不是去.o文件里去找函数定义。因为.o文件还是磁盘上的，而程序运行必须在内存里，因此运行是将可执行文件加载到内存，将main需要调用到的函数也一并加载到内存。 可执行文件就是所有.o文件的一个合计，另外还包括一些库函数，当然库函数不是以函数定义的形式存放在可执行文件里，而是以动态库的形式加载到内存。

user: user-3
content: 严格来说并不准确，不过开始这么理解可以。

user: user-4
content: http://blog.csdn.net/shenjianxz/article/details/52130111  推荐：《程序员的自我修养——链接、装载与库》

user: user-4
content: 简单的说就是，在编译的时候，有些符号只有声明没有实现，编译器会记录为外部符号，链接器负责替换这些外部符号为实际地址，如果所有目标文件中找不到这些符号，则会报链接错误
user-0 提问: 怎么将结构转换成char数组？

回复:
user: user-0

user: user-1
content: 引用 8 楼 xzjxucxx 的回复:[quote=引用 7 楼 cfjtaishan 的回复:] [quote=引用 6 楼 xzjxucxx 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:]  struct tmp{      long b;      char aa[2];     short c; } t; 将结构体设定对其，要么手动改成这样，要么就是强制设置结构体的对其方式，比如2字节对齐。如下：  struct tmp{     char aa[2];     long b;     short c; }__attribute__ ((packed)); __attribute__ ((packed))得变量或者结构体成员使用最小的对齐方式，即对变量是一字节对齐，对域（field）是位对齐。  在一个C文件里能有的结构体1字节对齐，有的结构体4字节对齐吗？[/quote] 可以，__attribute__ ((packed))就是设定结构体对其方式的。若不加则按照默认对齐格式对齐[/quote]  可是我加了，总是说我语法错！[/quote] 我的是Linux下的结构体对齐设置，你是在Linux下编写的还是在Windows下的。Windows下和Linux下不一样

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 xzjxucxx 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:]  struct tmp{      long b;      char aa[2];     short c; } t; 将结构体设定对其，要么手动改成这样，要么就是强制设置结构体的对其方式，比如2字节对齐。如下：  struct tmp{     char aa[2];     long b;     short c; }__attribute__ ((packed)); __attribute__ ((packed))得变量或者结构体成员使用最小的对齐方式，即对变量是一字节对齐，对域（field）是位对齐。  在一个C文件里能有的结构体1字节对齐，有的结构体4字节对齐吗？[/quote] 可以，__attribute__ ((packed))就是设定结构体对其方式的。若不加则按照默认对齐格式对齐[/quote]  可是我加了，总是说我语法错！

user: user-1
content: 引用 6 楼 xzjxucxx 的回复:[quote=引用 4 楼 cfjtaishan 的回复:]  struct tmp{      long b;      char aa[2];     short c; } t; 将结构体设定对其，要么手动改成这样，要么就是强制设置结构体的对其方式，比如2字节对齐。如下：  struct tmp{     char aa[2];     long b;     short c; }__attribute__ ((packed)); __attribute__ ((packed))得变量或者结构体成员使用最小的对齐方式，即对变量是一字节对齐，对域（field）是位对齐。  在一个C文件里能有的结构体1字节对齐，有的结构体4字节对齐吗？[/quote] 可以，__attribute__ ((packed))就是设定结构体对其方式的。若不加则按照默认对齐格式对齐

user: user-0
content: 引用 4 楼 cfjtaishan 的回复: struct tmp{      long b;      char aa[2];     short c; } t; 将结构体设定对其，要么手动改成这样，要么就是强制设置结构体的对其方式，比如2字节对齐。如下：  struct tmp{     char aa[2];     long b;     short c; }__attribute__ ((packed)); __attribute__ ((packed))得变量或者结构体成员使用最小的对齐方式，即对变量是一字节对齐，对域（field）是位对齐。  在一个C文件里能有的结构体1字节对齐，有的结构体4字节对齐吗？

user: user-1
content: Windows下： https://www.cnblogs.com/luxiaoxun/archive/2012/11/09/2762438.html Linux下： http://blog.csdn.net/lanzhihui_10086/article/details/44353381

user: user-1
content: struct tmp{      long b;      char aa[2];     short c; } t; 将结构体设定对其，要么手动改成这样，要么就是强制设置结构体的对其方式，比如2字节对齐。如下：  struct tmp{     char aa[2];     long b;     short c; }__attribute__ ((packed)); __attribute__ ((packed))得变量或者结构体成员使用最小的对齐方式，即对变量是一字节对齐，对域（field）是位对齐。

user: user-2
content: long32位 2就是00000002

user: user-3
content: 比如VS下设置对齐值为1：   #pragma pack(1) struct tmp { 	char aa[2]; 	long b; 	short c; } t;

user: user-3
content: 因为结构体对齐原因，实际的b并不是紧接着aa的，如果要连在一起，可以设置结构体对齐值
user-0 提问: k&R书里的外部变量和作用域问题，编译不了bug很多

回复:
user: user-1
content: #include <stdio.h>  #define MAXLINE 1000 /*允许的输入行的最大长度 */  int max; /*到目前为止发现的最长行的长度 */ char line[MAXLINE]; /*当前输入行 */ char longest[MAXLINE]; /*用以保存最长的行 */ int my_getline(void); void copy(void);  /*用以保存最长行，特别版本 */   int main() { 	int len; 	extern int max; 	extern char longest[]; 	max = 0; 	while((len = my_getline()) > 0){ 		if(len > max){ 			max = len; 			copy(); 		} 	} 	if(max > 0) /*存在这样的行 */ 		printf("%s\n",longest); 	return 0; } /*getline 函数：特别版本 */ int my_getline(void) { 	int c, i; 	extern char line[]; 	for(i = 0; i < MAXLINE-1 && (c = getchar()) !=EOF && c != '\n';++i) 		line[i] = c; 	if(c == '\n'){ 		line[i] = c; 		++i; 	} 	line[i] = '\0';  	return i; }  /*copy 函数：特别版本*/ void copy(void)  { 	int i; 	//extern char line[],longest[]; 	i = 0; 	while((longest[i] = line[i]) != '\0') 		++i; } 参考一下吧  两个问题： 第一个getline和库函数同名，因此编译时会提示错误； 第二个copy函数内，两个全局变量没必要再extern了因为copy和全局变量在同一个源文件里，全局变量的作用域能够覆盖到copy函数。但是个人建议，还是使用传参比较安全。
user-0 提问: 求问，一个将整数插入已排好序的数组中的问题

回复:
user: user-1
content: 越界只是小问题。 你试着把200插入那个数组，就该清楚错在哪里了

user: user-2
content: 这是一个插入排序，但是该排序方法可移植性差，针对你的这个需求（插入一个数据，插入两个数据就会导致数组越界）；逻辑是和插入排序的方法是相同的。 第一步找到插入的位置： for(j=6;j>=0;j--) 	{ 		if (x < y[j]) 			break; 		else 			y[j+1]=y[j]; 	} 这个循环就是要插入的位置。当x < y[j]时就是找到了要插入的位置。其他情况时，数据整体向后移动，即y[j+1] = y[j]; 而这一步就是将x插入到对应的位置： if (x>y[j]) 		y[j]=x; 	else 		y[j+1]=x;

user: user-1
content: 你这个程序有问题

user: user-3
content: 排序函数写的不怎么地，看起来真费劲，而且并没有对原本的数组进行排序， 建议多看点基础的，有价值的书。

user: user-4
content: 设置断点 单步调试 慢慢看
user-0 提问: 帮解读一下这个类型定义typedef const struct SLObjectItf_ * const * SLObjectItf;

回复:
user: user-1
content: 我觉的理解这种代码，第一步先把const拿掉，得到一类型，然后加上const确定只读位置，另外const确定它右边第一项为只读

user: user-0
content: 引用 1 楼 hdt 的回复:给你段代码 int c=10; const int *b=&c; const int * const * aa = &b;  typedef const struct SLObjectItf_ * const * SLObjectItf;  意思是 将 const struct SLObjectItf_ * const *  重名名为 SLObjectItf , 其指针地址与指向的内容都是常量 是吗 ?

user: user-1
content: 给你段代码 int c=10; const int *b=&c; const int * const * aa = &b;

user: user-1
content: 引用 4 楼 han1202012 的回复:[quote=引用 3 楼 hdt 的回复:] 我觉的理解这种代码，第一步先把const拿掉，得到一类型，然后加上const确定只读位置，另外const确定它右边第一项为只读  typedef const struct SLObjectItf_ * const * SLObjectItf;   const struct SLObjectItf_ * const * 去掉 const 是 struct SLObjectItf_ ** 二维指针 两个维度的数据 都是常量   将一个 struct SLObjectItf_ 结构体的 二维指针 类型定义为  SLObjectItf 类型 , 这么理解对吗   [/quote] 不完全对，第一级指针是常量，且指向一个const struct ... 还是让代码说话 int a=0; 	const int *b= &a; 	const int *const* c= &b; 	int d=100; 	*c = &d; //error 	int *e = new int(10); 	c=&e;//ok

user: user-0
content: 引用 3 楼 hdt 的回复:我觉的理解这种代码，第一步先把const拿掉，得到一类型，然后加上const确定只读位置，另外const确定它右边第一项为只读  差不多懂了 非常感谢    结贴分数送上

user: user-0
content: 引用 3 楼 hdt 的回复:我觉的理解这种代码，第一步先把const拿掉，得到一类型，然后加上const确定只读位置，另外const确定它右边第一项为只读  typedef const struct SLObjectItf_ * const * SLObjectItf;   const struct SLObjectItf_ * const * 去掉 const 是 struct SLObjectItf_ ** 二维指针 两个维度的数据 都是常量   将一个 struct SLObjectItf_ 结构体的 二维指针 类型定义为  SLObjectItf 类型 , 这么理解对吗
user-0 提问: 数组与指针

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

user: user-2
content: 二维数组的问题

user: user-3
content: sun2d这个函数里面，两个for循环反了，行 和列

user: user-4
content: for (int i=0; i<2; ++i) {      for (int j =0; j<4; ++j)      {         tot =  ar[j][i];       }      printf( "%d\n", tot); }

user: user-5
content: 行列位置颠倒了，会导致数组越界。应为行数是4，变成列数是4，（列数应该为2,）会导致越界。  sum2d中将行列条换一下，然后再试一下。

user: user-6
content: 你函数里面c是行数，b是列数，加反了

user: user-7
content: 你A对应的是行，COLS对应的是列，数组是zippo[A][COLS]（即zippo[行][列]）；而下面访问时，c对应行，b对应列，访问的是ar[b][c]（即ar[列][行]），和前面不一致
user-0 提问: 求解error: syntax error before "int"

回复:
user: user-1
content: 您好！您的问题在于下面这段代码： int i,t,sum,ave,max,total;//i循环变量，t代换求分段人数 sum分数求和 ave分数平均 max 最大值 total选课人数,temp四舍五入用  是在主函数main{}里面，而你的ave等是主函数之外，导致您的ave等·因不是全局变量，再强制转换时出错。建议：把ave改为全局变量，然后再把语句写为： （int）ave=((int)(temp+0.5)==(int)temp) ? (int)temp:（int）(temp+0.5);

user: user-0
content: 改了一下现在确实好了  引用 4 楼 cfjtaishan 的回复:[quote=引用 1 楼 user-3 的回复:]  并没有问题啊 C++编译器没问题，但C语言的编译器就会出现error，主要是强制类型转换的格式不一样。 比如将int b强制类型转换为double类型，那么C语言必须：  int b = 5; double a = (double)b;  C++是偏向面向对象的。可以用  a = double(b); [/quote]

user: user-2
content: 引用 1 楼 user-3 的回复:并没有问题啊 C++编译器没问题，但C语言的编译器就会出现error，主要是强制类型转换的格式不一样。 比如将int b强制类型转换为double类型，那么C语言必须：  int b = 5; double a = (double)b;  C++是偏向面向对象的。可以用  a = double(b);

user: user-2
content: ave=((int)(temp+0.5)==(int)temp) ? (int)temp:int(temp+0.5); 改成： ave=((int)(temp+0.5)==(int)temp) ? (int)temp:(int)(temp+0.5); 注意将int用括号括起来。 然后再编译一下试试  个人建议下面的也可以改一下： temp=(float)sum/total; 改成 temp= sum * 1.0 /total; 虽然没提error，但是这样改也是没问题的。

user: user-0
content: 很奇怪，运行不了，难不成是我编译系统的问题？

user: user-3
content: 并没有问题啊

user: user-1
content: 1、建议：这句代码“int i,t,sum,ave,max,total;//i循环变量，t代换求分段人数 sum分数求和 ave分数平均 max 最大值 total选课人数,temp四舍五入用  ”， 是在主函数main{}里面，而你的ave等是主函数之外，导致您的ave等因不是全局变量，再强制转换时出错； 改为：把ave改为全局变量。 2、建议：temp=(float)sum/total（数据会溢出，因为total是int型，sum改为float型）； 改为：temp=(float)sum/(float)total;以防数据溢出。 3、建议：ave=((int)(temp+0.5)==(int)temp) ? (int)temp:int(temp+0.5); 改为ave = (int)( ( (temp +0.5 )==temp ) ? temp:(temp+0.5) ),可以进一步减少数据溢出，保证不报错

user: user-2
content: 引用 6 楼 zzgoucx 的回复:您好！您的问题在于下面这段代码： int i,t,sum,ave,max,total;//i循环变量，t代换求分段人数 sum分数求和 ave分数平均 max 最大值 total选课人数,temp四舍五入用  是在主函数main{}里面，而你的ave等是主函数之外，导致您的ave等·因不是全局变量，再强制转换时出错。建议：把ave改为全局变量，然后再把语句写为： （int）ave=((int)(temp+0.5)==(int)temp) ? (int)temp:（int）(temp+0.5); 还可以对等号左边的ave加(int)吗？第一看到。你的意思应该是把int放在等号右边吧。 ave=（int）((int)(temp+0.5)==(int)temp) ? (int)temp:（int）(temp+0.5);
user-0 提问: 关于C语言 初始化变量的值的正负 的问题，求教！

回复:
user: user-1
content: 答案解析说的很清楚了，k无初始化，但是会随机一个数，只有在k=0的时候输出。但个人认为这种题没意义

user: user-2
content: 引用 10 楼 wqmwuhao 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 可能是否负数，但是如果要输出的，只会是在while循环不满足条件时才会输出。题目的要求是输出，既然输出只可能输出k = 0; 然后在考虑k 随机值是一个负值时，（如果不是负值，那么就会输出0，不论是执行多少次循环）如下： #include <stdio.h>  int main(void) {     int k = -1;      while (k != 0) {         if (k > 0)         printf("k = %d++\n", k);         k = k - 1;     }      printf("k = %d\n", k);      return 0; } 可以看到输出的结果时，k最终会是非负值，因为k是int类型，它总有一个取值范围，而不是无限的负值下去（超过了int类型的范围之后就会被截断）。  好的，多谢。。。不过刚才试了一下电脑就卡住了= =[/quote] 循环次数比较多，多等一会试试。如果还是不行，建议直接杀死进程，这个是一个很大的循环，会很占CPU

user: user-3
content: 这种题目不好，不建议再看了

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:可能是否负数，但是如果要输出的，只会是在while循环不满足条件时才会输出。题目的要求是输出，既然输出只可能输出k = 0; 然后在考虑k 随机值是一个负值时，（如果不是负值，那么就会输出0，不论是执行多少次循环）如下： #include <stdio.h>  int main(void) {     int k = -1;      while (k != 0) {         if (k > 0)         printf("k = %d++\n", k);         k = k - 1;     }      printf("k = %d\n", k);      return 0; } 可以看到输出的结果时，k最终会是非负值，因为k是int类型，它总有一个取值范围，而不是无限的负值下去（超过了int类型的范围之后就会被截断）。  好的，多谢。。。不过刚才试了一下电脑就卡住了= =

user: user-4
content: 上机测试下，情况是怎么样的

user: user-5
content: 就算是负数，也会满足循环条件，所以负数到达int类型的边界的时候再-1就会变成int类型的最大值。

user: user-6
content: 这道题相当于一个脑筋急转弯。 k的值是随机的。如果随机值是正的，会递减到0，然后跳出循环。如果是负数，也会递减到负数的临界值，然后变成正数，再递减到0. 所以无论如何，都会输出0

user: user-7
content: 。。只要有输出。就肯定是0

user: user-8
content: 一个数到达临界值（即最大最小值），对其加/减，会导致数据溢出。相当于一个循环

user: user-2
content: 可能是否负数，但是如果要输出的，只会是在while循环不满足条件时才会输出。题目的要求是输出，既然输出只可能输出k = 0; 然后在考虑k 随机值是一个负值时，（如果不是负值，那么就会输出0，不论是执行多少次循环）如下： #include <stdio.h>  int main(void) {     int k = -1;      while (k != 0) {         if (k > 0)         printf("k = %d++\n", k);         k = k - 1;     }      printf("k = %d\n", k);      return 0; } 可以看到输出的结果时，k最终会是非负值，因为k是int类型，它总有一个取值范围，而不是无限的负值下去（超过了int类型的范围之后就会被截断）。

user: user-9
content: 鑒於計算機對整數的存儲方式，它是有邊界的，負數減到最小時，就會回到最大的正數，它是一個循環。
user-0 提问: 插入后的结构体的第一项总会被替换成stu[j] 怎么办？

回复:
user: user-1
content: 因为你的j是全局变量，在别的函数里使用j之后并没有对其修改。所以输入的时候就是输入的stu[j]。个人建议像循环变量不要定义成全局变量。局部变量即可。  #include<stdio.h> #include<stdlib.h>  int cur_num;  struct student {     int no;        //学号     char name[20]; //姓名     float score[3];//三门科目成绩     float sum; }stu[10];  void compare(struct student stu[]) {     int i, j, k, l;      j = cur_num - 1;      for(i = 0; i < 10;i++) /*越界*/     {         if(stu[j].no < stu[i].no)         {             k = i;             for(l=10;l>k;l--)                 stu[l]=stu[l-1];             stu[k]=stu[j];             break;         }     } }   void display(struct student stu[]) {     int i;     for(i=0;i<10;i++)     {         if(stu[i].no==0)             break;         printf("%d\t%s\t%.2f\t\n",stu[i].no,stu[i].name,stu[i].sum);     } }   void input() {     char choose;     int i;      for(i=0;i<10;i++)     {         printf("学号：");         scanf("%d",&stu[i].no);         printf("姓名：");         scanf("%s",stu[i].name);         printf("三门课程成绩：\n");         printf("语文：");         scanf("%f",&stu[i].score[0]);         printf("数学：");         scanf("%f",&stu[i].score[1]);         printf("英语：");         scanf("%f",&stu[i].score[2]);         stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];         printf("continue? (y)or(n)：");         getchar();         scanf("%c", &choose);         printf("\n\n");         if(choose=='n')             break;     }     cur_num = i + 1;  }  void input1() {     int j = cur_num;     if (cur_num >= 10)         return;     printf("学号");     scanf("%d",&stu[j].no);     printf("姓名：");     scanf("%s",stu[j].name);     printf("三门课程成绩：\n");     printf("语文：");     scanf("%f",&stu[j].score[0]);     printf("数学：");     scanf("%f",&stu[j].score[1]);     printf("英语：");     scanf("%f",&stu[j].score[2]);     stu[j].sum=stu[j].score[0]+stu[j].score[1]+stu[j].score[2];     cur_num++; }     int main() {     printf("                              **********************\n");     printf("                              *欢迎来到学生管理系统*\n");     printf("                              **********************\n");     input();     printf("                              ↓插入前的学员信息如下：↓\n");     printf("学号\t姓名\t三科分数总和\t\n");     display(stu);     printf("请输入你要插入的学员信息：\n");     input1();     printf("                              ↓插入后的学员信息如下：↓\n");     compare(stu);     display(stu);     system("pause"); } 参考一下吧

user: user-0
content: 好的，谢谢！
user-0 提问: 用VC++6.0 编译过了，但是运行不了，系统会崩溃

回复:
user: user-1
content: 引用 4 楼 leetow2006 的回复:我在win7上就不能装vc6了，不知道哪位可以 建议使用新的编译编辑器，VC6比较老了。 如果喜欢，可以考虑在Linux下编写程序

user: user-1
content: 引用 2 楼 iloveyou418 的回复:char a1[40], a2[20]; 	memcpy(a1, "welcome", 7); //	a1[40] = "welcome"; 	memcpy(a2, "sb   qingdao", 12); //	a2[20] = "sb   qingdao"; 为什么不用strcpy

user: user-1
content: #include<stdio.h> #include"string.h"  int main() {     char a1[40]="welcome ";     char a2[20]="sb  qingdao";     puts(a1);     //gets(a1);     //gets(a2);     printf("%d\n",strlen(a1) );     printf("%d\n",strcmp(a1,a2) );     printf("%s\n",strncpy(a1,a2,3));     printf("%s\n",strncat(a1,a2,3));     printf("%s\n",strchr(a1,'s'));     printf("%s\n",strstr(a1,"sb"));     printf("%s\n",strupr(a1));     printf("%s\n",strlwr(a1));   }  只能是定义时初始化，  a1[40]="welcome "; a2[20]="sb  qingdao"; 这样操作在C语言中是不可以的。建议借助strcpy赋值。

user: user-2
content: 我在win7上就不能装vc6了，不知道哪位可以

user: user-3
content: /*   gets puts strlen strcmp strcpy strcat strchr strstr strlwrh strupr*/ #include<stdio.h> #include"string.h" int main() {     char a1[40]="welcome ";     char a2[20]="sb  qingdao";     puts(a1);     //gets(a1);     //gets(a2);     printf("%d\n",strlen(a1) );     printf("%d\n",strcmp(a1,a2) );     printf("%s\n",strncpy(a1,a2,3));     printf("%s\n",strncat(a1,a2,3));     printf("%s\n",strchr(a1,'s'));     printf("%s\n",strstr(a1,"sb"));     printf("%s\n",strupr(a1));     printf("%s\n",strlwr(a1));          return (0); }

user: user-4
content: char a1[40], a2[20]; 	memcpy(a1, "welcome", 7); //	a1[40] = "welcome"; 	memcpy(a2, "sb   qingdao", 12); //	a2[20] = "sb   qingdao";

user: user-0
content: 拜托大神了
user-0 提问: 【C语言结构体疑问】

回复:
user: user-1
content: 程序不正常，如果下面的两个输出，那么上面的地址值也应该输出。并且像before和after这些字符串也没输出。 建议看一下你的代码是不是修改之后没有重新编译。

user: user-2
content: 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: 单步跟踪程序运行，观察变量变化情况，分析原因

user: user-0
content: 等下，最后一个d改为p——但是结果还是这样
user-0 提问: 这样报错的原因是什么？

回复:
user: user-1
content: 指针变量指向结构体元素用"->",用"."会报错。你定义的是指针：Prop *tradeProp = NULL;//要购买的商品指针   ，而用的时候是tradeProp.name      tradeProp.desc   应该用        tradeProp->name     tradeProp->desc

user: user-2
content: strcpy(player->bag.props[newIndex].name, tradeProp.name);		strcpy(player->bag.props[newIndex].desc, tradeProp.desc);  改成：  strcpy(player->bag.props[newIndex].name, tradeProp->name);		strcpy(player->bag.props[newIndex].desc, tradeProp->desc);  你这里是指针

user: user-0
content: 谢谢老师们！这块真是让人迷糊.......

user: user-3
content: /*     11     static Player playerArray[] = {  10     |   {1,"超级毛毛虫","123456", {.max = 8}, .gold=50000},   9     |   {2,"塔罗奥特曼","123456", {.max = 8}, .gold=150000  },   8     |   {3,"原始天尊之徒","123456", {.max = 8}, .gold=500000  },   7     |   {4,"星河","123456", {.max = 8}, .gold=1150000  }   6     };      5     |* */   4     static Player playerArray[] = {    3     |   {1,"超级毛毛虫","123456", .gold=50000, .bag.max = 8 },   2     |   {2,"塔罗奥特曼","123456", .gold=150000, .bag.max = 8 },   1     |   {3,"原始天尊之徒","123456", .gold=500000, .bag.max = 8 }, 157     |   {4,"星河","123456", .gold=1150000, .bag.max = 8 }                                                                                                                                                   1     };     两种方法都可以   strcpy(player->bag.props[newIndex].name,tradeProp->name);  /* 指针需要用->引用结构体元素*/         strcpy(player->bag.props[newIndex].desc,tradeProp->desc);  /* 指针需要用->引用结构体元素*/
user-0 提问: 一道oj简单题

回复:
user: user-1
content: 仅供参考：//用C语言编程，求出2^x=x^10这个方程的解。 #include <math.h> #include <stdio.h> double x,e; void main () {     x=-1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x);      x=1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x); }

user: user-2
content: 这个厉害了！

user: user-2
content: 百度搜不到GG

user: user-1
content: 百度搜相关关键字。

user: user-3
content: 不知道，我不是高富帅

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:仅供参考：//用C语言编程，求出2^x=x^10这个方程的解。 #include <math.h> #include <stdio.h> double x,e; void main () {     x=-1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x);      x=1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x); }   哦，懂了，非常谢谢
user-0 提问: windows7下安装protobuf报编译器错误

回复:
user: user-1
content: 错误很明显， conftest.c文件未找到

user: user-2
content: MINGW全部安装啊

user: user-3
content: 个人意见：使用mingw不如使用虚拟机下的Linux

user: user-0
content: 引用 2 楼 sdghchj 的回复:MINGW全部安装啊我全装试过了也是这个错
user-0 提问: CSAPP中 章节8.5.5 信号处理的例程

回复:
user: user-0
content: 引用 2 楼 paschen 的回复:单步跟踪程序运行，观察程序流程及变量变化，分析原因 仔细看了下,是被调用了2次

user: user-1
content: 单步跟踪程序运行，观察程序流程及变量变化，分析原因

user: user-2
content: 百度搜相关关键字。
user-0 提问: 关于C语言链表问题

回复:
user: user-1
content: #include <stdio.h>  struct word {     char c[20];     struct word *next; };  void del_word(struct word **head,char *w) {     struct word *pcur, *prev;      prev = *head;     if (strcmp(prev->c, w) == 0) {         *head = (*head)->next;         free(prev);         return;     }      pcur = (*head)->next;     while (pcur) {         if (strcmp(pcur->c, w) == 0) {             prev->next = pcur->next;             free(pcur);             return;         }         prev = pcur;         pcur = pcur->next;     }  } 参考一下吧；能够实现一次删除一个节点（若找到匹配w的word) 若要删除的节点是头结点，那么需要传二重指针进去，因此形参也是需要是二重指针。

user: user-2
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-3
content: 1`、你的程序很可能有内存泄露，因为没有对指针free 2、一个函数传入一个指针，修改它指向内存的内容，函数返回后，能够起作用。但是修改这个指针指向的地址，函数返回后不起作用，所以Head依然还是head

user: user-0
content: 拜托各位了解的老师们！
user-0 提问: linux下自己编写的CS模拟ftp时，如何实现文件传输速率限制（类似百度云非会员用户的下载文件）

回复:
user: user-1
content: 服務器端發送數據時做計數，以一個單位時間比如1秒來做限制，該時間段内達到限制的量之後就不再發送數據。單位時間越短，表現的越平滑。

user: user-2
content: 影响传输速率的因素可能会很多，比如接收端的带宽，发送端的带宽；这个是无法控制的，可以控制的就是发送端的发送速度即每秒中发送的数据包数。 如果是自己模拟，在一个局域网里，那么可以增加发送端的发送速度，比如发送完一个数据包，可以考虑加延迟，延迟多少毫秒再发送第二个数据包；通过控制发送数据包间的延迟间隔做到控制传输速率，当然如果更细化的控制传输速率，可以考虑控制一次发送数据包的大小；即发送间隔的延迟控制和数据包大小控制。

user: user-3
content: 控制单位时间send或recv的字节数而已。我猜。