Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求大神帮忙求解指针数组

回复:
user: user-1
content: 数组名当函数参数传入的时候 弱化成指针 也就是相当于那个函数只接受了你数组的首地址当作参数

user: user-2
content: 楼上正解，数组名是常量，不能进行++操作。只有变量才可以！

user: user-3
content: 数组名是个常量

user: user-4
content: 第二个初始化，应该是  char **ch=a; 这样++ch 是没问题的。 或者，也可以这么初始化； 1） char *ch[3]={a[0],a[1],a[2]}; 2） char *ch[3];  ch[0]=a[0];  ch[1] = a[1];  ch[2] = a[2];   不过没有意义，而且 ++ch 同样是错误的  char *ch[3]; ch=a; 是错误的，C,C++数组不可整体赋值。 其他参见1楼，2楼。

user: user-5
content: 数组名和数组首地址的区别  搜一下

user: user-6
content: 同意楼上的说法  数组名字 是代表的数组   值是第一个元素的地址  数组的名字是固定的 不可以进行++之类的操作 因为++之类的操作改变了值    用函数调用  char *argv[] 其实跟 char** argv 没有区别 ,  argv是一个二级指针  由于函数参数进行的是传值调用  就是 把数组的值 也就是第一个元素的地址 赋值给 argv的二级指针  argv当然是可以变化的

user: user-7
content: 数组名作为参数就相当于指针， 你有见过给数组名++的吗？数组访问还是使用下标
user-0 提问: 要开始找工作了，求各位前辈给点面试经验！！！

回复:
user: user-1
content: 引用 1 楼 qq120848369 的回复:打铁还需自身硬，三本必读的书籍：UNIX环境高级编程 UNIX网络编程卷1+2 TCP协议详解卷1 这基本书是好书，我都有，不过作为应届毕业生，看这些书多找工作帮助不大。效果不明显： 推荐你基本数，林锐博士的C/C++高质量编程指南，C/C++求职宝典，解开C语言面试的秘密 高级一点的可以看看剑指offer 书名不一定完全准确，你可以搜搜

user: user-2
content: 我也说一点，但是不是技术方面的：当你没有拿到书面的offer前，不要为这个口头的offer做任何决定，否则吃亏的只能是你自己，切记！！！本屌经历过两次，非常非常痛的领悟……

user: user-3
content: 还是把基础做好吧，多数面试是以笔试开始的，笔试很多都是基础题，还有一些编程题。当然，还有一些智力题！

user: user-4
content: 引用 1 楼 qq120848369 的回复:打铁还需自身硬，三本必读的书籍：UNIX环境高级编程 UNIX网络编程卷1+2 TCP协议详解卷1这就能把持得住？

user: user-5
content: 关键是笔试

user: user-6
content: 看笔试面试题就足够了

user: user-7
content: 那要看你的定位是什么样的了，大公司的话那还是抓紧时间看看数据结构 和linux c 把

user: user-8
content: 找一些linuxC的一些面试题目看看！ 估计就是问 c的一些基础知识， 然后Linux下vim的这些操作！  对应届生 要求应该不会很高，除非面试的比较好的IT公司

user: user-9
content: 打铁还需自身硬，三本必读的书籍：UNIX环境高级编程 UNIX网络编程卷1+2 TCP协议详解卷1

user: user-10
content: 我是去年刚刚毕业的，找工作的时候还是要多看看笔试题，C语言的基础题，Linux的基本命令，数据结构还是要好好看看的，我面试时候基本都会问到数据结构的问题，再就是要根据你具体面试的公司要求，有针对性的准备下，比如网络或者数据库，或者其他的
user-0 提问: 关于c语言文件操作-使用a+模式打开

回复:
user: user-0
content: 我也刚刚发现，你说的很对！谢谢了

user: user-1
content: a+表示用附加方式打开可读写的文件，即文件被打开时，文件的访问指针是在结尾，所以fgetc读取返回-1。而r+开打文件时，指针是在文件开头的，不一样。
user-0 提问: 关于获取窗口句柄的问题

回复:
user: user-1
content: 引用 4 楼 jerry_dqh 的回复:有一个getchar,你的hello已经结束了，获取不到了。如果没有getchar,程序直接往下执行，这时候hello这个进程还没有来得及结束掉。当然也有可能你不加getchar，在下一句获取handle的时候也已经结束了。你将getchar换成sleep(2000)，你也获取不到句柄了。++

user: user-2
content: 没有getchar,阻塞本进程，  引用 2 楼 wangli1000000 的回复:[quote=引用 1 楼 xihu1364 的回复:] [quote=引用 楼主 wangli1000000 的回复:] 如下：   #include <stdio.h> #include <windows.h>   int main(void) {          HANDLE hOut;                                       ShellExecute(NULL,"open","E:\\Hello.exe",NULL,NULL,SW_SHOWNOACTIVATE);  getch();     hOut=FindWindow(NULL,"E:\\Hello.exe");  /*获得窗口句柄*/     printf("%ld ",hOut);     getch();     PostMessage(hOut,WM_CLOSE,0,0);                exit(0);      }   有 getch(); 时，就能获取句柄；当把getch();删除后，句柄就为0了。请问为什么？谢谢。  没有getch();这个程序就直接将E:\\Hello.exe程序的句柄给关掉了（PostMessage(hOut,WM_CLOSE,0,0);）  getch();起的作用就是让程序停在这里。让你看见打印出来的句柄printf("%ld ",hOut);  你可以用while （1）｛Sleep（1000）;｝代替getch(); 这样也可以看到打印句柄[/quote]   没说清楚，我说的是ShellExecute 语句后的getch(); 不是第二个getch() .[/quote] 如果没有shellexecute后面阻塞一下，这个shellexecute本身的程序还没来得及把新的进程 创建出来，你就直接FindWinodws是找不到的，你阻塞一下那么Shellexecute的新进程就有足够时间 把新进程创建出来。因为Shellexecute本身是异步的。

user: user-3
content: 原因很简单，ShellExecute返回是很快的，如果没有getch让程序停在那，就会立刻执行下一句FindWindow。但是此时ShellExecute所打开的程序的窗口甚至都没创建出来，自然是什么都find不到喽，所以就返回０，但有了getch，就有足够的时间让窗口彻底生成出来，这样等ｌｚ随便输个字符，就能正确找到窗口的句柄了

user: user-4
content: 有一个getchar,你的hello已经结束了，获取不到了。如果没有getchar,程序直接往下执行，这时候hello这个进程还没有来得及结束掉。当然也有可能你不加getchar，在下一句获取handle的时候也已经结束了。你将getchar换成sleep(2000)，你也获取不到句柄了。

user: user-0
content: 引用 1 楼 xihu1364 的回复:[quote=引用 楼主 wangli1000000 的回复:] 如下：   #include <stdio.h> #include <windows.h>   int main(void) {          HANDLE hOut;                                       ShellExecute(NULL,"open","E:\\Hello.exe",NULL,NULL,SW_SHOWNOACTIVATE);  getch();     hOut=FindWindow(NULL,"E:\\Hello.exe");  /*获得窗口句柄*/     printf("%ld ",hOut);     getch();     PostMessage(hOut,WM_CLOSE,0,0);                exit(0);      }   有 getch(); 时，就能获取句柄；当把getch();删除后，句柄就为0了。请问为什么？谢谢。  没有getch();这个程序就直接将E:\\Hello.exe程序的句柄给关掉了（PostMessage(hOut,WM_CLOSE,0,0);）  getch();起的作用就是让程序停在这里。让你看见打印出来的句柄printf("%ld ",hOut);  你可以用while （1）｛Sleep（1000）;｝代替getch(); 这样也可以看到打印句柄[/quote]   没说清楚，我说的是ShellExecute 语句后的getch(); 不是第二个getch() .

user: user-5
content: 引用 楼主 wangli1000000 的回复:如下：   #include <stdio.h> #include <windows.h>   int main(void) {          HANDLE hOut;                                       ShellExecute(NULL,"open","E:\\Hello.exe",NULL,NULL,SW_SHOWNOACTIVATE);  getch();     hOut=FindWindow(NULL,"E:\\Hello.exe");  /*获得窗口句柄*/     printf("%ld ",hOut);     getch();     PostMessage(hOut,WM_CLOSE,0,0);                exit(0);      }   有 getch(); 时，就能获取句柄；当把getch();删除后，句柄就为0了。请问为什么？谢谢。  没有getch();这个程序就直接将E:\\Hello.exe程序的句柄给关掉了（PostMessage(hOut,WM_CLOSE,0,0);）  getch();起的作用就是让程序停在这里。让你看见打印出来的句柄printf("%ld ",hOut);  你可以用while （1）｛Sleep（1000）;｝代替getch(); 这样也可以看到打印句柄
user-0 提问: 菜鸟来请教各位大神了，运行出错啊

回复:
user: user-1
content: scanf_s用得不对，改为： scanf_s("%lf %c %lf", &a, &c, 1, &b); 要不就直接用scanf，如下： scanf("%lf %c %lf", &a, &c, &b); 注意：不管你用哪个，由于你%lf %c %lf之间用了空格隔开，因此，你输入时也要用空格隔开，比如“6 + 5”，即格式要和scanf引号中的格式一一对应。

user: user-0

user: user-0
content: 这是一个计算器，问题在于输入的6+5这样的，任何的运算式都不能识别，报错  引用 1 楼 turingo 的回复:要实现什么，错误又是什么？  [quote=引用 楼主 u013351990 的回复:] // ConsoleApplication8.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h"   void main() { 	double a = 0.0; 	double b = 0.0; 	char c = 0;  	printf("\n\t\t\t\t欢迎使用计算机程序"); 	printf("\n\n请输入计算式："); 	scanf_s("%lf %c %lf", &a, &c, &b);  	switch (c) 	{ 		case '+': 			printf("=%lf\n\a", a + b); 			break; 		case '-': 			printf("=%lf\n\a", a - b); 			break; 		case '*': 			printf("=%lf\n\a", a*b); 			break; 		case '/': 			if (b == 0) 				printf("\a\t抱歉分母为0，不能进行下一步计算！"); 			else 				printf("=%lf\n\a", a / b); 			break; 		case '%': 			if (long(b) == 0) 				printf("\a\t抱歉分母为0，不能进行下一步计算！"); 			else 				printf("=%lf\n\a", (long)a%long(b)); 			break; 		default: 			printf("抱歉，你输入的算术符号不对吧，估计是的，请检查输入的内容"); 			break; 	} }[/quote]

