Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: Window编程闪屏, 换双缓冲就显示白屏问题,求教,谢谢

回复:
user: user-0
content: 我刚上CSDN,分值不够,我选择了平均分,希望两位朋友别生气.

user: user-0
content: 多谢上面两位朋友的回答,仔细的查看了一下, HDC 声明有错, Case 块 差 {} ,然后就是ReleaseDC出错,改正后就出来了, 在次感谢.

user: user-1
content: 在WM_CREATE里面有多次ReleaseDC, 没看到getdc, 这个hdc怎么来的

user: user-2
content: 请判断每个函数调用的返回值。必要时GetLastError
user-0 提问: 自学新手小白求助,编了个简单代码不知道哪里错了

回复:
user: user-0
content: 引用 4 楼 赵4老师的回复:每行的后面都有'\n'，区别是在新的一段开头有空格，我觉得。 可是我程序里就是\n啊，有没有什么其他能表示段的方法呢，因为万一我英文文档每段前面没有空格呢？

user: user-1
content: 每行的后面都有'\n'，区别是在新的一段开头有空格，我觉得。

user: user-2
content: 引用 1 楼 D_CHRIS 的回复:这是程序 #include <stdio.h> #include <stdlib.h> void main() { 	FILE *fp1, *fp2; /*定义两个指向FILE类型结构体的指针变量*/ 	char filename1[50],filename2[50],ch;   	long paragraph;  	paragraph=0;  	printf("Enter file name \n"); 	scanf("%s", filename1); /*输入要进行统计的文件的路径及名称*/ 	if((fp1=fopen(filename1, "r"))==NULL)  	{ 		printf("cannot open file.\n"); 		exit(1); 	} 	printf ( "Enter file name for write data:\n"); 	scanf("%s",filename2); /*输入文件名即将统计结果放到那个文件中*/ 	if((fp2=fopen(filename2, "w"))==NULL) /*已可写方式要存放统计结果的文件*/ 	{ 		printf("cannot open file \n"); 		exit(1); 	} 	while((ch=fgetc(fp1))!=EOF) /*知道文件内容结束处停止while循环*/ 		ch=fgetc(fp1); 		if(ch=='\n')  			paragraph++;	 		fclose(fp1);  		fprintf(fp2,"paragraph:%ld \n", paragraph); /*将统计结果写入fp指向的磁盘文件中*/ 		 }  windows中的文件换行符是\r\n

user: user-1
content: \n 和 /n 不是一回事！  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 这是程序 #include <stdio.h> #include <stdlib.h> void main() { 	FILE *fp1, *fp2; /*定义两个指向FILE类型结构体的指针变量*/ 	char filename1[50],filename2[50],ch;   	long paragraph;  	paragraph=0;  	printf("Enter file name \n"); 	scanf("%s", filename1); /*输入要进行统计的文件的路径及名称*/ 	if((fp1=fopen(filename1, "r"))==NULL)  	{ 		printf("cannot open file.\n"); 		exit(1); 	} 	printf ( "Enter file name for write data:\n"); 	scanf("%s",filename2); /*输入文件名即将统计结果放到那个文件中*/ 	if((fp2=fopen(filename2, "w"))==NULL) /*已可写方式要存放统计结果的文件*/ 	{ 		printf("cannot open file \n"); 		exit(1); 	} 	while((ch=fgetc(fp1))!=EOF) /*知道文件内容结束处停止while循环*/ 		ch=fgetc(fp1); 		if(ch=='\n')  			paragraph++;	 		fclose(fp1);  		fprintf(fp2,"paragraph:%ld \n", paragraph); /*将统计结果写入fp指向的磁盘文件中*/  }
user-0 提问: C语言的字符串指针问题

回复:
user: user-1
content: 首先你要明白你的s定义的是一级指针，而s作为数组的时候，s是一个地址，s表现为一级指针的地址，s➕1也是一个一级指针的地址，此时接受的变量需要是二级指针。二级指针对应一级指针的地址…………………分隔符，我也正在学习中，不知道该回答是否满意，如有错误请指正，谢谢

user: user-2
content: s是指针数组名 其值为s[0]的地址 s[0]是"abcfd"的起始地址，指向char型 所以s指向 "指向char型的指针"

user: user-0
content: 我自己搞明白了。因为str本身就是一个地址，存放的是字符串首元素地址，也就是指向地址的地址，自然要用二级指针来指向。str存放的就是字符串welcome的地址，str+1存放的就是字符串to的地址，str+2存放的就是字符串chaozhou的地址。这里有个结论，str=&str[0]，也就是说字符串的地址就是字符串首元素地址的地址。谢谢各位的解答。

user: user-3
content: 数组名对于编译器而言，是个不确定类型也不存在于运行时期的东西。对于声明语句：char str[] = "abcdefg";⒈它可以代表整个数组对象：计算 sizeof(str) 结果是整个数组大小 8 字节而不是指针大小。 ⒉它可以代表首个元素的地址：当你把 str 当作右值或者参数的时候，它被弱化为指针。 编译器实际上并不为 str 这个符号分配内存。不过通常我们把它视作是值不可改变指针常量。 如上面的 str 可以视为和声明语句「char * const p;」中等同的 p 的类型。  当你要声明一个变量指向该字符串，你需要：char *p1 = str;     // 指向首个元素 char *p2 = str + 1; // 指向第二个元素 char *p3 = &str[1]; // 与上一行等价char *s[] = { "abcfd", "fhd", "ghf" }; char **p = s + 1;上述例子中，我们将 char * 视作一种类型，使用 Windows SDK 定义的 PCHAR 代替：PCHAR s[] = { "abcfd", "fhd", "ghf" }; PCHAR *p1 = s;     // 指向首个元素 PCHAR *p2 = s + 1; // 指向第二个元素 PCHAR *p3 = &s[1]; // 与上一行等价可以看到形式上和上面并没有区别。
user-0 提问: 找出链表中的含有最大值得节点

回复:
user: user-1
content: struct list { int v; list *next;}; list *max_ele(list *head){     if(!head) return NULL;     list *ans=head;     for(head=head->next;head;head=head->next)         if(ans->v<head->v) ans =head;     return ans; }

user: user-2
content: 百度搜一下就会有很多可以参考的~~~
user-0 提问: C语言编译警告 

回复:
user: user-1
content: 引用 5 楼 eseses455250704 的回复:[quote=引用 4 楼 useprlove 的回复:] 在函数定义的地方加，而不是调用的地方加： Link_t Test_new( ) {...}       加完了还是会报警告warning: assignment makes pointer from integer without a cast [enabled by default]      head = Test_new();           ^ [/quote] .h文件中，那个函数声明也要改成： Link_t Test_new(void);

user: user-0
content: 引用 4 楼 useprlove 的回复:在函数定义的地方加，而不是调用的地方加： Link_t Test_new( ) {...}       加完了还是会报警告warning: assignment makes pointer from integer without a cast [enabled by default]      head = Test_new();           ^

user: user-1
content: 在函数定义的地方加，而不是调用的地方加： Link_t Test_new( ) {...}

user: user-2
content: 引用 2 楼 eseses455250704 的回复:[quote=引用 1 楼 ant2012 的回复:] Test_new( )  好像没有返回类型 应该是Link_t Test_new( )    吧     加上之后 error: expected expression before ‘Link_t’                      head = Link_t Test_new(); [/quote] 回去看书吧

user: user-0
content: 引用 1 楼 ant2012 的回复:Test_new( )  好像没有返回类型 应该是Link_t Test_new( )    吧     加上之后 error: expected expression before ‘Link_t’                      head = Link_t Test_new();

user: user-3
content: Test_new( )  好像没有返回类型 应该是Link_t Test_new( )    吧
user-0 提问: 多线程问题

回复:
user: user-1
content: 多线程协调问题。

user: user-2
content: //伪码 event1,event2;  void threadA() {     WaitForSingleObject(event1);     printf("A");     SetEvent(event2); } void threadB() {     WaitForSingleObject(event2);     printf("B");     SetEvent(event1); }