user: user-2
content: 要实现什么，错误又是什么？  引用 楼主 u013351990 的回复:// ConsoleApplication8.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h"   void main() { 	double a = 0.0; 	double b = 0.0; 	char c = 0;  	printf("\n\t\t\t\t欢迎使用计算机程序"); 	printf("\n\n请输入计算式："); 	scanf_s("%lf %c %lf", &a, &c, &b);  	switch (c) 	{ 		case '+': 			printf("=%lf\n\a", a + b); 			break; 		case '-': 			printf("=%lf\n\a", a - b); 			break; 		case '*': 			printf("=%lf\n\a", a*b); 			break; 		case '/': 			if (b == 0) 				printf("\a\t抱歉分母为0，不能进行下一步计算！"); 			else 				printf("=%lf\n\a", a / b); 			break; 		case '%': 			if (long(b) == 0) 				printf("\a\t抱歉分母为0，不能进行下一步计算！"); 			else 				printf("=%lf\n\a", (long)a%long(b)); 			break; 		default: 			printf("抱歉，你输入的算术符号不对吧，估计是的，请检查输入的内容"); 			break; 	} }
user-0 提问: float类型的范围问题~~

回复:
user: user-1
content: 楼主可以看看IEEE754标准中浮点数的存储 指出一点，指数是用移码表示的，将移码减去127就是指数的真值

user: user-2
content: 记住一点就行了，计算机没有十个手指

user: user-3
content: 楼主理解有误差，实际上，对于浮点型来说，在内存中，把一个浮点型数据分成小数部分和指数部分进行存储，在计算机中用二进制数来表示小数部分，用2的幂次来表示指数部分，而且对于浮点型的数值范围，在Turbo C，Turbo C++6.0，MS C中，float类型的数值范围是（-3.4*10^-38~3.4*10^38）,而在ANSI C中，并未具体规定每种类型数据的长度，精度和数值范围，所以不必太在意数值问题。

user: user-4
content: 因为是二进制的数。  引用 2 楼 pokerLee 的回复:[quote=引用 1 楼 turingo 的回复:] 由指数范围决定的。  [quote=引用 楼主 pokerLee 的回复:] float的指数范围为-127~+128，而double的指数范围为-1023~+1024，并且指数位是按补码的形式来划分的。   其中负指数决定了浮点数所能表达的绝对值最小的非零数；而正指数决定了浮点数所能表达的绝对值最大的数，也即决定了浮点数的取值范围，float的范围为-2^128 ~ +2^128。  哪位大侠指点一下范围-2^128~+2^128是怎么来的~~跪求指点啊~~[/quote]为什么底数为2呢~~指数只是用8位内存表示了~~突然冒出来个2当底数~~求指点~~[/quote]

user: user-0
content: 引用 1 楼 turingo 的回复:由指数范围决定的。  [quote=引用 楼主 pokerLee 的回复:] float的指数范围为-127~+128，而double的指数范围为-1023~+1024，并且指数位是按补码的形式来划分的。   其中负指数决定了浮点数所能表达的绝对值最小的非零数；而正指数决定了浮点数所能表达的绝对值最大的数，也即决定了浮点数的取值范围，float的范围为-2^128 ~ +2^128。  哪位大侠指点一下范围-2^128~+2^128是怎么来的~~跪求指点啊~~[/quote]为什么底数为2呢~~指数只是用8位内存表示了~~突然冒出来个2当底数~~求指点~~

user: user-4
content: 由指数范围决定的。  引用 楼主 pokerLee 的回复:float的指数范围为-127~+128，而double的指数范围为-1023~+1024，并且指数位是按补码的形式来划分的。   其中负指数决定了浮点数所能表达的绝对值最小的非零数；而正指数决定了浮点数所能表达的绝对值最大的数，也即决定了浮点数的取值范围，float的范围为-2^128 ~ +2^128。  哪位大侠指点一下范围-2^128~+2^128是怎么来的~~跪求指点啊~~
user-0 提问: 贪吃蛇和俄罗斯方块

回复:
user: user-0
content: 本人在做贪吃蛇的背景音乐，急求，希望牛人们解答

user: user-0
content: 求怎样在获得相对路径

user: user-0

user: user-1
content: 我觉得楼上答非所问~~~哈哈，虽然我不知道

user: user-2
content: 循环播放就可以了。  引用 楼主 u012983920 的回复:求怎样在c#做的贪吃蛇中加背景音乐 ，加的是MP3格式的
user-0 提问: **********************求达人解释*************************

回复:
user: user-0
content: 引用 5 楼 q745401990 的回复: 引用 6 楼 starytx 的回复:引用 4 楼 u013235485 的回复:引用 2 楼 starytx 的回复:  非常感谢，相当受益啊。 感谢二位。 祝2014年马上有钱。。。

user: user-1
content: 引用 4 楼 u013235485 的回复:[quote=引用 2 楼 starytx 的回复:] 计算机处理浮点数只能做到近似，举个不太恰当的例子，有时候CSDN上的回复时间看起来是一样的，那为什么又有个先后呢？因为后台的时间还有毫秒，而我们看不到这个，同样对于浮点数来说因为他不“干脆”，所以使用==来判断是有风险的。通常的做法是做差，然后取绝对值，看这个差值是否在精度范围内即可认定是否相等  非常感谢。似乎懂了一些。那么请问在实际工作中，上面的对于浮点的相等比较是不是应该杜绝？？ 包括在其它计算机语言中。[/quote]是的，浮点数判断是否相等都应该取差值绝对值，判断是否小于一个精度范围的值比如0.000001来判断

user: user-2
content: 记得包含math.h 头文件！！

user: user-0
content: 引用 2 楼 starytx 的回复:计算机处理浮点数只能做到近似，举个不太恰当的例子，有时候CSDN上的回复时间看起来是一样的，那为什么又有个先后呢？因为后台的时间还有毫秒，而我们看不到这个，同样对于浮点数来说因为他不“干脆”，所以使用==来判断是有风险的。通常的做法是做差，然后取绝对值，看这个差值是否在精度范围内即可认定是否相等  非常感谢。似乎懂了一些。那么请问在实际工作中，上面的对于浮点的相等比较是不是应该杜绝？？ 包括在其它计算机语言中。

user: user-2
content: 楼主应该知道浮点数有一个有效位数，其实浮点数的小数位往后甚至可以输出几十位，所有每一次浮点数做运算都是取若干位有效数字，等于就是近似求取，必然会丢失精度！在浮点数之间做比较时，一般是求两数的绝对值在某个区间内，简单的改了下你的程序 for (x = 0.0; fabs(x-2.0) > 0.00001  ; x += 0.2) 	{     	printf("%f\n",x); 	}

user: user-1
content: 计算机处理浮点数只能做到近似，举个不太恰当的例子，有时候CSDN上的回复时间看起来是一样的，那为什么又有个先后呢？因为后台的时间还有毫秒，而我们看不到这个，同样对于浮点数来说因为他不“干脆”，所以使用==来判断是有风险的。通常的做法是做差，然后取绝对值，看这个差值是否在精度范围内即可认定是否相等

user: user-3
content: 浮点数经过运算基本上都有一个精确位数，刚输入时应该还是比较准确
user-0 提问: 关于二维数组解引用问题

回复:
user: user-1
content: 数组的地址和数组第一个元素的地址是一样的， 但是从指针的角度看， 指针对象却是不一样的 b++; *b++;

user: user-2
content: 个人觉得是这样的：cout<<b+1；和cout<<*(b+1)；都是要输出相同的内容，不管解没解引用，要想打印这个值，就必须先找到存放这个值的地址，然后再把这个值打印出来，两个语句实现的功能一样，只是表现形式不一样，所以编译的汇编代码一样。

user: user-0
content: 引用 2 楼 Automation_dmu 的回复:数组的地址和数组第一个元素的地址是一样的， 但是从指针的角度看， 指针对象却是不一样的 b++; *b++; 我就是不明白，b+1是二维数组b[1][0]的地址 那对(b+1)进行解引用，返回的应该是b[1][0]里面的值啊，为什么还是b[1][0]的地址？[/quote] 二维数组是一维数组的一维数组，二维数组名可以隐式转换为指向第一个一维数组的数组指针 b+1是指向第二个一维数组的数组指针，*(b+1)是第二个一维数组，也可以隐式转换为指向第二个一维数组第一个元素的指针 解引用是分层的，对b这个二维数组转换而成的一维数组指针进行一次解引用*，得到的不是元素而是一维数组转换而成的元素指针[/quote] 应该是明白了，谢谢~

user: user-0
content: 引用 5 楼 Sharing_Li 的回复:[quote=引用 4 楼 xhbuming 的回复:] [quote=引用 1 楼 Sharing_Li 的回复:] 个人觉得是这样的：cout<<b+1；和cout<<*(b+1)；都是要输出相同的内容，不管解没解引用，要想打印这个值，就必须先找到存放这个值的地址，然后再把这个值打印出来，两个语句实现的功能一样，只是表现形式不一样，所以编译的汇编代码一样。 两个返回的都是地址而不是地址指向的值，难道解引用没有用？[/quote] 可以去看看C++中关于<<的重载[/quote] 这个与<<没关系吧，printf也输出相同的值啊？

user: user-3
content: 引用 3 楼 xhbuming 的回复:[quote=引用 2 楼 Automation_dmu 的回复:] 数组的地址和数组第一个元素的地址是一样的， 但是从指针的角度看， 指针对象却是不一样的 b++; *b++; 我就是不明白，b+1是二维数组b[1][0]的地址 那对(b+1)进行解引用，返回的应该是b[1][0]里面的值啊，为什么还是b[1][0]的地址？[/quote] 二维数组是一维数组的一维数组，二维数组名可以隐式转换为指向第一个一维数组的数组指针 b+1是指向第二个一维数组的数组指针，*(b+1)是第二个一维数组，也可以隐式转换为指向第二个一维数组第一个元素的指针 解引用是分层的，对b这个二维数组转换而成的一维数组指针进行一次解引用*，得到的不是元素而是一维数组转换而成的元素指针

user: user-4
content: 一维数组指针指向的是数组元素类型，二位数组指针指向的是一维数组指针  为什么结果一样，因为逻辑一样而已  实际上不应该是一样的

user: user-2
content: 引用 4 楼 xhbuming 的回复:[quote=引用 1 楼 Sharing_Li 的回复:] 个人觉得是这样的：cout<<b+1；和cout<<*(b+1)；都是要输出相同的内容，不管解没解引用，要想打印这个值，就必须先找到存放这个值的地址，然后再把这个值打印出来，两个语句实现的功能一样，只是表现形式不一样，所以编译的汇编代码一样。 两个返回的都是地址而不是地址指向的值，难道解引用没有用？[/quote] 可以去看看C++中关于<<的重载

user: user-0
content: 引用 1 楼 Sharing_Li 的回复:个人觉得是这样的：cout<<b+1；和cout<<*(b+1)；都是要输出相同的内容，不管解没解引用，要想打印这个值，就必须先找到存放这个值的地址，然后再把这个值打印出来，两个语句实现的功能一样，只是表现形式不一样，所以编译的汇编代码一样。 两个返回的都是地址而不是地址指向的值，难道解引用没有用？

user: user-0
content: 引用 2 楼 Automation_dmu 的回复:数组的地址和数组第一个元素的地址是一样的， 但是从指针的角度看， 指针对象却是不一样的 b++; *b++; 我就是不明白，b+1是二维数组b[1][0]的地址 那对(b+1)进行解引用，返回的应该是b[1][0]里面的值啊，为什么还是b[1][0]的地址？
user-0 提问: 用opencv实现车辆检测与计数功能，已实现前景检测，如何实现计数？

回复:
user: user-1
content: 《学习OpenCV（中文版）》

user: user-2
content: cvFindContours 如果二值图已经是车辆的轮廓 直接利用轮廓检测函数直接检测就行 或者通过控制每一个轮廓的大小 过滤掉过小或者不符合轮廓逻辑规则的噪点

user: user-3
content: 楼主，可不可以给发些资料,本人菜鸟一枚，体谅 1986642073@qq.com
user-0 提问: 致那些初学者的观点。

回复:
user: user-1
content: 语言都是差不多了！

user: user-2
content: 我在优化自己的程序的时候，把一个重要数据结构里的64位数改成16位，程序快了接近一个数量级。 然后，如果你不用指定长度的类型，库会遇到与长度相关的兼容性问题。

user: user-3
content: 还是需要了解一下的

user: user-4
content: 肉类对素食者无用，但是对我有用

user: user-5
content: C++是强数据类型的语言 当然得关注了

user: user-0
content: 引用 1 楼 a345485527 的回复:不明觉厉...  那么你跪拜三天三夜吧。

user: user-6
content: 不明觉厉...

user: user-4
content: 引用 13 楼 BlackKOL 的回复:[quote=引用 6 楼 derekrose 的回复:] [quote=引用 5 楼 BlackKOL 的回复:] [quote=引用 4 楼 derekrose 的回复:] 肉类对素食者无用，但是对我有用   主要是先吃着素食。后面想长胖在去吃肉是可以的把。  主要刚一上。什么八进制。十六进制 真没有认真看过学习过。。  然后有又什么 科学记数法，指数记数法'e-记法'的。  初学真需要学的好好的吗。[/quote] 你没懂我的意思[/quote]   感觉我差不多说的像是懂了呀。求解释[/quote]  是否有用是具有相对性的

user: user-0
content: 引用 6 楼 derekrose 的回复:[quote=引用 5 楼 BlackKOL 的回复:] [quote=引用 4 楼 derekrose 的回复:] 肉类对素食者无用，但是对我有用   主要是先吃着素食。后面想长胖在去吃肉是可以的把。  主要刚一上。什么八进制。十六进制 真没有认真看过学习过。。  然后有又什么 科学记数法，指数记数法'e-记法'的。  初学真需要学的好好的吗。[/quote] 你没懂我的意思[/quote]   感觉我差不多说的像是懂了呀。求解释

user: user-7
content: 据说: 一楼的只能要饭 二楼的勉强温饱 三楼才能小康 四楼都是财主  有一部分人 爬到2楼就天天嘲笑爬3楼的 总觉得有吃的就可以混了还爬个屁 可一回过头 这些2B天天埋怨社会不公平

user: user-8
content: 现在不用功, 遇到就发蒙. 觉得不重要, 感觉没啥用, 是因为你还没遇到....

user: user-9
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-10
content: 工具就是工具，思想就是思想。 工具仅仅是用来实现思想而已

user: user-11
content: 学以致用，但先学后用。

user: user-12
content: 存在必有存在的价值

user: user-4
content: 引用 5 楼 BlackKOL 的回复:[quote=引用 4 楼 derekrose 的回复:] 肉类对素食者无用，但是对我有用   主要是先吃着素食。后面想长胖在去吃肉是可以的把。  主要刚一上。什么八进制。十六进制 真没有认真看过学习过。。  然后有又什么 科学记数法，指数记数法'e-记法'的。  初学真需要学的好好的吗。[/quote] 你没懂我的意思

user: user-0
content: 引用 4 楼 derekrose 的回复:肉类对素食者无用，但是对我有用   主要是先吃着素食。后面想长胖在去吃肉是可以的把。  主要刚一上。什么八进制。十六进制 真没有认真看过学习过。。  然后有又什么 科学记数法，指数记数法'e-记法'的。  初学真需要学的好好的吗。
user-0 提问: malloc内存分配，必须释放。否则内存泄漏？

回复:
user: user-1
content: 对于1S种就结束的程序来说弹内存泄漏没意义。除非你来个循环，次次内存泄漏，这我就不说了。 对于长期运行的程序，内存泄漏是很有问题的，严重影响系统资源。用完了，就必须释放，不要侥幸。

user: user-0
content: 引用 12 楼 cjfdqchwh 的回复:[quote=引用 11 楼 cjfdqchwh 的回复:] [quote=引用 6 楼 u011939931 的回复:] 不好意思，程序上错了。是这个…… int main(void) {   char *ptr = (char*)malloc(10);   if(NULL == ptr)   {     printf("\n Malloc failed \n");     return 0;   }   else   {   }   return 0;  }  这肯定内存泄露，不过这个函数不再一个循环里头，只是运行一次，所以程序运行一次，就会泄露了 10个char类型的内存[/quote]  当这个程序结束后，操作系统会自动去清扫分配给这个进程的资源。[/quote]

user: user-0
content: 引用 14 楼 taodm 的回复:这说明楼主看错了书，把错误结论/有限制条件结论当普遍真理了。

user: user-2
content: 这说明楼主看错了书，把错误结论/有限制条件结论当普遍真理了。

user: user-3
content: 对于运行7*24小时的程序，不能容忍内存泄漏，你想想，一直想系统要内存，内存肯定会用光的  对于运行一下，就关掉的程序，内存泄漏一下也没什么关系。因为关掉程序后，内存又归系统了  但是你想，好的程序能让系统的内存用光吗？

user: user-4
content: 引用 11 楼 cjfdqchwh 的回复:[quote=引用 6 楼 u011939931 的回复:] 不好意思，程序上错了。是这个…… int main(void) {   char *ptr = (char*)malloc(10);   if(NULL == ptr)   {     printf("\n Malloc failed \n");     return 0;   }   else   {   }   return 0;  }  这肯定内存泄露，不过这个函数不再一个循环里头，只是运行一次，所以程序运行一次，就会泄露了 10个char类型的内存[/quote]  当这个程序结束后，操作系统会自动去清扫分配给这个进程的资源。

user: user-4
content: 引用 6 楼 u011939931 的回复:不好意思，程序上错了。是这个…… int main(void) {   char *ptr = (char*)malloc(10);   if(NULL == ptr)   {     printf("\n Malloc failed \n");     return 0;   }   else   {   }   return 0;  }  这肯定内存泄露，不过这个函数不再一个循环里头，只是运行一次，所以程序运行一次，就会泄露了 10个char类型的内存

user: user-5
content: 但是在程序运行期间要是不释放那就是泄露了

user: user-5
content: 因为在进程正常结束的情况下有操作系统给你做清理工作

user: user-6
content: 如果整个过程中都需要使用的话，可以不释放！但是习惯不好！不推荐！ 还是释放会比较靠谱

user: user-0
content: 不好意思，程序上错了。是这个…… #include <stdio.h> #include <malloc.h>  int main(void) { char *ptr = (char*)malloc(10); if(NULL == ptr) { printf("\n Malloc failed \n"); return 0; } else {  } return 0;  }

user: user-0
content: 引用 2 楼 zhuobattle 的回复:如果不free，那就内存泄漏了。我给程序弄错了，本来里面没有free（ptr）这句。

user: user-7
content: malloc得到的内存不free 自然会 内存泄露  然后内存泄露是一个运行期的隐患  说什么程序结束之后 会回收资源就前言不搭后语了   另外你的代码有释放malloc得到的内存 至于返回值NULL 这种情况你没有获得malloc得到的内存 自然不存在什么释放的问题  再另外  free 之前 判断指针是否为NULL是多余的 因为free NULL是安全的 不过malloc 之后 判断指针是否是NULL 就是有必要的

user: user-8
content: 如果这个程序要连续跑上一个月不结束，那么分配的内存如果不释放就会有问题 另外，这段代码释放掉了内存

user: user-9
content: 如果不free，那就内存泄漏了。

user: user-10
content: 不释放分配的内存，内存泄露是有的，只是没有影响到操作系统而已。 操作系统变聪明了，所以内存泄露不怕了。 如此而已. 另外，这段代码，已经释放内存了。 malloc 结果为NULL，表示分配内存失败，内存没有分配，不必释放。

user: user-11
content: 参考《深入解析Windows操作系统-Windows Internals》进程管理。
user-0 提问: 小弟新人求解

回复:
user: user-1
content: 有哪里奇怪？float总要有点误差吧

user: user-2
content: 浮点数无法精确表示十进制小数，除非该小数恰好是0.5的n次方的整数倍 这是基础知识，请牢记
user-0 提问: 如何在程序里模拟在cmd里用管理员权限运行一条指令？