user: user-3
content: #include <iostream> #include <windows.h> #include <process.h>  using namespace std;  const int thread_num = 2; //线程个数 const int ouput_count = 5; //重复输出次数  HANDLE thread[thread_num]; HANDLE semaphore[thread_num];  #define P(s) WaitForSingleObject(s,INFINITE) #define V(s) ReleaseSemaphore(s,1,NULL)  void print_thread(void *argv)  { 	HANDLE s_cur, s_next; 	char c = (char)argv;  	s_cur = semaphore[c - 'A']; 	s_next = semaphore[(c - 'A' + 1) % thread_num];  	for (int i = 0; i < ouput_count; i++) 	{ 		P(s_cur); 		cout << c; 		V(s_next); 	} }  int main() { 	for (int i = 0; i < thread_num; i++) 	{ 		semaphore[i]=CreateSemaphore(NULL, 0, 1, NULL); 	}  	V(semaphore[0]);  	for (int i = 0; i < thread_num;i++) 	{ 		thread[i] = (HANDLE)_beginthread(print_thread, 0, (void *)('A'+i)); 	}  	WaitForMultipleObjects(thread_num, thread, TRUE, INFINITE); 	 	cout << endl;  	system("pause");  	return 0; }

user: user-4
content: 引用 2 楼 xihu1364 的回复: //伪码 event1,event2;  void threadA() {     WaitForSingleObject(event1);     printf("A");     SetEvent(event2); } void threadB() {     WaitForSingleObject(event2);     printf("B");     SetEvent(event1); }   再加上个计数器控制5次，就达到楼主要求了

user: user-5
content: 4楼 + 1

user: user-6
content: A线程操作时，B线程等待信号。 A线程操作完，发送给B线程信号。 B线程操作时，A线程等待信号。 B线程操作完，发送给A线程信号。
user-0 提问: 图像处理算法

回复:
user: user-1
content: 参考OpenCV源代码相关片断。

user: user-2
content: 低通滤波器在图像处理中主要是去除图像中的高频成分，一般高频成分是细节信息，有时噪声相对较多。所以经过低通滤波后，图像会去除一定的噪声，但是会变模糊。
user-0 提问: C语言典型内存安排

回复:
user: user-1

user: user-2
content: 这问题问的很深入啊，大致分为栈区、堆区、全局/静态/常量区、代码区，这里引用一个博文： http://blog.csdn.net/youoran/article/details/10990815

user: user-3
content: 这个语言本身有个毛的关系。差评。

user: user-4
content: http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=C%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%85%B8%E5%9E%8B%E5%86%85%E5%AD%98%E5%AE%89%E6%8E%92
user-0 提问: 看一下简单递归问题  卡在递归，为什么一直学不会

回复:
user: user-1
content: 自底向上 自顶向下

user: user-2
content: @赵4老师 回答的主要是递归函数的编程实现上，而非设计。要设计递归函数主要分两步： 1. 确定状态（即函数所要实现的功能）。在这题中，函数f要达到输入一个参数n，打印n层的那种图形。 2. 确定状态转移方程（即递归方程）。在这题中，要实现n层图形只要先打印n-1层，再把最后一层打印出来即可，即如下递归方程：f(n) = f(n-1), 然后打印 n个 '$'3. 确定初始状态（即递归出口或叫终止条件）。在这题中，是：f(0) = 不打印任何东西综上，代码如下：void f(int n){ 	if(!n)return; 	f(n-1); 	while(n--)putchar('$'); 	putchar('\n'); } int main(){ 	f(5); }

user: user-3
content: 搞懂了函数调用的过程对学习递归应该有帮助。

user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-4
content: 递归的思路，挺好理解的。 楼主，你可以用数学公式理解 f(n)  = f(n-1) + n;   // n != 0 f(0) = 4;    // n == 0 要想得到f(n)的值，就得先得到f(n-1)的值，这样层层递归，直到n == 0，则返回4; 因此递归函数： int f(int n) { 	if(n == 0) 	{ 		return 4; 	} 	else 	{ 		return f(n-1) + n; 	} }  再如楼主你提供的例子：要想打印n行$首先得打印前n-1行$，然后再打印第n行，则递归函数如下： void f(int n) { 	if(n == 0) 	{ 		return; 	} 	else 	{ 		f(n - 1); 		for(int i = 0; i < n; i++) 		{ 			printf("$"); 		} 		printf("\n"); 	} }

user: user-5
content: 代码简单清晰，多看几遍就会了：  #include <stdio.h>  void print_dollar(int n) {     static int count = 1;     int i;      for(i = 0; i < count; i++)     {         putchar('$');     }     putchar('\n');     count++;      if(n > 1)     {         print_dollar(n - 1);     } }  int main(int argc, char* argv[]) {     print_dollar(5);     return 0; }

user: user-6
content: 我觉得递归就是函数的自身调用吧，当达到某个条件的时候跳出循环。
user-0 提问: ov9650驱动代码

回复:
user: user-1
content: 参考C/C++标准。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:*(__u16 **)y_buf += image_width<<i;  老师能解释一下么 谢谢

user: user-2
content: 有时间的话，可以研究http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf  引用 4 楼 liuzijiang1123 的回复:[quote=引用 3 楼 walkiz 的回复:] 左值不能强制类型转换，你可以这样做：  __u16* y16_buf = (__u16*)y_buf; ... y16_buf += image_width << i;   感谢，请问原理是什么，我还不懂[/quote]

user: user-0
content: 引用 3 楼 walkiz 的回复:左值不能强制类型转换，你可以这样做：  __u16* y16_buf = (__u16*)y_buf; ... y16_buf += image_width << i;   感谢，请问原理是什么，我还不懂

user: user-2
content: 左值不能强制类型转换，你可以这样做：  __u16* y16_buf = (__u16*)y_buf; ... y16_buf += image_width << i;

user: user-1
content: *(__u16 **)y_buf += image_width<<i;

user: user-0
content: 多上传了一幅同样的图片，错误在这个图片上
user-0 提问: c语言用extern 引用结构的问题，本人新手望解答

回复:
user: user-1
content: 可以不用头文件，但这样在你引用的文件内必须重新声明你extern变量的结构

user: user-0
content: 谢谢各位，分已给，继续看书

user: user-2
content: 引用 6 楼 u014513151 的回复:[quote=引用 4 楼 songe88 的回复:] 就是说我必须要用头文件把这两个文件联系起来是么，不用.h文件不可以么   用一个头文件是最好的，C++中的话可以用 #ifndef _HEADERNAME_H #define _HEADERNAME_H  ...//(头文件内容)  #endif 这个东西防止重复定义，但是最好还是避免隐患[/quote]   额，少打字了，是C/C++可以用这个防止重复定义，C和C++都可以，，，

user: user-2
content: 引用 4 楼 songe88 的回复:就是说我必须要用头文件把这两个文件联系起来是么，不用.h文件不可以么   用一个头文件是最好的，C++中的话可以用 #ifndef _HEADERNAME_H #define _HEADERNAME_H  ...//(头文件内容)  #endif 这个东西防止重复定义，但是最好还是避免隐患

user: user-3
content: 引用 4 楼 songe88 的回复:就是说我必须要用头文件把这两个文件联系起来是么，不用.h文件不可以么  用两个源文件，这样在编译时，两个源文件都会编译一次，就会造成全局变量的重复定义

user: user-0
content: 就是说我必须要用头文件把这两个文件联系起来是么，不用.h文件不可以么

user: user-3
content: extern 表示声明一个全局变量，并不是定义一个全局变量 当涉及多个文件使用同一个全局变量时，一般在某个头文件中extern声明一个全局变量，在其中某个源文件（包含了那个头文件）中定义这个全局变量，其它源文件，只要引用那个头文件，就可以使用这个全局变量了  以上程序，years数组只应用于一个源文件中，不需要加extern，直接把声明放在头文件中，把定义放在源文件中。而且楼主，你第二个文件没有包含第一个文件，struct date会无法识别吧

user: user-2
content: 头文件： #include <stdio.h> #include <stdlib.h>   struct date { char month[15]; char abbreviation[4]; int days; int month_num; };  extern struct date years[12];  A.cpp： #include "head.h"  struct date years[12] = { {"January","Jan",31,1}, {"February","Feb",28,2}, {"March","Mar",31,3}, {"April","Apr",30,4}, {"May","May",31,5}, {"June","Jun",30,6}, {"July","Jul",31,7}, {"August","Aug",31,8}, {"September","Sep",30,9}, {"October","Oct",31,10}, {"November","Nov",30,11}, {"December","Dec",31,12} };   B.cpp： #include "head.h"  int main(void) { 	int i; 	puts("Enter month you want\"1-12\"(non digital to quit)"); 	while (scanf("%d", &i) == 1) 	{ 		int k = 0; 		while (getchar() != '\n') 			continue; 		 		for (int m = 0; m < i; m++) 			k += years[m].days; 		 		printf("%d days\n", k); 		puts("Enter month you want\"1-12\"(non digital to quit)"); 	}  	system("pause"); 	return 0; }  extern用法是正确的，不能有重复定义，你没有弄错，但是，文件2并不知道文件1的结构，所以，他知道years是结构数组，但他并不知道这个结构是什么样子的