回复:
user: user-1
content: google搜索： shellexecuteex  runas

user: user-2
content: runas /noprofile /user:mymachine\administrator cmd 用runas试下，具体使用如何看下帮助。

user: user-0
content: 啊，，哈哈 搞定啦，你那个命令差一点点就成了，改成这样就好了 ShellExecute(0,"runas", LPCSTR("cmd.exe"),LPCSTR("/c net user administrator /active:yes"),"",SW_HIDE);  多谢各位的帮助。。。

user: user-3
content: 引用 5 楼 yangw150 的回复:啊，大神，你来啦， ShellExecuteA(0,"runas","cmd /c net user administrator /active:yes","","",1); 这个命令不行哦，我试过了 生成一个临时文本文件tmp.bat，内容为 runas /noprofile /user:mymachine\administrator "cmd /c \"net user administrator /active:yes\""  FILE *f; f=fopen("tmp.bat","r"); fprintf(f,"runas /noprofile /user:mymachine\\administrator \"cmd /c \\\"net user administrator /active:yes\\\"\"\n"); fclose(f); WinExec("cmd /c tmp.bat",SW_HIDE); remove("tmp.bat"); 再试试看。

user: user-0
content: 啊，大神，你来啦， ShellExecuteA(0,"runas","cmd /c net user administrator /active:yes","","",1); 这个命令不行哦，我试过了