user: user-3
content: extern 表示声明一个全局变量，并不是定义一个全局变量 当涉及多个文件使用同一个全局变量时，一般在某个头文件中extern声明一个全局变量，在其中某个源文件（包含了那个头文件）中定义这个全局变量，其它源文件，只要引用那个头文件，就可以使用这个全局变量了  以上程序，years数组只应用于一个源文件中，不需要加extern，直接把声明放在头文件中，把定义放在源文件中。而且楼主，你第二个文件没有包含第一个文件，struct date会无法识别吧
user-0 提问: 如何向stdin里写字符 用getchar能读到。

回复:
user: user-1
content: _ungetch Pushes back the last charcter read from the console.  int _ungetch( int c );  Routine Required Header Compatibility  _ungetch <conio.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  _ungetch returns the character c if it is successful. A return value of EOF indicates an error.  Parameter  c  Character to be pushed  Remarks  The _ungetch function pushes the character c back to the console, causing c to be the next character read by _getch or _getche. _ungetch fails if it is called more than once before the next read. The c argument may not be EOF.  Example  /* UNGETCH.C: In this program, a white-space delimited   * token is read from the keyboard. When the program   * encounters a delimiter, it uses _ungetch to replace   * the character in the keyboard buffer.  */  #include <conio.h> #include <ctype.h> #include <stdio.h>  void main( void ) {    char buffer[100];    int count = 0;    int ch;    ch = _getche();    while( isspace( ch ) )      /* Skip preceding white space. */       ch = _getche();    while( count < 99 )         /* Gather token. */    {       if( isspace( ch ) )      /* End of token. */          break;       buffer[count++] = (char)ch;       ch = _getche();    }    _ungetch( ch );            /* Put back delimiter. */    buffer[count] = '\0';      /* Null terminate the token. */    printf( "\ntoken = %s\n", buffer ); }   Output  White token = White   Console and Port I/O Routines  See Also   _cscanf, _getch

user: user-2
content: int ungetc(int c, FILE *stream); int ungetch(int c);

user: user-2
content: stdin 本身是不可以的，不过它有个缓冲区，可以把字符放回缓冲区 用 ungetc 就可以了

user: user-3
content: 不可能的，stdin 标准输入代表的是键盘，stdout 标准输出代表的是屏幕（虽然可以对他们重定向），你不能往键盘写东西，也不能从屏幕读东西
user-0 提问: NULL 为什么不可以赋值

回复:
user: user-1
content: 0 地址并非不能赋值，只是方法不对：// 这样当然可以： int p = 0; *(int *)p = 0x1234ABCD;// 这样岂不乱套了？ *(int *)0 = 0x1234ABCD;如果第二种可以赋值，也就意味着上面说的 3 = 5; 这种写法在 C 语言里也应该是有效的。

user: user-2
content: 如果你在开发驱动就会发现，NULL 是可以写的。

user: user-3
content: 操作系统内存管理中应该有答案。

user: user-4
content: 参考Linux源代码中内存管理相关源代码片断。

user: user-5
content: 12楼正解 NULL是常量，不是变量，不能作为左值，只能作为右值~ 很基础的知识，再多看点书~

user: user-6
content: 当NULL作为地址时， 就是RAM的0 地址，这个地址里存的内容可以被赋值，但是这个地址0不可以被赋值。 它的下一个地址是1，1也是常数也不可被赋值。 可以把NULL复制给一个或多个变量（包括指针变量），任何一个常数都可以赋值给变量。但是任何一个常数都不能被赋值。 你可以x=5,，但是不可以5=x。除非5==x

user: user-6
content: C语言把NULL作为字符串的最后一个字符,以表示字符串到此结束."\0" 这个"\0"就是NULL的值。这个值是常数。常数不可以被赋值。

user: user-6
content: NULL是一个常数。常数是不可被赋值的。 例如3是一个常数，不可以3=5，连 3=3都是不可以的。

user: user-7
content: 这个问题就好比你在问为什么 int 是整型  而不是dafds表示整型   规定如此  没什么为什么

user: user-8
content: 没有相应地址的访问权限。 自然也就谈不上赋值了。

user: user-9
content: NULL的根本意义在于实际应用中不可能存在的指针，不同的架构会有不同的值。当NULL为0时，表示0不会被用作其它用途，当NULL为-1时，表示0xffffffff不会被用作其它用途。如果你的实际用途中包含这样的地址，那么说明你的NULL定义是有问题的。

user: user-10
content: 地址一般都有访问权限的

user: user-11
content: 实际上早期的系统比如DOS，是可以赋值的，当时操作系统还通过检查程序运行前后，0地址处的值有没有变化，来看程序有没有运行出错。也就是说，一般而言，往0地址写入值，都是程序运行期错误导致的。 现代系统中，一般把最低的1KB到4KB作为无效写入地址，只要程序访问了，就认为是运行期错误。毕竟系统分配给你的有效地址范围，肯定不包含这一段。

user: user-12
content: 程序用的虚拟地址，不是RAM实际的地址。
user-0 提问: C语言写入txt文本用记事本打开出现乱码

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

user: user-2
content: 估计是编码方式，你确认下软件解析所使用的默认编码

user: user-3
content: 给点代码提示，很多时候你自己想当然的以为自己的代码没有问题

user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-4
content: ”1000以内用记事本打开正常“是啥意思？ 是所有小于1000的素数，还是第1个到第 999个素数？

user: user-5
content: 以字符方式输出就不会有问题的。

user: user-6
content: ===========贴代码===========

user: user-7
content: 你代码贴一下，没有存成二进制吧？或者也可能是由于编码原因

user: user-8
content: 编码问题吧，你看看用的什么编码
user-0 提问: 帮忙解决一下这个自定义的函数的功能。谢谢

回复:
user: user-1
content: 从功能上来看，就是把data按照4个字节组成一个32位的整数，简单的写法是：  unsigned int WHS(unsigned char* data) { 	unsigned int temp = data[0]; 	temp |= data[1] << 8; 	temp |= data[2] << 16; 	temp |= data[3] << 24; 	return temp; }

user: user-2
content: 大概是data0~4分别存了一个整数的4个字节，data[i]范围应该都是0~255。 然后这个函数把这4个字节转成一个完整的整数。 但是temp不初始化真的好么？

user: user-3
content: 就是大小端转换吧： 例子：  int array[4] = {0x12,0x34,0x56,0x78}; int *data = array; 转成=> temp = 0x78563412

user: user-0
content: 引用 楼主 jk_101 的回复:这个是自己写的自定义的函数，现在不知道他的功能，求解决。 int WHS(int *data) { 	int temp; 	temp+=(data[3]/16)*16*16*16*16*16*16*16; 	temp+=(data[3]%16)*16*16*16*16*16*16; 	temp+=(data[2]/16)*16*16*16*16*16; 	temp+=(data[2]%16)*16*16*16*16; 	temp+=(data[1]/16)*16*16*16; 	temp+=(data[1]%16)*16*16; 	temp+=data[0]; 	return temp; }能具体一点吗？当初写的比较急  谢谢 。这个 有初始值的。
user-0 提问: 关于给指针分配内存大小的问题。为什么是加3？？

回复:
user: user-1
content: strlen + 3这句肯定是错的，改为str_len + 2不应该崩啊。 崩在哪行代码？ 你用的什么编译器？ 输入什么样的数据崩溃的？

user: user-2
content: 把一个函数名字，函数指针拿来 +3 能有什么意义？

user: user-3
content: 引用 1 楼 user-4 的回复:先把代码格式化一下吧开门，送代码的 #include<stdio.h> #include<stdlib.h> #include<string.h> #define BUF_len 100 #define GESHU 5 void shuchu_zifuchuan(char**,int); char*hebing_zifuchuan(char**,int); int main(void) {     int chang=BUF_len ;     char buf[chang];     int str_count=GESHU ;     char**pS=NULL ;     pS=(char**)malloc(str_count*sizeof(char*));     int i=0 ;          while(true)     {         fflush(stdin);         if(!gets(buf))         {             printf("\n shuru chucuo!");             break ;         }         if(strlen(buf)==0)break ;         int str_len=strlen(buf)+1 ;         char*pStr=NULL ;         pStr=(char*)malloc(str_len);         strcpy(pStr,buf);                  if(str_count==i)         {             str_count+=GESHU ;             pS=(char**)realloc(pS,str_count*sizeof(char*));         }         pS[i++]=pStr ;     }          char*p=hebing_zifuchuan(pS,i);     printf("%s",p);          for(int j=0;i<i;++j)     {         free(pS[j]);         pS[j]=NULL ;     }          return 0 ;      }  char*hebing_zifuchuan(char**pS,int shu) {     char*p=NULL ;     p=(char*)calloc(1,sizeof(char));     int zongchang=0 ;          for(int i=0;i<shu;++i)     {         size_t str_len=strlen(pS[i]);         pS[i][str_len]='\n' ;         pS[i][str_len+1]='\0' ;                  int chang=strlen+3 ;         //------这里为什么是3,改成2和4的时候都崩溃。为什么？         zongchang+=chang ;                  char*pT=NULL ;         pT=(char*)realloc(p,zongchang*sizeof(char));         if(!pT)printf("\n kuozhan neicun shibai!!");         p=pT ;         strcat(p,pS[i]);     }          return p ; }

user: user-4
content: 先把代码格式化一下吧
user-0 提问: 怎样才能将多个.o文件一起链接生成一个.exe文件？？

回复:
user: user-1
content: MASM跟MinGW下的GCC貌似很契合... 可以直接链接OBJ

user: user-1
content: 放几张图片自行感受下

user: user-1
content: 引用 11 楼 baidu_15527759 的回复:[quote=引用 10 楼 u013550545 的回复:] [quote=引用 9 楼 baidu_15527759 的回复:] [quote=引用 7 楼 u013550545 的回复:] nasm默认用的是16bit mode ..  如果lz用的是16位的 记得在文件内指定段类型 如果是格式问题的话... 得先搞清楚连接器是用的神马格式的 ... 一般而言就是 COFF/OMF两种 ...加上 coff(omf) 参数 试试 怎么加？ [/quote]http://blog.163.com/lixiangqiu_9202/blog/static/53575037201272711947530/[/quote]  [/quote]MinGW... 默认使用的是coff格式的.o文件-_- //~(...基本不使用GCC(经常使用VC)和控制台编译器程序..除了D语言,这点还真没了解)  ... 链接器无效应该是OBJ函数名对不上. nasm 应该这样写 nasm -fcoff Demo.asm (此时.o文件才会有可供链接的符号, 生产符号名 Demo)  gcc 声明前面加上 extern"C" (不加extern"C" OBJ函数修饰就不是C所使用的了)  最后一点是 gcc 在生成.o 文件extern的符号会多加一个 _ (_Demo) 你在写函数实现的时候记得在函数前面多加一个下划线.. gcc写声明的时候加上 extern"C"和没加下划线的函数名 .c文件亦是如此  nasm 和 gcc 都用的很少、 暂时没找到其他好的办法

user: user-2
content: 参看：http://blog.csdn.net/zhoubl668/article/details/3952967

user: user-0
content: 引用 10 楼 u013550545 的回复:[quote=引用 9 楼 baidu_15527759 的回复:] [quote=引用 7 楼 u013550545 的回复:] nasm默认用的是16bit mode ..  如果lz用的是16位的 记得在文件内指定段类型 如果是格式问题的话... 得先搞清楚连接器是用的神马格式的 ... 一般而言就是 COFF/OMF两种 ...加上 coff(omf) 参数 试试 怎么加？ [/quote]http://blog.163.com/lixiangqiu_9202/blog/static/53575037201272711947530/[/quote]

user: user-1
content: 引用 9 楼 baidu_15527759 的回复:[quote=引用 7 楼 u013550545 的回复:] nasm默认用的是16bit mode ..  如果lz用的是16位的 记得在文件内指定段类型 如果是格式问题的话... 得先搞清楚连接器是用的神马格式的 ... 一般而言就是 COFF/OMF两种 ...加上 coff(omf) 参数 试试 怎么加？ [/quote]http://blog.163.com/lixiangqiu_9202/blog/static/53575037201272711947530/

user: user-0
content: 引用 7 楼 u013550545 的回复:nasm默认用的是16bit mode ..  如果lz用的是16位的 记得在文件内指定段类型 如果是格式问题的话... 得先搞清楚连接器是用的神马格式的 ... 一般而言就是 COFF/OMF两种 ...加上 coff(omf) 参数 试试 怎么加？

user: user-3
content: 引用 5 楼 baidu_15527759 的回复:[quote=引用 4 楼 SXJIAKE 的回复:] gcc obj1.o obj2.o obj3.o -o file.exe obj1.o:file not recognized:File format not recognized collect2: ld returned 1 exit status[/quote]obj1.o、obj2.o、obj3.o 只是例子，要用你的 o 文件名列表换掉…………

user: user-1
content: nasm默认用的是16bit mode ..  如果lz用的是16位的 记得在文件内指定段类型 如果是格式问题的话... 得先搞清楚连接器是用的神马格式的 ... 一般而言就是 COFF/OMF两种 ...加上 coff(omf) 参数 试试

user: user-4
content: 引用 5 楼 baidu_15527759 的回复:[quote=引用 4 楼 SXJIAKE 的回复:] gcc obj1.o obj2.o obj3.o -o file.exe obj1.o:file not recognized:File format not recognized collect2: ld returned 1 exit status[/quote] ...................

user: user-0
content: 引用 4 楼 SXJIAKE 的回复:gcc obj1.o obj2.o obj3.o -o file.exe obj1.o:file not recognized:File format not recognized collect2: ld returned 1 exit status

user: user-3
content: gcc obj1.o obj2.o obj3.o -o file.exe

user: user-0
content: 那可不可以用mingwa链接？

user: user-5
content: 用链接器，C和ASM写得程序都可以编译为.o的目标代码。

user: user-6
content: 用连接器。。。66666
user-0 提问: 服务器端 监听连接的socket 描述符 用 select 监听 没反应