user: user-3
content: ShellExecuteA(0,"runas","cmd /c net user administrator /active:yes","","",1);  试试看。  CreateProcessAsUser The CreateProcessAsUser function creates a new process and its primary thread. The new process then executes a specified executable file. The CreateProcessAsUser function is similar to the CreateProcess function, except that the new process runs in the security context of the user represented by the hToken parameter. By default, the new process is non-interactive, that is, it runs on a desktop that is not visible and cannot receive user input. Also, by default, the new process inherits the environment of the calling process, rather than the environment associated with the specified user.  BOOL CreateProcessAsUser(   HANDLE hToken,         // handle to a token representing the logged-on user   LPCTSTR lpApplicationName,  // pointer to name of executable module   LPTSTR lpCommandLine,       // pointer to command line string   LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes   LPSECURITY_ATTRIBUTES lpThreadAttributes,  // thread security attributes   BOOL bInheritHandles,         // whether new process inherits handles   DWORD dwCreationFlags,        // creation flags   LPVOID lpEnvironment,         // pointer to new environment block   LPCTSTR lpCurrentDirectory,   // pointer to current directory name   LPSTARTUPINFO lpStartupInfo,  // pointer to STARTUPINFO   LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION );

user: user-0
content: ShellExecuteA(0,"runas","cmd","","",1);  这样是以管理员权限打开了cmd窗口，但怎么运行net user administrator /active:yes指令呢？
user-0 提问: pthread_mutex_lock 粒度

回复:
user: user-1
content: pthread_mutex_lock(&g_testlock); pthread_mutex_unlock(&g_testlock); // 休眠一会   pthread_mutex_lock(&g_testlock); pthread_mutex_unlock(&g_testlock); // 休眠一会  在试试，呵呵

user: user-0
content: 修改成了  #include <stdio.h> #include <unistd.h> #include <pthread.h>   static pthread_mutex_t g_testlock;   void* thread_func(void* param) {           while(1)         {                 pthread_mutex_lock(&g_testlock);                 printf("thread lock\n");                 sleep(2);                 pthread_mutex_unlock(&g_testlock);                 printf("thread unlock\n");          }          return NULL;  }  int main() {         pthread_mutex_init(&g_testlock, NULL);         pthread_t threadId;         pthread_create(&threadId, NULL, thread_func, NULL);         while (1)         {                 pthread_mutex_lock(&g_testlock);                 printf("main lock \n");                 sleep(2);                 pthread_mutex_unlock(&g_testlock);                 printf("main unlock\n");         }           pthread_join(threadId, NULL);         pthread_mutex_destroy(&g_testlock);          return 0; } ~                                    结果 main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock main lock  main unlock

user: user-1
content: pthread_mutex_lock(&g_testlock); // 休眠一会 pthread_mutex_unlock(&g_testlock);   pthread_mutex_lock(&g_testlock); // 休眠一会 pthread_mutex_unlock(&g_testlock);  在试试，呵呵

user: user-0
content: 好了，确实是如果unlock不停顿一下极可能又继续走对应的lock，而不会走另一个线程的lock
user-0 提问: 关于栈的内容，不能理解的一个地方。

回复:
user: user-0
content: 引用 2 楼 bijiaoben 的回复:你这个递归调用了调用是3->2->1，然后打印顺序就是1->2->3了。楼主可以单步跟踪一下就明白了。 就是你的这段代码： int oneFewer = numberOfBottles - 1; printf("Take, p, %d bottles of beer on the wall.\n",oneFewer); singTheSong(oneFewer); printf("Put a bottle, %d empty bottles in the bin.\n",numberOfBottles);      我想我应该试理解了吧，是singTheSong 在递归的时候都进栈了，最后再一个个弹出来。    是这个意思吧？

user: user-0
content: 引用 2 楼 bijiaoben 的回复:你这个递归调用了调用是3->2->1，然后打印顺序就是1->2->3了。楼主可以单步跟踪一下就明白了。 就是你的这段代码： int oneFewer = numberOfBottles - 1; printf("Take, p, %d bottles of beer on the wall.\n",oneFewer); singTheSong(oneFewer); printf("Put a bottle, %d empty bottles in the bin.\n",numberOfBottles);   说的是这边往回走吗？

user: user-0
content: 引用 1 楼 user-2 的回复:这是递归，singTheSong一个个返回时，走的printf("Put a bottle,  学习编程，最好先学会单步调试  我会单步调试，也看到走printf("Put a bottle,但是后面的变量为什么会每次＋1这里不知道。 其次 谢谢

user: user-1
content: 你这个递归调用了调用是3->2->1，然后打印顺序就是1->2->3了。楼主可以单步跟踪一下就明白了。 就是你的这段代码： int oneFewer = numberOfBottles - 1; printf("Take, p, %d bottles of beer on the wall.\n",oneFewer); singTheSong(oneFewer); printf("Put a bottle, %d empty bottles in the bin.\n",numberOfBottles);

user: user-2
content: 这是递归，singTheSong一个个返回时，走的printf("Put a bottle,  学习编程，最好先学会单步调试
user-0 提问: 如何让fgetc读出字符而非ASCII码？如何读出全部？ 

回复:
user: user-1
content: 文件保存的只是数据而已，读写的意义需要自己维护。  引用 楼主 u013369463 的回复:

user: user-2
content: cout << (char)i

user: user-3
content: 楼主想问啥？

user: user-4
content: int i换成 char i;

user: user-5
content: 应加两行： #include <stdio.h> #include <stdlib.h> int main() {  FILE *f;  int i;   f=fopen("文档.txt","r");  while (1) {   i=fgetc(f);   if (i==EOF) break;   printf("%c",i);  }  fflush(stdout);  fclose(f);  system("pause");  return 0; }

user: user-5
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  #include <stdio.h> #include <stdlib.h> int main() {  FILE *f;  int i;  while (1) {   i=fgetc(f);   if (i==EOF) break;   printf("%c",i);  }  fflush(stdout);  system("pause");  return 0; } 摒弃cin、cout 使用scanf、printf
user-0 提问: c语言获取系统时间，并插入数据库

回复:
user: user-1
content: #include <windows.h> #include <stdio.h> MSDN里面的例子：可以参考下，smallint的格式不知道 void main() {     SYSTEMTIME st, lt;          GetSystemTime(&st);     GetLocalTime(<);          printf("The system time is: %02d:%02d\n", st.wHour, st.wMinute);     printf(" The local time is: %02d:%02d\n", lt.wHour, lt.wMinute); }

user: user-2
content: #include <stdio.h> #include <time.h> char tmpbuf[20];//YYYY-MM-DD hh:mm:ss void main() {     time_t aclock;      time(&aclock);     strftime(tmpbuf,20,"%Y-%m-%d %H:%M:%S",localtime(&aclock));     printf("%s\n",tmpbuf); }
user-0 提问: 解惑，小case

回复:
user: user-1
content: 一般头文件都会有防止重复包含的宏定义。两个都包含，要么是多人维护，写重了，但是由于防止重复包含的宏的存在，没有什么影响；要么就是有需要自己加了东西。 楼主可以试着保留库中的头文件看看编译运行有没有错，没错的话就把第一个去掉吧。

user: user-2
content: 前人不小心留下的代码累赘

user: user-3
content: 不会是自己定义的一个stdio.h跟系统的不一样？

user: user-4
content: 包含100次也没问题，因为里边已经防止重复包含了，当然包含这么多也没啥意义

user: user-5
content: 删除第一个。

user: user-6
content: 那说明程序写的不好！  引用 楼主 abc594986308 的回复:一个程序包含下面两个头文件，是一起包含 #include "stdio.h" #include <stdio.h> 我知道#include "stdio.h"是在当前目录下查找标准头文件 #include <stdio.h>是直接到库中去查找 但是同一个程序同时包含这两个头文件是怎么一回事啊？
user-0 提问: 怎么把a.txt和b.txt合到c。c.txt为什么打开失败

回复:
user: user-1
content: 看下errno是什么， windows里，用DWORD GetLastError(void);

user: user-2
content: 打开失败时, 看错误码吧.

user: user-3
content: system("copy a.txt+b.txt c.txt");
user-0 提问: 字符串翻转,出现Segmention fault, 怎么解决

回复:
user: user-0
content: 谢了 你说的是主要的问题, 刚发现另外一个问题,一开始while(*str++); 把str移到 '\0'后面去了 我str--;只做了一次,结果显示不出来了,改正了,另外改了一下其他地方  上代码 #include <stdio.h>  void reverse(char str[]) {     char *start = str;     char temp = ' ';      while(*str)         str++;       str--;      while (start < str) {         temp = *start;         *start = *str;          *str = temp;          start++;         str--;    }  }  int main() {     char str[] = "abcdefg";     reverse(str);     printf("%s\n", str); }

user: user-1
content: C 语言常见问题集 2.13 以下的初始化有什么区别？char a[] = "string literal"; char *p = "string literal"; 当我向 p[i] 赋值的时候, 我的 程序崩溃了。  字符串常量有两种稍有区别的用法。用作数组初始值 (如同在 char a[]  的声明中), 它指明该数组中字符的初始值。其它情况下, 它会转化为一个 无名的静态字符数组, 可能会存储在只读内存中, 这就是造成它不一定能被修改。 在表达式环境中, 数组通常被立即转化为一个指针  (参见第 6 章), 因此第二个声明把 p 初始化成 指向无名数组的第一个元素。 为了编译旧代码, 有的编译器有一个控制字符串是否可写的开关。  参见问题 1.11、 6.1、 6.2 和 6.6。  参考资料: [K&R2, Sec. 5.5 p. 104]; [ISO, Sec. 6.1.4, Sec. 6.5.7]; [Rationale, Sec. 3.1.4]; [H&S, Sec. 2.7.4 pp. 31-2]。
user-0 提问: socket编程遇到SIGPIPE(broken pipe)错误信号

回复:
user: user-1
content: SIGPIPE是正常的信号，对端断开后本端协议栈在向对端传送数据时，对端会返回TCP RST，导致本端抛出SIGPIPE信号。  所有的网络程序都应该sigprocmask主动屏蔽掉这个信号。

user: user-2
content: // 关闭服务器端连接到客户端的套接字         close(client_socket_fd);  //这个不需要的！链路已经半关闭了，TIME_WAIT

user: user-0
content: 引用 2 楼 missheaven2011 的回复:// 关闭服务器端连接到客户端的套接字  close(client_socket_fd);  这里你不就把服务端的套接字关闭掉了嘛，第二次肯定不行啦  对的，我把close(client_socket_fd);这行注释掉，客户端就可以多次发送消息，不报SIGPIPE了。  但是服务器端只读取到了第一条消息，如何让它不断读取客户端发送的消息

user: user-3
content: 引用 3 楼 haoren026 的回复:[quote=引用 2 楼 missheaven2011 的回复:]  // 关闭服务器端连接到客户端的套接字  close(client_socket_fd);  这里你不就把服务端的套接字关闭掉了嘛，第二次肯定不行啦  对的，我把close(client_socket_fd);这行注释掉，客户端就可以多次发送消息，不报SIGPIPE了。  但是服务器端只读取到了第一条消息，如何让它不断读取客户端发送的消息[/quote] // 接受连接 client_socket_fd = accept(socket_fd, (struct sockaddr*) &client_name, &client_name_len); accept函数导致第二次接收数据被堵塞，你可以将套接字设置为非阻塞，也可以将这个函数的调用提前，放在while循环外面

user: user-3
content: // 关闭服务器端连接到客户端的套接字  close(client_socket_fd);  这里你不就把服务端的套接字关闭掉了嘛，第二次肯定不行啦

user: user-4
content: 服务端第一次接收数据之后已经将该连接关闭了，但是客户端没有关闭，继续往这条链接发送数据，自然报SIGPIPE(Broken Pipe)了。
user-0 提问: 算法题。。略难。。求助高手。。

回复:
user: user-1
content: 还要扣掉重复的吧，貌似一次遍历过程中，算出当前连续匹配的长度是多少，扣除之即可...

user: user-2
content: n*(n+1)/2;

user: user-3
content: int count=0; for(int i=0;i<n;i++) count+=n-i;

user: user-4
content: 全组合问题，输出一个集合中所有的子集。
user-0 提问: 求判断数组连续个数的函数

回复:
user: user-1
content: 1）最大的，找到连续数，记录连续数个数，最大值即可。 2）每次遇到新连续数序列，保留最大值，大的那个。

user: user-2
content: 代码: long  GetCNum(int *x,int n) { 	if(NULL==x) return 0; 	int  pNum=*x; 	long count=1; 	long cMax=1; 	for(int i=1;i<n;i++) 	{ 		 pNum++;          if(*(x+i)==pNum) 		 { 			 count++; 		 } 		 else 		 { 			 if(cMax<count) cMax=count; 			 count=1; 			 pNum=*(x+i); 		 } 	} 	if(cMax<count) cMax=count; 	if(cMax==1) return 0; 	return cMax; }  测试: int main(int argc, char* argv[]) { 	     int n[8]={1,2,3,5,7,8,9,10};     int c=GetCNum(n,8); 	printf("最大连续数是:%d\n",c); 	retur 0; }

user: user-3
content: 噢，后面要加个return max;

user: user-3
content: 或者这么描述。设置两个变量，最大连续长度max, 当前连续长度cur, 两个都初始化为1，并认为数组的第一个元素已经被处理，从第二个元素开始处理。如果当前元素刚好比前一个元素多1，则++cur, 否则如果cur>max, 则max=cur, cur=1...重复以上直到数组结束，返回max   template <class Int, ForwardInter I> unsigned Streak(I first, I end) {      Int prev;      unsigned max=1, cur=1;      if(first==end)         return 0;      prev=*first++;      while(first!=end)      {          if(*first==++prev)             ++cur;          else{             if(cur>max)                 max=cur;             cur=1;             prev=*first;          }          ++first;      } }    没测试，大概意思到了吧。

user: user-4
content: 引用 10 楼 u010222864 的回复: 你觉得这个长度的计算是数组的长度吗？？那么sizeof(itestarray)/sizeof(*itestarray)又是什么呢？？ 恩，漏了，呵呵

user: user-5
content: 一定要注意这里的数组不是char类型的，一定要明白sizeof计算的是什么东西

user: user-5
content: 你觉得这个长度的计算是数组的长度吗？？那么sizeof(itestarray)/sizeof(*itestarray)又是什么呢？？

user: user-0
content: 引用 2 楼 thefirstz 的回复:把程序发上来，帮你看看 我的代码经过验证时错误的，只能从头数起。如1,2,3，4这样可判断，如果中间开始就不行了。

user: user-0
content: 引用 1 楼 gz_qmc 的回复:那么请问  1 2 3 5 7 8  你希望是得到3还是2啊 期望得到2，返回连续的最大值

user: user-6
content: 是你的代码有错求助还是想让兄弟们给你写一份代码啊？

user: user-4
content: int GetContinuum(int* piarray, int ilength) { 	int iRet = 1, itemp = 1; 	for(int i = 1; i < ilength; i++) 	{ 		if(piarray[i] == piarray[i - 1] + 1) 			itemp++; 		else 		{ 			if(itemp > iRet) iRet = itemp; 			itemp = 1; 		} 	} 	if(itemp > iRet) iRet = itemp; 	return iRet; }  int main(int argc, char* argv[]) { 	int itestarray[] = {1, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 22, 25}; 	printf("%d\n", GetContinuum(itestarray, sizeof(itestarray))); 	system("pause"); 	return 0; }  不知道行么，

user: user-7
content: 把程序发上来，帮你看看

user: user-2
content: 那么请问  1 2 3 5 7 8  你希望是得到3还是2啊
user-0 提问: 如何实现将变量依次传给函数？

回复:
user: user-1
content: 捧个人场总行吧。

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 derekrose 的回复:] 难道楼主不知道有个东西叫数组 估计还没学到。[/quote]  赵老师你回这种贴能得分吗

user: user-1
content: 引用 2 楼 derekrose 的回复:难道楼主不知道有个东西叫数组 估计还没学到。

user: user-2
content: 难道楼主不知道有个东西叫数组

user: user-3
content: char* s[N]; int*  p[N];  int i; for(i = 0; i < N; ++i) printout(s[i], p[i]);
user-0 提问: 计算机软硬件接口问题.汇编转换问题..望内力深厚高手解答

回复:
user: user-1
content: 编译，汇编过程中，绝对定位的，都要写在重定位表中。 链接后，应该还有重定位表，DOS实模式程序，必须有重定位表。  因为DOS实模式程序，加载的时候，才能定位程序。 加载程序会对 .exe,.com 做重定位。 Windows 32Bits  .exe加载时，重定位已经不是必须的了，不过应该，还保留着重定位表。

user: user-1
content: 不知道，有个重定位表么？ 不知道实模式，保护模式，虚拟86模式么？  一切加载时，不需要改变的，就直接编码； 加载时，需要改变的，就填充为0，并记录到重定位表中。  1）立即数，是不需要改变的，直接编码。 2）相对地址寻址指令的偏移量，计算好以后，不会改变，直接编码。 3）实模式，直接定位的绝对地址的，直接编码。    3.1）操作系统，必须加载到一个绝对地址，不能有分毫改变。    3.2）直接写屏，必须写到绝对地址，这个地址，不能有分毫改变。    3.3）不属于这种直接定位的，绝对地址寻址的指令的操作数，进入重定位表。  4）随着加载变化的，进重定位表，就是3.3）那种情况，这里强调一下。    主要有绝对地址寻址，绝对跳转，调用地址。    包括一些加载段内偏移量，段地址的代码。  5）32Bits，DLL可能需要重定位，绝对地址，记录到重定位表中；    而导入导出函数，或者导入导出数据，记录在导入导出表中。 6）32Bits，exe,使用的每个动态库，包括系统动态库，里面的导出符号，在 exe的导入表中。    内部绝对定位数据（包括全局变量，跳转地址，调用地址），编译时，记录到重定位表中。    链接时，Windows 可能已经不需要重定位了，直接写成绝对地址就可以了。    不过不排除，重定位表，还保存在exe中的可能。     Windows Win32 程序，每个exe 都可以从同一个地址启动，缺省就是 0x400000；    即虚拟地址的4MBytes位置；    这是VC的缺省设置,这个地址好像是可以改变的。    因为进程地址空间是互相隔离的，所以链接以后，基本可以不必重定位。

user: user-2
content: 1.这是16位汇编,寻址是物理地址,32位x86汇编是虚拟地址,寄存器是eax等 2.jmp label,实际上的指令是跳转到前面多少行,属于相对寻址,所以首地址加载哪里都不会错

user: user-3
content: 汇编器产生的地址从0开始 你说是什么地址？   操作系统才能碰到物理地址，其余的都碰不到

user: user-4
content: 汇编里面，每一个语句占用的内存的大小是固定已知的。 Label前面有多少个语句，算算就能知道Label所在位置的偏移是多少了。

user: user-5
content: 《Windows PE权威指南》 《程序员的自我修养——链接、装载与库》

user: user-0
content: 汇编区貌似人很少，还望各位大大帮忙解答下心中疑惑
user-0 提问: 宏定义会分配内存吗？

回复:
user: user-1
content: #define STRING "abcd" #define NUMBER 1  如果没用到 STRING, 那么这个宏定义相当于没定义, 不产生任何运行时的内存分配.  如果用到了, 并且在多个地方用到了, 内存如何分配要看使用场景和编译器了.  cons char* psz  = STRING; char szbuf[] = STRING;

user: user-2
content: 不会  在编译时候才会分配

user: user-3
content: 不会！预编译期完成的事情！还没运行！

user: user-4
content: 楼主，我这么跟你解释：  宏，只是简单的复制、替换。  #define NUMBER 1 那么，凡是你代码中有 NUMBER 这个标识的，都会被替换成1，你代码编写的时候，没有编译的时候，是不占用空间的，但是，如果你代码编译运行了，就可能要占空间了。 比如说  #define STRING "abcd"  就需要存储在文字常量区

user: user-5
content: 不会的

user: user-6
content: 1.编译后放在常量数据区 2.不会

user: user-7
content: 不会。 "abcd"那是在编译期才去处理的东西

user: user-8
content: 会让编译器（比如gcc,g++,cl,……）在编译时分配内存。

user: user-9
content: 宏定义只是在预处理器里进行文本替换

user: user-10
content: 错！abcd还不存在呢。

user: user-11
content: 宏是在编译期间起作用，还没到运行期间，所以没有内存分配这个说法
user-0 提问: 代码中有很多设置窗口或控件大小的代码，这些代码都是直接用数字来描述的。想要好一点的风格，应如何处理这些代码呢?

回复:
user: user-1
content: 引用 楼主 huabinsir 的回复:代码中有很多设置窗口或控件大小的代码，这些代码都是直接用数字来描述的。想要好一点的风格，应如何处理这些代码呢?(是将数字定义成宏，再使用宏?)  要你擦屁股啊

user: user-2
content: 使用宏比如#define WINDOWS_WIDTH 800再使用编辑器的串替换功能比如将代码中表示窗口像素宽度的800替换为WINDOWS_WIDTH。

user: user-0
content: 我主要是问步骤过程（比如:宏是定义在一个公共文件中还是其它地方. 数字有很多，不是要很多宏吗?  很多数字 很多宏，不是一样眼花吗?）

user: user-0
content: 过程要如何实现呢? (我主要是问过程)

user: user-3
content: 思路正确！将数字定义成宏，再使用宏。  引用 楼主 huabinsir 的回复:代码中有很多设置窗口或控件大小的代码，这些代码都是直接用数字来描述的。想要好一点的风格，应如何处理这些代码呢?(是将数字定义成宏，再使用宏?)

user: user-4
content: 把数字定义成宏

user: user-0
content: 我其实是想了解一下有什么好的方法和思路.

user: user-2
content: 引用 6 楼 xihu1364 的回复:[quote=引用 楼主 huabinsir 的回复:] 代码中有很多设置窗口或控件大小的代码，这些代码都是直接用数字来描述的。想要好一点的风格，应如何处理这些代码呢?(是将数字定义成宏，再使用宏?)  要你擦屁股啊[/quote] 根据帖主的头像来看，不仅要擦屁股，还要穿裤子。

user: user-2
content: 宏当然是放在一个头文件中了。 参考include\limits.h

user: user-2
content: 引用 4 楼 huabinsir 的回复:我主要是问步骤过程（比如:宏是定义在一个公共文件中还是其它地方. 数字有很多，不是要很多宏吗?  很多数字 很多宏，不是一样眼花吗?） 那还真不一定： 800 600 80 256 和 WINDOW_WIDTH WINDOW_HEIGHT CHARS_PERLINE CHARS_INPATH 哪个更花？
user-0 提问: 请教一个问题，如何把TXT中的内容保存到链表中，TXT格式和链表已经定义好

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:写链表到是简单  文件解析比较麻烦  文件分析的代码我写了一个，链表操作有些难度，关于链表操作的部分都在main函数中 #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h>  const char *file = "conf.txt"; typedef struct _ConfElement{    char *pszkey;       char *pszvalue;     struct _ConfElement * next; }CONF_ELEMENT;  typedef struct _ConfSection{     char * pszSection;          struct CONF_ELEMENT * pszConfElement;     struct _ConfSection * next; }CONF_SECTION;  char *strtrimr(char *pstr); char *strtriml(char *pstr); char *strtrim(char *pstr); int get_item_from_line(char *line,CONF_SECTION *confSection);  /* *去除字符串右端空格 */ char *strtrimr(char *pstr) { 	int i; 	i = strlen(pstr) - 1; 	while (isspace(pstr[i]) && (i >= 0)) 	pstr[i--] = '\0'; 	return pstr; } /* *去除字符串左端空格 */ 	char *strtriml(char *pstr) { 	int i = 0,j; 	j = strlen(pstr) - 1; 	while (isspace(pstr[i]) && (i <= j)) 	i++; 	if (0<i) 	strcpy(pstr, &pstr[i]); 	return pstr; } /* *去除字符串两端空格 */ char *strtrim(char *pstr) { 	char *p; 	p = strtrimr(pstr); 	return strtriml(p); }  /* *从配置文件的一行读出key或value,返回item指针 *line--从配置文件读出的一行 */ int get_item_from_line(char *line,CONF_SECTION *confSection) { 	char *p = strtrim(line); 	int len = strlen(p); 	if(len <= 0){ 		return 1;//空行 	} else if(p[0]=='#'){ 	return 2; 	}else{ 		char *p2 = strchr(p, '='); 		*p2++ = '\0'; 		//confSection->pszConfElement->pszkey = (char *)malloc(strlen(p) + 1); 		//confSection->pszConfElement->pszvalue = (char *)malloc(strlen(p2) + 1); 		confSection->pszConfElement->pszKey=p; 		confSection->pszConfElement->pszValue=p2; 		//strcpy(confSection->pszConfElement->pszKey,p); 		//strcpy(confSection->pszConfElement->pszValue,p2);      		} return 0;//查询成功 }  int main(void)  {    FILE *fp;    char line[1024];   fp = fopen("conf.txt","r");    fseek(fp, 0, SEEK_SET);//指针指向文件头部       while (fgets(line, 1023, fp)){ 		//printf("%s\n",line); 		char *p = strtrim(line); 		if (p[0]=='<') 		{ 			strcpy(p,p+1);	 			int nLen = strlen(p); 			if(p[nLen-1]=='>') 			{ 			   p[nLen-1]='\0'; 			}				 			/*                         这部分要生成一个新的CONF_SECTION类型的链表，存储尖括号里的字符串                          */                          //confSection->pszSection=p; 			//printf("%s\n",confSection->pszSection); 							 		} 		else 		{                          /*这里把尖括号下面的内容存储到CONF_ELEMENT类型的链表中*/ 			//get_item_from_line(line,confSection); 		} 	} }

user: user-1
content: 写链表到是简单  文件解析比较麻烦

user: user-0
content: 引用 1 楼 user-1 的回复:原理很简单,可是说来话长啊  我现在处于能把过程想明白（就像你说的原理简单一样）具体的代码操作写不出来的阶段，比如链表里面套链表怎么写，怎么破？

user: user-1
content: 原理很简单,可是说来话长啊
user-0 提问: 数组初始化问题，非常不科学的现象！！

回复:
user: user-0
content: 引用 17 楼 lelieven 的回复:水平太差，不懂这么高深的问题，惭愧啊，惭愧！  你这人反话正说，小人一个。 我给你直话直说：  你意思就是这个问题太简单，让你这个“大牛”都不屑对吧？  我拿你和 15楼作比较吧：  你只会说： “你基础差！” “太高深” 这样的话，你看看人家15楼的，多实在，一个问题三四句话解释的一清二楚，哪像你只知道说简单，却说不出个道道，还老装B，鄙视你这种货色！    其实你技术能力、学习能力一定比我差，从你说话就看得出你这人水平不高。

user: user-0
content: 引用 17 楼 lelieven 的回复:水平太差，不懂这么高深的问题，惭愧啊，惭愧！[/quote]  我发现你这人特喜欢装B，你瞧瞧人家15楼，哎……你哪点比得上人家？你以为你牛？装逼就会让别人认为你牛？难怪好多其他行业的人瞧不起我们程序员，说程序员最爱装13，就是因为你这样的人害了整个行业的名声

user: user-1
content: 引用 13 楼 u011642451 的回复:[quote=引用 11 楼 lelieven 的回复:] [quote=引用 楼主 u011642451 的回复:] 我非常疑惑的一个问题：  unsigned short Arry[256] = {2047};  这样定义数组 Arry 并初始化，想将所有元素都初始化为 2047，可是，结果却是第一个元素为 2047，其余的所有元素都是 0， 这不科学！！  谁帮我解释一下！语法就是这样，是你基础太差！[/quote]  [/quote]水平太差，不懂这么高深的问题，惭愧啊，惭愧！

user: user-0
content: 引用 15 楼 cjfdqchwh 的回复:其实这个问题，即使是有经验的程序员也容易犯，本人曾经犯过这个错。  以前一直以为 int a[256]={0};是把a的所有元素初始化为0，int a[256]={2047};是把a所有的元素初始化为2047. 其实不是这样的。如果初始化时指定的的元素个数比数组大小少，剩下的元素都回被初始化为 0。例如       int   Arry[8]={1,2,3,4}; 那么等效的是       int Arry[8]={1,2,3,4,0,0,0,0};  您的回复最赞！那些装13的，只会说我基础差，意思就是他厉害呗，结果他又说不出个道道来，鄙视这个货色

user: user-2
content: 其实这个问题，即使是有经验的程序员也容易犯，本人曾经犯过这个错。  以前一直以为 int a[256]={0};是把a的所有元素初始化为0，int a[256]={2047};是把a所有的元素初始化为2047. 其实不是这样的。如果初始化时指定的的元素个数比数组大小少，剩下的元素都回被初始化为 0。例如       int   Arry[8]={1,2,3,4}; 那么等效的是       int Arry[8]={1,2,3,4,0,0,0,0};

user: user-0
content: 既然这个问题你都说简单，却不能够一两句明白话说个明白，那就不要装13说我基础差什么什么的，我不懂，我不装13

user: user-0
content: 引用 11 楼 lelieven 的回复:[quote=引用 楼主 u011642451 的回复:] 我非常疑惑的一个问题：  unsigned short Arry[256] = {2047};  这样定义数组 Arry 并初始化，想将所有元素都初始化为 2047，可是，结果却是第一个元素为 2047，其余的所有元素都是 0， 这不科学！！  谁帮我解释一下！语法就是这样，是你基础太差！[/quote]

user: user-0
content: 引用 10 楼 AfterSeptember 的回复:别捉急了，找本书看一下不会少块肉的。 我手边一本《C++ Primer》，经常翻阅……  您既然懂这个问题，就指教一下呗

user: user-1
content: 引用 楼主 u011642451 的回复:我非常疑惑的一个问题：  unsigned short Arry[256] = {2047};  这样定义数组 Arry 并初始化，想将所有元素都初始化为 2047，可是，结果却是第一个元素为 2047，其余的所有元素都是 0， 这不科学！！  谁帮我解释一下！语法就是这样，是你基础太差！

user: user-3
content: 别捉急了，找本书看一下不会少块肉的。

user: user-0
content: 引用 7 楼 derekrose 的回复:楼主，要相信科学  你能帮我解释一下，这是为什么吗？这么初始化怎么就不行了呢？

user: user-0
content: 引用 7 楼 derekrose 的回复:楼主，要相信科学 所以，我正等着你告诉我什么是科学呀

user: user-4
content: 楼主，要相信科学

user: user-0
content: 引用 3 楼 lin5161678 的回复:[quote=引用 1 楼 user-8 的回复:] 如果有全部初始化，也可以，你写 unsigned short Arry[256] = {2047,2047,....2047}; 总共256个就可以了  通常做法是memset进行初始化memset没这么申请 不可能初始化出 2047的[/quote]  这是为什么呢？为什么不能初始化为 2047，或 2046 等等呢？

user: user-0
content: 引用 2 楼 xyzinfernity 的回复:数组的基础语法你都没看？这怎么不科学了？ 你既然看了，那你讲讲看呀！

user: user-5
content: 貌似只有{0}是指全部初始化为0，其它就不是这样了

user: user-6
content: 引用 1 楼 user-8 的回复:如果有全部初始化，也可以，你写 unsigned short Arry[256] = {2047,2047,....2047}; 总共256个就可以了  通常做法是memset进行初始化memset没这么申请 不可能初始化出 2047的

user: user-7
content: 数组的基础语法你都没看？这怎么不科学了？

user: user-8
content: 如果有全部初始化，也可以，你写 unsigned short Arry[256] = {2047,2047,....2047}; 总共256个就可以了  通常做法是memset进行初始化
user-0 提问: 指针数组作为参数的问题

回复:
user: user-1
content: 1楼说的对，直接把sizeof(str)打印出来看一下就清楚了，

user: user-2
content: 首先指针类型的长度（sizeof）都是4（32位系统）。但是str和p都是指针数组，即数组中的每个元素都是一个指针，那么sizoef(str)/sizeof(char *) = (5 * 4) / 4 = 5

user: user-3
content: 数组做参数时与指针相同 所以sizeof(str)/sizeof(char *) = sizeof(char **)/sizeof(char *) = 1
user-0 提问: 求帮忙理解程序

回复:
user: user-1
content: 通常不这样定义，而且那个3也没有什么意义。可以用int*代替，再加上一个表示数组元素个数的参数

user: user-2
content: 调用的时候知道传入的长度为3的int数组，和使用int js(int *n)是一样的效果。 如果你在使用的时候传一个长度大于3的int数组给它，也不会报错或警告
user-0 提问: 指针变量自增

回复:
user: user-0
content: 引用 12 楼 oYinGui1 的回复:看你的指针是什么类型的，然后再sizeof一下。 恩

user: user-0
content: 引用 9 楼 cfjtaishan 的回复:指针类型变量的自增或自减跳过（或者说偏移的内存单元）跟该指针变量的类型有关的。 头像很帅呀

user: user-0
content: 引用 14 楼 bijiaoben 的回复:[quote=引用 楼主 u011642451 的回复:] char *pCh;  pCh++;  short *pS;  pS++;  long *pL;   pL++;  double *pD; pD++;  请问，这些指针值++，是加1， 还是加多少？ 指针的类型决定了指针自增时候的步长。楼主还可以用结构体类型的指针试试看，效果更加明显[/quote] 恩，我现在明白了。 再请问您： 这是不是 C/C++ 的规则？是不是所有C/C++编译器都支持这个规则？

user: user-1
content: 引用 楼主 u011642451 的回复:char *pCh;  pCh++;  short *pS;  pS++;  long *pL;   pL++;  double *pD; pD++;  请问，这些指针值++，是加1， 还是加多少？ 指针的类型决定了指针自增时候的步长。楼主还可以用结构体类型的指针试试看，效果更加明显

user: user-2
content: 根据指针的类型增加相应的空间的。你可以把地址输出，自己对比下就知道了。

user: user-3
content: 引用 18 楼 cjfdqchwh 的回复:指针变量自增，是按照指针变量的类型来自增的。  楼主你想呀： 指针变量存放的是一个地址值，如果指向一个 double 类型的数组的地址： double Double_arry[]; double *p = &Double_arry;  p++ 等效于 p = p + sizeof(double);  楼上正解

user: user-4
content: 指针变量自增，是按照指针变量的类型来自增的。  楼主你想呀： 指针变量存放的是一个地址值，如果指向一个 double 类型的数组的地址： double Double_arry[]; double *p = &Double_arry;  p++ 等效于 p = p + sizeof(double);

user: user-5
content: 看你的指针是什么类型的，然后再sizeof一下。

user: user-0
content: 引用 6 楼 lin5161678 的回复:+ sizeof *指针名 哦，原来如此

user: user-0
content: 引用 3 楼 a345485527 的回复:对指针进行加减操作，加的是指针指向类型的字节数 恩，讲的很明了

user: user-6
content: 指针类型变量的自增或自减跳过（或者说偏移的内存单元）跟该指针变量的类型有关的。

user: user-7
content: 指针增加其实是内存中位置的变化，我觉得计算机组成原理可以帮你理解指针增加是怎么回事

user: user-8
content: +sizeof(指针指向的类型)，比如char*,一次加1，int*一次加4。自己定义一些不同类型的数组，然后在定义对应的一个指针指向数组，调试一下就明白了

user: user-9
content: + sizeof *指针名

user: user-10
content: 想快速知道答案 自己测试一下  先真正得到答案 看c和指针

user: user-11
content: 我想说的已经被3楼说完了

user: user-12
content: 对指针进行加减操作，加的是指针指向类型的字节数

user: user-13
content: 1 2 4 8

user: user-0
content: 为什么，我已经写了测试程序，发现指针自增，是有“智能”……反正就这个意思
user-0 提问: 越是简单的问题，越是看不出来！！！

回复:
user: user-0
content: 嗯  谢谢。以后错误都自己断点调试了。真得很好用

user: user-0
content: 断点输出是正常的，整个运行就没有第一行的7个*。

user: user-1
content: xcode是用gdb调试吗？我没用过。

user: user-2
content: #include <stdio.h> /* Parameter: level => the level count of the upside down triangle */ void print(int level) {     int i, space, star, totalLevel = level*2 - 1;          for(i = 0; i < totalLevel; ++i){         /* figure out how many leading spaces and stars in this level */         if(i < level) space = i;         else space = totalLevel-1 - i;         star = (level - space) * 2 - 1;                  /* print leading spaces */         for(; space > 0; --space) putchar(' ');                  /* print stars */         for(; star > 0; --star)   putchar('*');                  /* new line */         putchar('\n');     } }  int main() {     int level = 4;          print(level);          return 0; }

user: user-0
content: 引用 1 楼 user-4 的回复:vs2005测试通过，输出正常    我用的xcode   但是输出不行

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。  嗯，谢谢提醒。  但是我打断点运行显示i=0时   下面的for循环j=0 到j=7  中间运行了7次啊

user: user-3
content: 输出这么一个图形你for,用了3次，而且还嵌套。写代码要养成良好习惯。

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-4
content: vs2005测试通过，输出正常
user-0 提问: 关于“为节省内存进行连续图像的压缩”

回复:
user: user-0
content: 这里有个限制条件不能忽视，我需要能确定最终的结果大小。 比如对这50帧连续二值图像，不管它的信息冗余度多大，我都可以用7个byte类型的原图像大小的空间来存储全部信息。 但是7个图像大小仍太大，我想压到2或者3个，how？

user: user-1
content: 引用 11 楼 linfeng_hebut 的回复:这里有个限制条件不能忽视，我需要能确定最终的结果大小。 比如对这50帧连续二值图像，不管它的信息冗余度多大，我都可以用7个byte类型的原图像大小的空间来存储全部信息。 但是7个图像大小仍太大，我想压到2或者3个，how？   你用固定一幅图像的大小，放50帧原始图压缩后的结果，99.9%的情况下都够了。  如果你非说要保证100%的情况下都要够，那7个图像大小就是极限了。

user: user-2
content: 另外JPG格式的无损压缩，据说，可以吧一帧数据，压缩到%50 有损压缩更高。JPG是有损压缩，和无损压缩的结合。

user: user-2
content: 帧间差别大，就换个帧重新处理后面各帧的数据 帧间差别不大，保存首帧，帧内信息冗余大的话，首帧也可以压缩 然后对后面各帧，只对帧差进行压缩  RLE+ 种行编码 压缩率应该很高。 只用RLE，估计效果也很好。

user: user-3
content: 引用 3 楼 linfeng_hebut 的回复:呃……都很精干啊！ RLE学习了一下，思想不错，可觉得我这种情况不适用。至于mpeg，还是算了吧 希望有人启发一下思路，我现在是缩到了7帧，8帧图像作为一组，得到的二进制数进行十进制转换，8位的和最大255.那么50帧图像就是分7组。在取图像值时再反换算。 还有没有其他的更好思路呢？  不是很明白你说的？ 是不是就是把原来保存到1个byte中的0，1， 保存到 一个bit中？ 如果这个理解没错的话，这个不算图像压缩吧，理论上应该就是这么保存的吧。  mpeg理解起来太难了， 可以与RLE结合 做一个类似的， 但是效果可能要取决于实际数据吧  第一帧的数据 都保存 （如果有大片的黑白，可以采用RLE） 第二帧数据， 保存 跟 第一帧的差分，并且采用RLE的方法 #如果只有极少部分像素变化，应该还是比较有效 第三帧，第四帧，以此类推   问题的关键是， 前后帧之间差别大不大。

user: user-2
content: 错了是MPEG 动态图像

user: user-2
content: 这个采用Jpeg存储就差不多了。 看看Jpeg是怎么压缩的。 你只要保存变化就可以了

user: user-0
content: 引用 4 楼 baipv008 的回复:如果是二值图，自己写个游程码压缩估计就行。（简单说就是一串N个0用两个值(0,N)表示就行。1同理） 这种方法和RLE类似都不能事先知道压缩结果是多大吧 我做的这个库需要静态分配内存，需要能确定压缩结果的size

user: user-1
content: 如果是二值图，自己写个游程码压缩估计就行。（简单说就是一串N个0用两个值(0,N)表示就行。1同理）

user: user-0
content: 呃……都很精干啊！ RLE学习了一下，思想不错，可觉得我这种情况不适用。至于mpeg，还是算了吧 希望有人启发一下思路，我现在是缩到了7帧，8帧图像作为一组，得到的二进制数进行十进制转换，8位的和最大255.那么50帧图像就是分7组。在取图像值时再反换算。 还有没有其他的更好思路呢？

user: user-4
content: mpeg .

user: user-5
content: RLE GIF89a
user-0 提问: 表示整数的高2字节和低2字节

回复:
user: user-1
content: union {   int32_t int_member;   uint8_t char_member[4]; }  然后搞个宏判断大小端。

user: user-2
content: 引用 2 楼 turingo 的回复:unsigned int a = 56505; unsigned short int b = (a >> 16) & 0xffff; //高2字节 unsigned short int c = a & 0xffff; //低2字节  [quote=引用 楼主 xiadun 的回复:] 有一个32位整数如：65606 如何表示它的高2字节和低2字节[/quote] ++  地址要分大小端 简单的移位运算，就不需要了分大小端。 平台自己会处理好这个问题的。

user: user-3
content: int i=65606; printf("%04X %04X",((unsigned short *)&i)[1],((unsigned short *)&i)[0]);//小端内存 printf("%04X %04X",((unsigned short *)&i)[0],((unsigned short *)&i)[1]);//大端内存

user: user-4
content: 引用 2 楼 turingo 的回复:unsigned int a = 56505; unsigned short int b = (a >> 16) & 0xffff; //高2字节 unsigned short int c = a & 0xffff; //低2字节  [quote=引用 楼主 xiadun 的回复:] 有一个32位整数如：65606 如何表示它的高2字节和低2字节[/quote] unsigned int a = 56505; unsigned short int b = *(（unsigned short*）&a); //高2字节 unsigned short int c = *((（unsigned short*）&a) + 1); //高2字节

user: user-5
content: unsigned int a = 56505; unsigned short int b = (a >> 16) & 0xffff; //高2字节 unsigned short int c = a & 0xffff; //低2字节  引用 楼主 xiadun 的回复:有一个32位整数如：65606 如何表示它的高2字节和低2字节

user: user-6
content: 要分大小端吧
user-0 提问: stdout与\n的问题.

回复:
user: user-1
content: for (;;); 这是要干嘛

user: user-2
content: 标准输出是行缓冲，\n换行刷新缓冲区

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-4
content: 引用 4 楼 qq120848369 的回复:标准C的IO库输出到终端默认行缓冲。默认实现定义 没默认行缓冲

user: user-5
content: 标准C的IO库输出到终端默认行缓冲。

user: user-6
content: #include <stdio.h>  int main() { printf("hello,yaoyao"); fflush(stdout); for (;;); return 0; }
user-0 提问: CE搜索内存数据的原理

回复:
user: user-1
content: 支持一下，，

user: user-2
content: 搜索是带有过滤条件的

user: user-3
content: 有参考价值，mask一下。

user: user-4
content: 为什么看到你们这群大神，我总有一种无力感！！！想问一下   你们都从事这一行业多久了？

user: user-5
user-0 提问: c语言读取txt文件

回复:
user: user-1
content: 才大一,学个鸟的C语言 等毕业再说

user: user-2
content: 反正看了3楼代码觉得自己又涨姿势

user: user-2
content: scanf遇到换行时不就结束了吗，难道就为了获得第一个字符？

user: user-3
content: #include<stdio.h> int main(){   FILE *fp;   int data,max,min;     fp=fopen("data.txt","r");/*假定文件名为data.txt   fscanf(fp,"%d",&max);   min=max;   while(!feof(fp)){     fscanf(fp,"%d",&data);     if(max<data)max=data;     if(min>data)min=data;   }   printf("max=%d\n",max);   printf("min=%d\n",min);   return 0; }

user: user-4
content: fsacnf() 方法不好, 因为你并不知道文件到底有多在,  LZ, 给你个思路, 先确定文件大小, 分配读取次数(如果文件小,这步可以不做), 读取一次, 排序一次, 读完为止 (  少年 不要做伸手党 要自己去实现才能有提升)

user: user-5
content: 3#写的很详细，不知道scanf能不能自动换行, 其实像这样的用fstream可以很容易实现,在网上一搜，例程也有很多的。

user: user-6
content: 哪里比较困难？

user: user-7
content: 设置一个数组 然后打开文件 之后可以用fsacnf()或者其他的函数读取出其中的数据 存入数组中 然后遍历数组 比较 找出最大最小值  少年 不要做伸手党 要自己去实现才能有提升
user-0 提问: 新年第一帖：有关\r和\n的区别

回复:
user: user-1
content: 引用 3 楼 mcmay 的回复:[quote=引用 1 楼 thefirstz 的回复:] \r指return，光标会回到该行的最前面，\n指newline，光标会前进到下一行，但位置不一定是最前面，而是上一行光标所在的那个位置，对于以前的打印机，如果想从新一行开头重新打印，就需要这两个一起使用 现在不同的操作系统对两者的处理不同，有的只需要\n，有的需要两者合用 谢谢，thefirstz。光标不一定在最前面，那在哪里？没有一个固定的位置吗？如何验证这一点呢？[/quote] 比如上一行的光标在第40个字符处，\n会让光标还在下一行的第40字符处，不会回到第一个字符即行开始的地方

user: user-0
content: 引用 1 楼 thefirstz 的回复:\r指return，光标会回到该行的最前面，\n指newline，光标会前进到下一行，但位置不一定是最前面，而是上一行光标所在的那个位置，对于以前的打印机，如果想从新一行开头重新打印，就需要这两个一起使用 现在不同的操作系统对两者的处理不同，有的只需要\n，有的需要两者合用 谢谢，thefirstz。光标不一定在最前面，那在哪里？没有一个固定的位置吗？如何验证这一点呢？

user: user-2
content: 楼上正解，具体情况具体分析，C语言里有时也同时使用

user: user-1
content: \r指return，光标会回到该行的最前面，\n指newline，光标会前进到下一行，但位置不一定是最前面，而是上一行光标所在的那个位置，对于以前的打印机，如果想从新一行开头重新打印，就需要这两个一起使用 现在不同的操作系统对两者的处理不同，有的只需要\n，有的需要两者合用

user: user-0
content: 引用 6 楼 user-6 的回复:\r 本行的行首！ \n 换行！ 版主正解！我是学了后面的，忘了前面的，该打！

user: user-3
content: 引用 6 楼 user-6 的回复:\r 本行的行首！ \n 换行！ 版主高手一针见血

user: user-4
content: 控制符，还是看当前编译器的说明比较好

user: user-5
content: 引用 5 楼 mcmay 的回复:[quote=引用 4 楼 thefirstz 的回复:] [quote=引用 3 楼 mcmay 的回复:] [quote=引用 1 楼 thefirstz 的回复:] \r指return，光标会回到该行的最前面，\n指newline，光标会前进到下一行，但位置不一定是最前面，而是上一行光标所在的那个位置，对于以前的打印机，如果想从新一行开头重新打印，就需要这两个一起使用 现在不同的操作系统对两者的处理不同，有的只需要\n，有的需要两者合用 谢谢，thefirstz。光标不一定在最前面，那在哪里？没有一个固定的位置吗？如何验证这一点呢？[/quote] 比如上一行的光标在第40个字符处，\n会让光标还在下一行的第40字符处，不会回到第一个字符即行开始的地方[/quote] 我试验了一下，好像光标还是去到了下一行的行首。 #include <stdio.h> #include <stdlib.h>  int main(int argc, char *argv[]) {   printf("This is a test of the escape sequence of \'\\n\'.\n");   getch();   //system("PAUSE");   return 0; }[/quote]  现在不同的操作系统对两者的处理不同，有的只需要\n，有的需要两者合用

user: user-6
content: \r 本行的行首！ \n 换行！

user: user-0
content: 引用 4 楼 thefirstz 的回复:[quote=引用 3 楼 mcmay 的回复:] [quote=引用 1 楼 thefirstz 的回复:] \r指return，光标会回到该行的最前面，\n指newline，光标会前进到下一行，但位置不一定是最前面，而是上一行光标所在的那个位置，对于以前的打印机，如果想从新一行开头重新打印，就需要这两个一起使用 现在不同的操作系统对两者的处理不同，有的只需要\n，有的需要两者合用 谢谢，thefirstz。光标不一定在最前面，那在哪里？没有一个固定的位置吗？如何验证这一点呢？[/quote] 比如上一行的光标在第40个字符处，\n会让光标还在下一行的第40字符处，不会回到第一个字符即行开始的地方[/quote] 我试验了一下，好像光标还是去到了下一行的行首。 #include <stdio.h> #include <stdlib.h>  int main(int argc, char *argv[]) {   printf("This is a test of the escape sequence of \'\\n\'.\n");   getch();   //system("PAUSE");   return 0; }