回复:
user: user-1
content: nt maxfd = connfd;  FD_SET(connfd, &rd);  while(1){ select(maxfd+1,&rd,NULL,NULL,NULL); 要吧listenfd加入到rd中哦。

user: user-2
content: 每次调用select前，都要调用FD_ZERO，FD_SET
user-0 提问: 服务端原始套接字，收到UDP报文， 返回ICMP，并且发送了UDP报文，但对方收不到。

回复:
user: user-1
content: 1. 服务端使用的原始套接字来接收数据，相当于是跳过了操作系统的协议栈吧，操作系统可能不知道程序里面有什么处理，以为没有人处理就回了一个 ICMP 的包吧。（猜测） 2. 如果 ICMP 先到达，有这种可能，试试在路由器过滤掉那个 ICMP 包来实验下呢。 不同的网络不一样有可能是因为这两个包达到的顺序不一样

user: user-0
content: 补充一下， 并不是所有的客户端都有这个问题， 有些客户端，如果用了电信 移动的4G信号，则可以  出问题的客户端， 用的是移动的wifi。
user-0 提问: 求解操作符的先后顺序

回复:
user: user-1
content: +号的优先级高于<<位移 楼主，直接百度c语言符号优先级就能查到操作符优先级表

user: user-2
content: ～比>>的优先级高，+比>>高 先~a，然后，右移（1+2+3）位 char signed、 char unsigned 、char和short int参与运算时会提升为类型int. a=0XA5 提示为0X000000A5 然后进行求反得到0XFFFFFF5A 然后移位得到0X03FFFFFD，变u char即0XFD，即253

user: user-0
content: 引用 1 楼 linux_liyi的回复:先~a 和1+2+3 然后友移 那么结果不是00000001么

user: user-3
content: 先~a 和1+2+3 然后友移
user-0 提问: 如何返回BSTR给VBA

回复:
user: user-0
content: 自己顶一下,  问题还是自己解决了 将	plData=(long*)malloc(4+lLen+2); 替换为	plData=(long*)HeapAlloc( GetProcessHeap(), 0,(4+lLen+2));  看 malloc 语句介绍说,  它也是调用 HeapAlloc. 这两者有什么区别吗.? 麻烦路过的看官, 出手解答一下.

user: user-0
content: malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较 http://www.cppblog.com/woaidongmao/archive/2011/08/12/153160.aspx  HeapAlloc(_crtheap, 0, size);  _crtheap 这里什么意思?

user: user-0
content: 以上代码分配内存少加了一个\0终止符的长度,  改过来后,但问题依旧   BSTR __stdcall HexToStr(PWSTR String) { 	//BYTE* buf = new BYTE[sizeof(INT32) + (wcslen(sz)+1)*sizeof(OLECHAR) ]; 	long lLen=16; 	long* plData;	__int64* pllData; 	plData=(long*)malloc(4+lLen+2); 	*plData=lLen;  	pllData=(__int64*)(plData+1); 	*pllData=0x0030003000300030i64; 	*(pllData+1)=0x0033003300330033i64; 	 	return (BSTR)pllData; }
user-0 提问: C语言的命令行参数如何输入回车啊,莫非必须以空格为间隔

回复:
user: user-1
content: 加引号，去掉回车换行 --Windows 下面 引号内的 命令行参数，看作一个整体。

user: user-0
content: 引用 1 楼 user-1 的回复:加引号，去掉回车换行 --Windows 下面 引号内的 命令行参数，看作一个整体。 引用 1 楼 user-1 的回复:加引号，去掉回车换行 --Windows 下面 引号内的 命令行参数，看作一个整体。  真是太感谢了,赞赞赞呐~
user-0 提问: 我的git打不开了，现实找不到tmp目录

回复:
user: user-1
content: 那试着改一下你的tmp目录，不要含中文和空格：   引用 9 楼 u011054333 的回复:[quote=引用 8 楼 walkiz 的回复:] 试一下 git for windows 客户端。  [quote=引用 7 楼 u011054333 的回复:] [quote=引用 4 楼 walkiz 的回复:] 1、/tmp 目录应该跟编码没有关系； 2、git 工程建议放在简单的目录，不含中文字符和空格为最好； 3、建议用 git for windows 客户端（https://git-for-windows.github.io/） 。嗯，可是它默认的挂载目录我没法不让他不含中文啊，他的/tmp貌似映射到 c/user/我的中文用户/appdata下了，所以现在不知道该怎么弄了[/quote][/quote]我装的那个貌似就是啊，现在我已经滚回了git 1.9，我又去git for windows 的github issue上提交一下问题，发现这个问题还不止我一个，项目路径含有中文字符的也不行[/quote]

user: user-0
content: 引用 8 楼 walkiz 的回复:试一下 git for windows 客户端。  [quote=引用 7 楼 u011054333 的回复:] [quote=引用 4 楼 walkiz 的回复:] 1、/tmp 目录应该跟编码没有关系； 2、git 工程建议放在简单的目录，不含中文字符和空格为最好； 3、建议用 git for windows 客户端（https://git-for-windows.github.io/） 。嗯，可是它默认的挂载目录我没法不让他不含中文啊，他的/tmp貌似映射到 c/user/我的中文用户/appdata下了，所以现在不知道该怎么弄了[/quote][/quote]我装的那个貌似就是啊，现在我已经滚回了git 1.9，我又去git for windows 的github issue上提交一下问题，发现这个问题还不止我一个，项目路径含有中文字符的也不行

user: user-0
content: 引用 10 楼 walkiz 的回复:那试着改一下你的tmp目录，不要含中文和空格：   [quote=引用 9 楼 u011054333 的回复:] [quote=引用 8 楼 walkiz 的回复:] 试一下 git for windows 客户端。  [quote=引用 7 楼 u011054333 的回复:] [quote=引用 4 楼 walkiz 的回复:] 1、/tmp 目录应该跟编码没有关系； 2、git 工程建议放在简单的目录，不含中文字符和空格为最好； 3、建议用 git for windows 客户端（https://git-for-windows.github.io/） 。嗯，可是它默认的挂载目录我没法不让他不含中文啊，他的/tmp貌似映射到 c/user/我的中文用户/appdata下了，所以现在不知道该怎么弄了[/quote][/quote]我装的那个貌似就是啊，现在我已经滚回了git 1.9，我又去git for windows 的github issue上提交一下问题，发现这个问题还不止我一个，项目路径含有中文字符的也不行[/quote][/quote]O哦，有用了，哈哈，谢谢大神

user: user-1
content: 1、/tmp 目录应该跟编码没有关系； 2、git 工程建议放在简单的目录，不含中文字符和空格为最好； 3、建议用 git for windows 客户端（https://git-for-windows.github.io/） 。

user: user-2
content: 重装一下好了，应该不会损失你的数据

user: user-1
content: 试一下 git for windows 客户端。  引用 7 楼 u011054333 的回复:[quote=引用 4 楼 walkiz 的回复:] 1、/tmp 目录应该跟编码没有关系； 2、git 工程建议放在简单的目录，不含中文字符和空格为最好； 3、建议用 git for windows 客户端（https://git-for-windows.github.io/） 。嗯，可是它默认的挂载目录我没法不让他不含中文啊，他的/tmp貌似映射到 c/user/我的中文用户/appdata下了，所以现在不知道该怎么弄了[/quote]

user: user-3
content: 你这个是服务端？

user: user-0
content: 引用 4 楼 walkiz 的回复:1、/tmp 目录应该跟编码没有关系； 2、git 工程建议放在简单的目录，不含中文字符和空格为最好； 3、建议用 git for windows 客户端（https://git-for-windows.github.io/） 。嗯，可是它默认的挂载目录我没法不让他不含中文啊，他的/tmp貌似映射到 c/user/我的中文用户/appdata下了，所以现在不知道该怎么弄了

user: user-0
content: 引用 3 楼 ckc 的回复:重装一下好了，应该不会损失你的数据重装好几次了我现在正在考虑要不要退回到git1.9我在机房电脑上装的git2.5由于他是英文名用户名反而工作的很好

user: user-0
content: 引用 2 楼 q3733353520 的回复:你这个是服务端？是客户端，但是貌似由于它模拟的挂载目录映射到我的windows临时文件目录含有中文，所以无法正常使用了

user: user-0
content: 重发一下图…… 貌似是我的中文用户名和编码问题  但是当我把文件编码改成gbk以后倒是不提示我出错了，变成了这个错误    我想着先取消挂载然后自己重新挂一个/tmp目录也不行，现在我是没招了，求助大神们该如何解决
user-0 提问: C语言代码运行错误

回复:
user: user-1
content: 因为换行符影响了下面的操作。 把换行符吃掉就行。

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

user: user-3
content: 第一个问题：是将\n的值赋值个了 ch ，在     printf("请输入你要对数据的处理方式，若为加法请输入A ,若为乘法请输入B或者C。\n");     scanf("%c", &ch);  中间加getchar（）; 也就是   printf("请输入你要对数据的处理方式，若为加法请输入A ,若为乘法请输入B或者C。\n"); getchar（）； scanf("%c", &ch);

user: user-4
content: 如果是double就改成 const double EPSILON = 1E-15;

user: user-4
content: 引用 8 楼 believeforever6 的回复:系统运行会报错呀 error: 'ESPILON'  does not name a type  不好意思，写错了 const EPSILON = 1E-6; 改成 const float EPSILON = 1E-6;

user: user-5
content: 引用 3 楼 ant2012 的回复:当你输入a b敲回车结束时，a b读完值后，将换行字符给了ch 这样，程序接着执行switch语句  解决办法：在输入字符前，加fflush(stdin);清空输入缓存区  正解

user: user-0
content: 系统运行会报错呀 error: 'ESPILON'  does not name a type

user: user-4
content: 不过一般浮点型与0值的比较，需要设计精度的问题 const EPSILON = 1E-6; if(x >= -EPSILON && x <= EPSILON )  //x等于0

user: user-4
content: else if (x = 0)  x = 0 少了一个等号

user: user-0
content: 两种方法都是可以的，谢谢两位了。 还有个问题想请问一下， # include <stdio.h> # include <math.h>  int main(void) {     float x, y;      printf("请输入该方程x的取值！\n");     scanf("%f",&x);      if (x > 0)     {         y = 4*x + sqrt(9);     }     else if (x = 0)     {         y = 0;     }     else     {         y = 4 + x ;                    // 为什莫会出错，此处输入负数之后运行结果错误！！！     }      printf("y = %f\n",y);       return 0; }

user: user-0
content: 谢谢了，我试试，看看结果！

user: user-4
content: 当你输入a b敲回车结束时，a b读完值后，将换行字符给了ch 这样，程序接着执行switch语句  解决办法：在输入字符前，加fflush(stdin);清空输入缓存区

user: user-6
content: 引用 1 楼 user-6 的回复:一看就知道是因为回车的问题, lz需要调试啊. 在"switch(ch)"这个地方下个断点, 啥问题都解决了..  很久没用标准输入了, 都忘记处理方式了. 试试    while(ch == '\n') scanf("%c", &ch);  需要初始化char ch = '\n';

user: user-6
content: 一看就知道是因为回车的问题, lz需要调试啊. 在"switch(ch)"这个地方下个断点, 啥问题都解决了..  很久没用标准输入了, 都忘记处理方式了. 试试    while(ch == '\n') scanf("%c", &ch);
user-0 提问: 写一个算法，怎样将16进制的字符累加取反加1

回复:
user: user-1

user: user-1

user: user-2
content: #inlcude <stdio.h> char str[28]={ '\xaa','\x1d','\xea','\x00', '\x00','\x00','\x00','\x00', '\x00','\x02','\xaa','\x55', '\x04','\x00','\x13','\x02', '\xb9','\x0b','\x01','\x01', '\x01','\x01','\x00','\x00', '\x00','\x00','\x00','\x00', }; int i; unsigned char sum; int main() {     sum=0;     for (i=0;i<28;i++) sum+=(unsigned char)str[i];     sum=~sum+1;     printf("%02x\n",sum);     return 0; }

user: user-3
content: 涉及到大数运算，建议直接用GMP库（https://gmplib.org/），或者是参考它的源代码。

user: user-4
content: 如果数据非常多，连最大整形都hold不住，那就要字符串，对字符串重载+号和~号

user: user-4
content: 你这样定义也不行，编译能不过  楼主，你可这样定义： unsigned char ch= 0xaa; 然后就可以累加和取反了，不过得注意越界问题，unsigned char 为1字节，最大为ff，即十进制255，可以考虑用unsigned short 或者 unsigned int

user: user-0
content: 不好意思，是 char str[28]. 累加就是  aa+1d+ea+00 ......

user: user-4
content: 引用 楼主 qq_24484465 的回复:输入 char str[10]={ "aa','1d','ea','00"     ,"00','00','00','00"     ,"00','02','aa','55"     ,"04','00','13','02"     ,"b9','0b','01','01"     ,"01','01','00','00",     "00','00','00','00"};  输出 20    怎样将16进制的字符累加取反加1   楼主，你这多少数据啊，怎么才用10个char类型存储  字符累加是什么意思，还请楼主详说，取反用~操作符就行了
user-0 提问: 编译错误  求指点    具体些  谢谢各位  

回复:
user: user-1
content: int main(int argc, char **argv) { 	int i; 	int passed = 0; 	int failed = 0;  	printf("\n----------- Begin Unit Test ----------\n");  	BEGIN_TEST 		test_getlength(), 		test_constains(), 		test_put(), 		test_get(), 		test_replace(), 		test_remove(), 	END_TEST  	printf("Tests run: %d\n", sizeof(testResults) / sizeof(char*)); 	for(i = 0; i < sizeof(testResults) / sizeof(char*); ++i;) 	{ 		if(testResults[i]) 		{ 			printf("TEST %d Error: %s\n", i, testResults[i]); 			++passed; 		} 		else 		{ 			++failed; 			printf("TEST %d Passed", i); 		} 		printf("\n------------End Unit Test -------------\n"); 		printf("Passed: %d 个 \n",passed); 		printf("Failed: %d 个 \n",failed); 		printf("\n----------------------------------------\n"); 		return 0 	} }

user: user-2
content: main函数 里面 第四行 也就是BEGIN_TEST的上面一行， 又来一遍  int main(int argc, char **argv)， 我也没明白你想干点啥

user: user-2
content: BEGIN_TEST             test_getlength()             test_constains()             test_put()             test_get()             test_replace()             test_remove()             END_TEST  这段代码替换之后就是  char* testResults[] = {             test_getlength()             test_constains()             test_put()             test_get()             test_replace()             test_remove() };  lz我没有明白你这段代码想干点啥

user: user-3
content: test_getlength()             test_constains()             test_put()             test_get()             test_replace()             test_remove() 是不是中间少了逗号

user: user-4
content: 没有symtable.h

user: user-5
content: 宏是一种语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。
user-0 提问: 为什么结构体这样定义别人可以编译，我的却不能编译~？

回复:
user: user-0
content: 该语法在c99下是可编译通过的， （问题出在了我的编译器设置问题，一个是c99编译，一个不是（我也不知道是哪个标准））。

user: user-0
content: const struct ke_state_handler TEST_spotar_state_handler[TEST_SPOTAR_STATE_MAX] = {     [TEST_SPOTAR_DISABLED]    = KE_STATE_HANDLER(TEST_spotar_disabled),     [TEST_SPOTAR_IDLE]        = KE_STATE_HANDLER(TEST_spotar_idle),     [TEST_SPOTAR_ACTIVE]   = KE_STATE_HANDLER(TEST_spotar_active), }; 但我在相同编译器下那样定义却不能通过定义。 结构体中[] = ,是什么意思？

user: user-1
content: 还是少用些新特性吧，主动给自己系统以后的兼容性埋坑

user: user-2
content: const struct ke_state_handler TEST_spotar_state_handler[TEST_SPOTAR_STATE_MAX]  这是c的写法  struct ke_state_handler  表示一个类型 TEST_spotar_state_handler[TEST_SPOTAR_STATE_MAX]是数组  用c++的写法，可以如下： class ke_state_handler {    //.... }; const ke_state_handler TEST_spotar_state_handler[TEST_SPOTAR_STATE_MAX] = ｛...

user: user-3
content: windows 不区分大小写，linux,unix 区分 所以 .c,.C 对于Widows 都是 C文件 但是linux,unix 就不同了，我记着 ，大写是C++，小写是C

user: user-4
content: 引用 3 楼 user-4 的回复:[quote=引用 2 楼 jimoxiaosage 的回复:] [quote=引用 1 楼 user-4 的回复:] 这是 c99 的特出语法，c++不支持。 我也用了同样的 编译器，也是不通过的哦~[/quote] 你两次编译的语言类型不一样，第一次程序按 C 语言编译，通过了；第二次按 C++ 的编译，没通过。 如果你用的是 VC，有可能是因为文件扩展名不同造成的，vc 会根据扩展名自动选择编译语言，.c 的按 C 编译，.cpp 的按c++编译。[/quote] 实际上 clang 也是自动选择，gcc 估计也是。

user: user-4
content: 引用 2 楼 jimoxiaosage 的回复:[quote=引用 1 楼 user-4 的回复:] 这是 c99 的特出语法，c++不支持。 我也用了同样的 编译器，也是不通过的哦~[/quote] 你两次编译的语言类型不一样，第一次程序按 C 语言编译，通过了；第二次按 C++ 的编译，没通过。 如果你用的是 VC，有可能是因为文件扩展名不同造成的，vc 会根据扩展名自动选择编译语言，.c 的按 C 编译，.cpp 的按c++编译。

user: user-0
content: 引用 1 楼 user-4 的回复:这是 c99 的特出语法，c++不支持。 我也用了同样的 编译器，也是不通过的哦~

user: user-4
content: 这是 c99 的特出语法，c++不支持。
user-0 提问: pS【i】！=NULL，作为条件，来控制输出，为什么会出错

回复:
user: user-1
content: 越界太危险，，

user: user-2
content: 引用 2 楼 qq_30446977 的回复:那该怎么办呢？ 其实我也想到这个了，超出pS数组后，肯定是一个指针，但不一定是指向哪里的指针。后来我想改变循环条件，但是发现我居然对如何求一个字符串数组，有几个字符串，没办法。 怎么办？  子函数，加一个参数，传字符串个数。而且楼主你这存在内存泄露的问题

user: user-0
content: 那该怎么办呢？ 其实我也想到这个了，超出pS数组后，肯定是一个指针，但不一定是指向哪里的指针。后来我想改变循环条件，但是发现我居然对如何求一个字符串数组，有几个字符串，没办法。 怎么办？

user: user-3
content: 因为超出你赋值后，它的值虽然不为NULL，但是是个野指针
user-0 提问: C语言txt文件中内容字符串查找问题求助

回复:
user: user-1
content: //in.txt文件内容如下: //A->B //hello everybody haha hehe //B->A //world is big //A->B //impossible is nothing //B->A //just do it //需求： //首先查找字符串hello，找到后提取其上一行字符串A->B，然后依次查找下一个A->B或者B->A（两个都可以）， //提取出其下一行第一个字符串，也就是world ,impossible ,just 然后把hello,world,impossible,just放到一个数组里。 #include <stdio.h> #include <string.h> #include <stdlib.h> FILE *f; char ln1[80],ln2[80],ln[80]; char A[40],B[40]; char key1[82]; char key2[82]; long offset; char arr[100][80]; char *p; int n,i; int main() {     f=fopen("in.txt","rb");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     ln1[0]=0;     while (1) {         if (NULL==fgets(ln2,80,f)) break;         offset=ftell(f);         if (strstr(ln2,"hello")) {             if (ln1[0]) {                 p=strstr(ln1,"->");                 if (p) {                     n=__min(39,p-ln1);                     strncpy(A,ln1,n);A[n]=0;                     n=__min(39,strlen(p+2));                     strncpy(B,p+2,n);                     n--;                     while (1) {                         if (B[n]==0) break;                         if (B[n]=='\r' || B[n]=='\n') B[n]=0;                         n--;                     }                     sprintf(key1,"%s->%s",A,B);                     sprintf(key2,"%s->%s",B,A);                     i=0;                     while (1) {                         if (i==0) {                             strcpy(ln,ln2);                         } else {                             if (NULL==fgets(ln,80,f)) break;                         }                         if (1==sscanf(ln,"%79s",arr[i])) {                             i++;                             if (i>=100) break;                             if (NULL==fgets(ln,80,f)) break;                             if (!(strstr(ln,key1) || strstr(ln,key2))) break;                         } else break;                     }                     n=i;                     for (i=0;i<n;i++) printf("[%d] \"%s\"\n",i,arr[i]);                 }             }         }         strncpy(ln1,ln2,79);ln1[79]=0;         fseek(f,offset,SEEK_SET);     }     fclose(f);     return 0; } //[0] "hello" //[1] "world" //[2] "impossible" //[3] "just" //

user: user-2
content: 4KB、4KB地把文件读取到缓冲区，然后每次查找一行（直到查到行末尾的换行符，就是到达了末尾了），这样就得到了这一行的字符串内存，然后再逐个字符逐个字符地取，若取到的字符是A，则向后取3位，看看后3位是不是"->B"这样的字符，如果是，就表示你已经取到了。 如此循环往复即可

user: user-3
content: 如果内容不多，就直接全部读到Buff里面。安String来处理。 如果内容比较多，建议是写专门的操作来做，你的需求已经可以分解成对应的Function了。

user: user-4
content: 如果你的格式就是这样,每行判断一下就好了,比如大写字母,不是A就是B,小写字节就只有hwij

user: user-0
content: 求助啊求助啊求助啊求助
user-0 提问: matlab转C语言

回复:
user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:OpenCV是开源的。 《学习OpenCV（中文版）》 这位老师，opencv的c++图像处理方法编程你懂不懂的，我现在急需一位有这方面经验的人来指导，如果你懂，可不可以给我下联系方式，有偿指导也行

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

user: user-2
content: 我原来也做过楼主类似的工作，这方面的资料网上比较少，建议楼主看：《matlab与c/c++混合编程》 这本书

user: user-1
content: OpenCV是开源的。 《学习OpenCV（中文版）》

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:图像处理的C语言代码虽然比较复杂；但OpenCV自带的C语言图像处理例子代码和例子中调用的函数对应的源代码还是比较简单的。 老师可不可以给我你的联系方式，QQ微信都可以  方便问答

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:图像处理的C语言代码虽然比较复杂；但OpenCV自带的C语言图像处理例子代码和例子中调用的函数对应的源代码还是比较简单的。 那如果要导入DSP中  还是需要将他的所有函数库一起导入进去吗

user: user-1
content: 图像处理的C语言代码虽然比较复杂；但OpenCV自带的C语言图像处理例子代码和例子中调用的函数对应的源代码还是比较简单的。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:所以楼主的想法是行不通的。 只能直接使用C实现图像处理功能。可以参考OpenCV源代码片断。 关键现在还不知道用什么方法处理图像能获得理想效果，而C语言代码又过于复杂，所以我想先用matlab找到对应方法后再用C语言编写，不知道老师这里有没有对应matlab图像处理函数的C代码

user: user-1
content: 所以楼主的想法是行不通的。 只能直接使用C实现图像处理功能。可以参考OpenCV源代码片断。

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

回复:
user: user-0
content: 引用 5 楼 ForestDB 的回复:我所谓的业务，就是这个3ms从何而来？   是因为有一个协议要求 3ms 内完成响应。当然这个协议是暂定的。如果不能实现，就使用这个协议了。

user: user-1
content: 啥叫实时性？

user: user-2
content: 对响应时间有要求的，请考虑实时操作系统。  当然LZ可以说说具体的业务，看看业务是否对响应时间有要求。  另： 所谓“实时”，并不是指它有多快，而是指它一定会在指定的时间内完成动作。

user: user-2
content: 我所谓的业务，就是这个3ms从何而来？

user: user-0
content: 引用 2 楼 ForestDB 的回复:对响应时间有要求的，请考虑实时操作系统。  当然LZ可以说说具体的业务，看看业务是否对响应时间有要求。  另： 所谓“实时”，并不是指它有多快，而是指它一定会在指定的时间内完成动作。    具体的业务就是 接收到请求，然后组包， 然后发送数据。过程比较简单。只是这个过程能否保证 在 3ms 内完成 ？

user: user-3
content: 不管多 "硬" 的操作系统都无法保证。  业务是确定的(请求),做个压测测出服务器(组)可以负载多少并发。 再做平衡负载，旁路什么的，这样就算不能100%,起码也有99.999%
user-0 提问: popen获取nginx版本失败

回复:
user: user-0
content: 问题解决了，nginx在执行-v 命令时会把结果输出到stderr而不是stdout 只需要把stderr重定向到stdout就可以了

user: user-0
content: 哪位大神帮忙看下啊

user: user-0
content: 使用这个函数执行诸如 ps/ls之类的命令可以正确获得输出，只有nginx -v没有办法
user-0 提问: 关于获取数组首地址的一个问题

回复:
user: user-1
content: 请参考K&R第二版附录A7.1 指针转换  对于某类型T，如果某表达式或子表达式的类型为“T类型的数组”，则此表达式的值是指向数组中第一个对象的指针，并且此表达式的类型将被转换为“指向T类型的指针“。如果此表达式是一元运算符&或sizeof，则不会进行转换。

user: user-2
content: 参看：  对数组名取地址在 C 标准里面是未定义的。这个表达式曾经引起过争论，焦点在于对一个 右值取地址的合法性。 C89 规定&运算符的操作数必须具有具体的内存空间，换言之就是一 个左值，但数组名却是一个右值，按照&运算符的要求，这是非法行为。因此，早期的编译 器通常规定&a 是非法的。但不知道什么原因，现在的编译器都把&a 人为地定义成一个比 a 高一级而地址值跟 a 一样的地址，但作为比 a 高一级的地址，有一个行为却非常怪诞， sizeof(&a)的结果跟 sizeof(a)相同，这也是人为的痕迹。笔者倾向于把&a 定义为非法，应该 维护&运算符的权威性，而不是在规定对某个右值取地址为非法的同时，又允许对另一个右 值取地址，这是互相矛盾的。

user: user-3
content: 你这个问题恐怕要参考C标准了。    int testfun(unsigned char* buf, int len) {   unsigned char arry[10] = {0};     if( buf == NULL ) return -1;   if( len <= 0 )return -1;    if (len>10) len=10;//小心驶得万年船   memcpy(arry, buf, len);//方式1   memcpy(&arry, buf, len);//方式2   return 0; }

user: user-4
content: printf("%p" 就可以看到了,同一地址,只是类型不同
user-0 提问: 大家帮忙看下这个程序哪里出错了，新手求教！！！

回复:
user: user-1
content: for (i = 0; i < lim - 1 && (c = getchar()) != EOF) && c != '\n' ; ++i) 这里你仔细看一下，真的是正确的吗。 几个括号的匹配。

user: user-2
content: #include <stdio.h> #define MAXLINE 1000 int mygetline (char line[], int maxline); void mycopy (char to[], char from[]);  int main() { 	int len; 	int max; 	char line [MAXLINE]; 	char longest [MAXLINE]; 	max = 0; 	while ((len = mygetline(line, MAXLINE)) > 0) 	{ 		if (len > max) 		{ 			max = len; 			mycopy(longest, line); 		} 		if (max > 0) 			printf("%s\n", longest); 	} 	return 0;  }  int mygetline (char s[], int lim) { 	int c; 	int i; 	for (i = 0; i < lim - 1 && ((c = getchar()) != EOF) && c != '\n' ; ++i) 	{ 	//	printf("c = %d %c\n", c, c); 		s[i] = c; 	} 	s[i] = '\0'; 	return i; }  void mycopy (char to[], char from[]) { 	int i= 0;  	while ( from[i] != '\0') 	{ 		to[i] = from[i]; 		++i; 	} 	to[i]='\0'; }

user: user-3
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 求助！帮忙看看，字符串数组指针作为函数的参数，哪里出错了？

回复:
user: user-0
content: printf("%s",*(pS+i)); 	}  	char*pstr=NULL; 	pstr=(char*)malloc(200*sizeof(char)); 	shuchu_zifuchuan(pS); 	return 0; 	 } void shuchu_zifuchuan(char**pS) { 	for(int i=0;i<3;++i) 	{ 		printf("\n%s",*(pS+i)); 	} }   我把定义的函数改变了，改成输出字符串数组。但是还是出错，怎么办？

user: user-0
content: 不是这个问题。该了之后还是不行。

user: user-1
content: printf("%d %s",*(pS+i));//改为if(NULL != *(pS+i))  printf("%d %s\n",i,*(pS+i));

user: user-2
content: //定义一个函数，他的参数是字符串数组指针，返回一个将所有字符串合并起来的字符串指针，每个字符串都用换行符来终止。 //如果输入数组中的原字符串将换行符作为最后一个字符,函数就不能给字符串添加另一个换行符。 //编写一个程序，从键盘读入几个字符串，用这个函数输出合并后的字符串。 #include<stdio.h> #include<string.h> #include<stdlib.h> #define GESHU 5 #define BUF_len 200 size_t str_count=GESHU; char* hb_zifuchuan(char**); int main(void){     char buf[BUF_len];     char **pS=NULL;     pS=(char **)malloc(str_count*sizeof(char *));     int i=0;     while (true) {         if (!(gets(buf))) {     //读入字符串，并检验字符串是否输入正常             printf("\n shuru cuo wu.");             free(pS);             pS=NULL;             break;         }         if (strlen(buf)==0) break; //循环中断条件，是字符串长度为空         if ((i+1)==str_count) {       //如果读入字符串个数达到上限，增加上限             str_count+=GESHU;             pS=(char **)realloc(pS,str_count*sizeof(char *)); //重新扩展内存分配         }         int str_len=strlen(buf)+1;         *(pS+i)=(char *)malloc(str_len*sizeof(char)); //给字符串指针分配内存空间         strcpy(*(pS+i),buf);                         //将字符串读入指针空间中         ++i;     }     printf("\n");     for(int i=0;i<str_count;++i) {           //+++在这里我验证了，pS的内容。证明它确实是字符串数组的指针。         printf("%d %s\n",i,*(pS+i));     }     char *pstr=hb_zifuchuan(pS);     printf("\n shuchu zuihou de zifuchuan:%s",pstr);     return 0; } char *hb_zifuchuan(char **pS) {     char *p=(char *)malloc(BUF_len*str_count*sizeof(char));     printf("\n");     for(int i=0;i<str_count;++i) {                    //+++为什么在这函数就不能读出字符串数组呢？？         printf("%d %s",*(pS+i));     }     size_t char_cnt=0;     size_t zong=0;     for(int i=0;i>0;++i) {         size_t str_len=strlen(*(pS+i));   //定义字符串数组中每个字符串的长度，及其长度是多少？         if (*(pS+i)=NULL) break; //如果字符串长度为0，那么终止循环，         ++char_cnt; //每循环一次char_cnt的数目加1 ，即用来计算有几个字符串         *(*(pS+i)+str_len)='\n'; //给字符串最后换成\n         *(*(pS+i)+str_len+1)='\0'; //给字符串添加\0         char *pT=NULL;         zong+=str_len+2*char_cnt;         pT=(char *)realloc(p,zong*sizeof(char));         if(!pT) {             printf("\n kuozhan chu cuo le.");             free(p);             p=NULL;             break;         }         p=pT;         strcat(p,*(pS+i));     }     return p; }

user: user-3
content: 你能不能打空格，我看的很累

user: user-3
content: 说错了，换行
user-0 提问: 请问这个声明的具体含义

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

user: user-2
content: 引用 5 楼 jiqiang01234 的回复:typedef void (*P)(); typedef void (*F)(P); F[10]; 应该是这样吧：typedef void (*P)(); typedef void (*F)(P); F b[10];声明一个函数指针数组，该数组的元素类型为指向如下函数原型的函数地址： void func1(void (*)(void)); 该函数的参数是一个指向如下函数类型的函数指针： void func2(void); 所以，调用 func1 这样的函数时，应该是这样的语法： func1(func2); 对于如上声明，给数组赋值如下： F b[10]; b[0] = func1; 通过指针调用函数： b[0](func2);

user: user-3
content: typedef void (*P)(); typedef void (*F)(P); F[10];

user: user-4
content: 声明的这个函数指针还是个数组，有10个如上所述的元素

user: user-4
content: 声明一个的是一个函数指针，指向返回值为void类型、参数为又一个函数指针的函数  其中参数的那个函数指针是返回void类型的无参函数

user: user-5
content: 引用 1 楼 cjqpker 的回复:void (*b[10]) (void (*)());  声明了一个函数指针数组吧 指针指向这样的函数 ： 无返回值，有一个函数指针类型的参数，这个类型描述为void (*)()  是“定义”，不是声明。

user: user-5
content: void (*b[10]) (void (*)());  声明了一个函数指针数组吧 指针指向这样的函数 ： 无返回值，有一个函数指针类型的参数，这个类型描述为void (*)()
user-0 提问: C怎么处理matlab的mat数据 

回复:
user: user-1
content: 参看：  http://blog.csdn.net/left_la/article/details/8206645 http://wenku.baidu.com/link?url=xSIdthvnyJjzR45PhzLf0sxtoVGKLGvOtuI41wonZfc-pfFEtTOGbgr1X3nygZFPnOav8oeUoqC91TSlpRyrcfQVbKRwItrBbfg8_Q3Bsoi

user: user-2
content: 我觉得你在MATLAB里读入mat，然后把数据输出到c可以读的纯文本文件中更简单省事。 就是不知道MATLAB能不能生成和读写文本文件，我猜应该可以吧。

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

回复:
user: user-1
content: 楼主，你好，我想知道这个算法正确吗，我算出来的跟CRC calculator计算的结果不一样啊。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 引用 1 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。    多谢赵4老师的教诲，但是现在问题不是需要我断点、调试的问题，发帖前我已经实验了不知多少次了，学习的道理我知道，但至少对于解决这个问题没有帮助，对于crc校验我搜集了网上的很多资料，但是仍然有不懂的地方，因此想通过这个源代码的注释来点破我理解上的困难，您如果知道如何理解，请您写出注释为我指点迷津，谢谢。

user: user-0
content: 多谢赵4老师的教诲，但是现在问题不是需要我断点、调试的问题，发帖前我已经实验了不知多少次了，学习的道理我知道，但至少对于解决这个问题没有帮助，对于crc校验我搜集了网上的很多资料，但是仍然有不懂的地方，因此想通过这个源代码的注释来点破我理解上的困难，您如果知道如何理解，请您写出注释为我指点迷津，谢谢。

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

回复:
user: user-0
content: 非常感谢，问题以及解决，但是CB里说没有True以及False的声明以及实现....（我自己宏定义了TRUE FALSE）

user: user-1
content: -stc=c99

user: user-2
content: #include <stdbool.h>

user: user-3
content: C99标准写的是_Bool吧。