Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 在poj做题时 超时了 求大神们看一下怎么可以优化一下

回复:
user: user-0
content: http://poj.org/problem?id=1002 题目 求大神啊

user: user-1
content: LZ程序超时的主要原因是： （1）判断部分的程序陷入死循环 （2）排序不够快  还有数组不够大。  如下修改AC:  #include <stdio.h> #include <stdlib.h> #include <string.h> int cmp(const void *a, const void *b) {   return strcmp((char *)a,(char *)b); } int main(void) {   int count;   int count2=1;   scanf("%d",&count);   int i;   int j;   int right=0;   char h[9];   void change(char*, char*);//char* change(char*);   char a[50];//char a[100][20];   char (*b)[9] = new char[count][9];//char b[100][9];   for(i=0;i<count;i++)   {     scanf("%s",a);//scanf("%s",a[i]);     change(a, b[i]);//strcpy(b[i],change(a[i]));   }    /*   for(i=0;i<count-1;i++)     for(j=i+1;j<count;j++)     {       if(strcmp(b[i],b[j])>0)       {         strcpy(h,b[i]);         strcpy(b[i],b[j]);         strcpy(b[j],h);       }     }     */   qsort(b, count, sizeof(b[0]), cmp);      for(i=0;i<count;i++)     {       while(i<count-1 && strcmp(b[i],b[i+1])==0)       {         i++;         count2++;       }       if(count2>1)       {         printf("%s %d\n",b[i],count2);         count2=1;         right=1;       }     }     if(right==0)     {       printf("No duplicates.\n");     }      return 0; } void change(char* a, char *b)//char* change(char* a) {   int count=0;   int i=0;   //char b[9];   //char *p=b;   for(;*(a+i)!='\0';i++)   {     if(*(a+i)=='-')     {       continue;     }     else if(count==3)     {       b[3]='-';       i--;       count++;     }     else if(*(a+i)>='0'&&*(a+i)<='9')     {       b[count]=*(a+i);       count++;     }     else if(*(a+i)=='A'||*(a+i)=='B'||*(a+i)=='C')     {       b[count]='2';       count++;     }     else if(*(a+i)=='D'||*(a+i)=='E'||*(a+i)=='F')     {       b[count]='3';       count++;     }     else if(*(a+i)=='G'||*(a+i)=='H'||*(a+i)=='I')     {       b[count]='4';       count++;     }     else if(*(a+i)=='J'||*(a+i)=='K'||*(a+i)=='L')     {       b[count]='5';       count++;     }     else if(*(a+i)=='M'||*(a+i)=='O'||*(a+i)=='N')     {       b[count]='6';       count++;     }     else if(*(a+i)=='R'||*(a+i)=='S'||*(a+i)=='P')     {       b[count]='7';       count++;     }     else if(*(a+i)=='T'||*(a+i)=='U'||*(a+i)=='V')     {       b[count]='8';       count++;     }     else if(*(a+i)=='W'||*(a+i)=='X'||*(a+i)=='Y')     {       b[count]='9';       count++;     }   }   b[count]='\0';   //return p; }
user-0 提问: TC中能用的bios.h 里边bioskey（）函数，在VC中有没有类似的函数，能输入按键？

回复:
user: user-1
content: 珍惜生命，换本比你自己年轻的教材吧。

user: user-0
content: 有木有人啊啊。。求助
user-0 提问: tc 编译 链表 指针那里，一直说我定义确实； ！！！！！！！！

回复:
user: user-1
content: 引用 5 楼 alalalalalqp 的回复:我typedef过，notetype不就等于struct notetype了吗17行 你才能说你 typedef过了 可你的错误是出现在 16行  明白了吗

user: user-0
content: 我typedef过，notetype不就等于struct notetype了吗

user: user-0
content: 我typedef 过了，不是应该不用再写struct了么

user: user-2
content: 没有简不简单，要看你学到什么程度，如果是做个设计，MFC的基础知识应该就可以了。

user: user-3
content: struct NodeType *next

user: user-4
content: 楼上正解 NodeType * next;改成struct NodeType * next;

user: user-5
content: struct NodeType * next;

user: user-0
content: 引用 6 楼 ylbhz 的回复:请扔掉TC，我用VC6已经觉得太老了，你还在用TC，佩服。    做个课程设计而已，TC图形界面好学，VC 图形界面是不是要学windows API的？简单不？能介绍下经验不

user: user-5
content: 引用 5 楼 alalalalalqp 的回复:我typedef过，notetype不就等于struct notetype了吗 在你定义next的那行，你的typedef语句还没有完结，也就没有生效

user: user-2
content: 请扔掉TC，我用VC6已经觉得太老了，你还在用TC，佩服。
user-0 提问: 关于memcpy不考虑内存重叠的问题

回复:
user: user-1
content: memmove会处理重叠的情况，memcpy不会。memcpy主要是性能上的考虑，memmove主要是安全性上的考虑。

user: user-2
content: 单步跑，看看过程

user: user-3
content: 不保证有正确结果  为什么都理解为  保证有不正确的结果   语文问题??

user: user-4
content: 学习一下

user: user-5
content: lz 自己设个断点，看看str 的变化

user: user-6
content: char str[200] = "abcdefghijklmnopq";  printf( "%s\n", memcpy( str+4 , str+8, 6 ) ); 看看是什么效果

user: user-7
content: C库就有说明，如果内存有重叠，函数会考虑拷贝方向，使得重叠处的字节能正确拷贝

user: user-8
content: 编译器会优化吧

user: user-9
content: 必须memmove。

user: user-10
content: 我这几个编译器, 输出 abcd , aaaa 的都有, 还有输出 abcc 的...

user: user-11
content: 对于memcpy来说，overlap属于未定义行为，就是说，编译器的设计者可以不考虑overlap情况，但并非必须不考虑overlap，懂了没？

user: user-10
content: 内存重叠的memcpy是未定义行为, 输出 aaaa , abcd 的都有, 常见的 M$ CRT, 高点版本的 glibc/eglibc 的运行库下, memcpy行为都跟 memmove 一样...
user-0 提问: 帮忙看看：这个顺序表怎么传参？

回复:
user: user-1
content: 引用 6 楼 zhang5476499 的回复:[quote=引用 4 楼 user-1 的回复:] [quote=引用 3 楼 zhang5476499 的回复:] 这个函数好像不正确吧？void Clear_List(SqList L) {     L.length=0; }  why?  实践是检验真理的唯一标准[/quote]洗耳恭听！请赐教！[/quote]  输入代码，运行看看

user: user-0
content: 引用 4 楼 user-1 的回复:[quote=引用 3 楼 zhang5476499 的回复:] 这个函数好像不正确吧？void Clear_List(SqList L) {     L.length=0; }  why?  实践是检验真理的唯一标准[/quote]洗耳恭听！请赐教！

user: user-0
content: 本人想尽了所有主调函数的调用方式，都不知道怎么清空表。请帮忙写下主调函数。

user: user-1
content: 引用 3 楼 zhang5476499 的回复:这个函数好像不正确吧？void Clear_List(SqList L) {     L.length=0; }  why?  实践是检验真理的唯一标准

user: user-0
content: 这个函数好像不正确吧？void Clear_List(SqList L) {     L.length=0; }

user: user-1
content: 结构体可以赋值，copy,当参数时by value

user: user-0
content: 还有就是最让人费解的就是这个清空顺序表的函数： void Clear_List(SqList L) { 	L.length=0; } 在此函数中，L.length=0啦，但是主调函数的L.length也等于0嘛？
user-0 提问: 由一种文本文件生成固定格式文件的问题

回复:
user: user-1
content: 格式xml，文本，二进制都可以吧，二进制稍微麻烦点，建议写一个读、写脚本。。。

user: user-0
content: 引用 2 楼 qq120848369 的回复:xml, ini啊。 现在就是需要根据不规则的技术文档生成ini文件，能否详述一下步骤？

user: user-0
content: 谢谢大家的回复 我试试吧！

user: user-2
content: 引用 3 楼 u011498034 的回复:[quote=引用 2 楼 qq120848369 的回复:] xml, ini啊。 现在就是需要根据不规则的技术文档生成ini文件，能否详述一下步骤？[/quote]  这么简单的格式你还生成不出来啊？

user: user-2
content: xml, ini啊。

user: user-3
content: 写一个分析文件，生成文档的程序
user-0 提问: ？关于c primer plus 程序7.5中while（scanf（“%lu",&num)==1)

回复:
user: user-1
content: 引用 6 楼 FancyMouse 的回复:while(scanf("%lu",&num)==1);//这个输入数字依然等待输入，除非输入非数字才继续  多了个分号 ++ 这个是问题的关键！！！

user: user-2
content: while(scanf("%lu",&num)==1);//这个输入数字依然等待输入，除非输入非数字才继续  多了个分号

user: user-3
content: 引用 楼主 longwngtang 的回复:#include<stdbool.h> #include<stdio.h> int main(void) {     unsigned long num;     unsigned long div;     bool isPrime;      printf("Please enter an integer for analysis;");     printf("Enter q to quit .\n");     while(scanf("%lu",&num)==1);//这个输入数字依然等待输入，除非输入非数字才继续     {         for(div=2,isPrime=true;(div*div)<=num;div++)         {             if(num%div==0)             {                 if((div*div)!=num)                 printf("%lu is divisible by %lu and %lu.\n",                       num,div,num/div);                 else                     printf("%lu is divisible by %lu.\n",num,div);                 isPrime=false;             }         }         if(isPrime)            printf("%lu is prime.\n",num);         printf("Please enter anotherinteger for analysis;");         printf("Enter q to quit .\n");     }     printf("Bye.\n");     return 0; } 同时按下"CTRL"键和"Z"键。表示"EOF"输入结束，回车就ok了

user: user-4
content: 引用 3 楼 user-5 的回复:scanf reads from stdin under control of format, and assigns converted values through subsequent arguments, each of which must be a pointer. It returns when format is exhausted. fscanf returns EOF if end of file or an error occurs before any conversion; otherwise it returns the number of input items converted and assigned.      最简单的，这里可以在输完数字后输ctrl+z 再回车

user: user-5
content: scanf reads from stdin under control of format, and assigns converted values through subsequent arguments, each of which must be a pointer. It returns when format is exhausted. fscanf returns EOF if end of file or an error occurs before any conversion; otherwise it returns the number of input items converted and assigned.

user: user-0
content: scanf("%lu",&num)的返回值为1时while（）成立，为什么输入数字后这个程序不继续运行也不推出。

user: user-0
content: 新手，codeblocks，
user-0 提问: 为什么相同的结构体指针增量操作在不同代码有的编译正常，有的出现错误?

回复:
user: user-1
content: 第二程序的 ++操作是错误的！ 数组名怎么++ 数组和指针完全不是一个东西的，指针可以，数组不一定可以的！ 下载这本c和指针看看吧！ http://download.csdn.net/detail/max_min_/6333711

user: user-2
content: 第二个程序中，p->name 是数组名 你认为可以++吗？？  数组名，虽然也能当指针使用，但是这个指针是个指针常量，不可变的； ++需要左值,所以错了。  另外，第一个程序，虽然编译和运行没有错误。 不过这种用法，是有问题的。 不管，这个指针是否左值，这个指针实际意义是，指向一个字符串，这个字符串，是一个名字。  做了++以后，他就不能指向，完整的字符串了。 如果其他地方，也用到这个指针，那么你只能得到这个名字的一部分，  那么程序就出错了。 这个程序就不正确了。  这种程序逻辑错误，最麻烦了。  PS： 如果只是研究一下，这么做没什么。  如果是在项目中，千万不能这么做。

user: user-3
content: If the type of an expression or subexpression is ``array of T,'' for some type T, then the value of the expression is a pointer to the first object in the array, and the type of the expression is altered to ``pointer to T.'' This conversion does not take place if the expression is in the operand of the unary & operator, or of ++, --, sizeof, or as the left operand of an assignment operator or the . operator

user: user-4
content: 楼主第二个程序中的红色语句不合法是可以肯定的，p->name对应的是一个地址常量，不能认为是左值，固然不可以作为++的操作数了。。。
user-0 提问: 结构体指针查找报错

回复:
user: user-1
content: if (temp == p1 ->name) 字符串比较大小是需要使用strcmp或者strncmp函数的，不可以直接进行比较哦。

user: user-2
content: 你那个free（p）为什么要加呢？你又没申请内存，释放的是什么啊？这个去掉吧

user: user-0
content: 试了，还是不行。不过，还是谢谢你。

user: user-3
content: 差不多是这样

user: user-0
content: 你好，不是很懂你说的内容，但是我差不多知道问题出在哪里了。应该是给字符数组赋值的时候，方式不对造成的。但是，我又不知道具体该如何写这句话，是strcpy（p1->name，20，temp）这样吗？

user: user-3
content: while (p1 &&  p1 -> next !=NULL&& strcmp(temp ,p1->name) { ...... }  C 串其实是带结束符的字符数组，串名赋值，只是个对指针赋值， 用 = 赋值，不论是数组，还是指针，都是不对的。  要对数组的每一个元素赋值才行，记住要加结束符. 这可以使用库函数 strcpy。  比较也要比较每个字符， 这可以使用库函数strcmp
user-0 提问: 问个网络竞赛的问题

回复:
user: user-1
content: 找到函数main 使用的栈，修改 n 所在位置的数据，使之 ＝0 由于不知道用的编译器，操作系统，和模式，比较麻烦 如果是 DOS tiny 模式，C语言 main函数是第一个被调用的函数直接查找堆栈即可

user: user-2
content: 现在还正在比赛呢！你这样搞有意思么 你说你要是在做的过程中遇到单方面的问题出来问 没什么 你直接把题拿出来问有意思么！！！ 如果大家知道怎么做的话 请在比赛结束后在给出答案 现在还正在比赛呢 此题的地址： https://ctf.xdsec.org/?m=article&id=31 有兴趣的 也可以注册一个号码 去打打酱油

user: user-0
content: 谁来给点思路什么的
user-0 提问: 结构体指针中的前置++问题

回复:
user: user-1
content: 对于运算符不管怎么变只需要记住2点：1是运算符的左右结合规则，2是运算符的优先级别。这2点直接影响最终结果

user: user-2
content: 引用 2 楼 qq120848369 的回复:(*ptr->name+8), 这是一个左值, 不能应用++操作符. 就像你没办法这样写：++(1+2)是一样的。  说错了，左值 -> 右值

user: user-3
content: 引用 13 楼 lm_whales 的回复:++ 不是和*(ptr->name+8)结合的，而是是和(ptr->name+8)结合的 因为++的优先级高， 所以这个表达式的意思是，先 ++(ptr->name+8) 然后 *(ptr->name+8) (ptr->name+8) 是右值，不是左值； 所以 ++(ptr->name+8) 是个错误的表达式，右值不可以改变自身。 所以 ++ *(ptr->name+8) 也是错误的表达式； 你的说法有误，操作符何时能够越过另外一个操作符进行操作了？ 另外所谓的++优先级比*优先级高的说法,也只是因为他们的结合方向同属自右向左， 所以才会有*p++,等于*(p++)这种情况（++在右边，先结合），但事实上他们的优先级是同样的，同属第二优先级。  但前导的（左边的）++在某些编译器（貌似cosmic就是）里被分配到第一优先级中，这个优先级的结合方向是自左向右。 不过左边的++跟第二优先级的几个操作符结合起来使用的时候，不算出错的情况的话，事实上也和 在第二优先级一样~~  所以++ *(ptr->name+8) 不是错误的表达式。

user: user-4
content: ++ 不是和*(ptr->name+8)结合的，而是是和(ptr->name+8)结合的 因为++的优先级高， 所以这个表达式的意思是，先 ++(ptr->name+8) 然后 *(ptr->name+8) (ptr->name+8) 是右值，不是左值； 所以 ++(ptr->name+8) 是个错误的表达式，右值不可以改变自身。 所以 ++ *(ptr->name+8) 也是错误的表达式；

user: user-5
content: 根本不是楼上说的优先级啊等问题...是这样的，你要知道对一个指针（即地址）进行解引用后，该值是左值，可以理解为一个变量名，可以置于赋值号左边，而楼主说的第二种写法中的(*ptr->name+8)是一个中间结果，不是左值，而是右值，无对应的内存地址，所以不能当做++的左值使用..另外，++就含有赋值操作，所以它需要一个左值！

user: user-4
content: 再看看优先级吧！ ++ 比* 优先级高。 优先级，不知道，加括号！

user: user-4
content: ++(*(ptr->name+8)) 才行吧 ++ 和* 都是单目运算符，都是和(ptr->name+8) 结合，  (ptr->name+8)右值，不带++的；

user: user-0
content: 引用 1 楼 modyaj 的回复:,++(*ptr->name+8)) 都已经解引用了 他已经只是个值而已  相当于 int i = 10;  整个表达式右边的部分 那么数10都不能++  楼主的值当然也不能++  那么++*(ptr->name)也已经解引用了，为什么还可以前++ ？

user: user-6
content: 另外 自增运算符的优先级高于解引用

user: user-2
content: (*ptr->name+8), 这是一个左值, 不能应用++操作符. 就像你没办法这样写：++(1+2)是一样的。

user: user-6
content: ,++(*ptr->name+8)) 都已经解引用了 他已经只是个值而已  相当于 int i = 10;  整个表达式右边的部分 那么数10都不能++  楼主的值当然也不能++

user: user-7
content: ++*(ptr->name) == ++*ptr->name  关键是不能 +8 ++*(ptr->name+8)是表达式

user: user-8
content: 引用 5 楼 user-10 的回复:++*(ptr->name+8) ++(*ptr->name+8) 两个都是有错误的吧

user: user-6
content: 引用 4 楼 zaixiankaifa 的回复:[quote=引用 1 楼 modyaj 的回复:] ,++(*ptr->name+8)) 都已经解引用了 他已经只是个值而已  相当于 int i = 10;  整个表达式右边的部分 那么数10都不能++  楼主的值当然也不能++  那么++*(ptr->name)也已经解引用了，为什么还可以前++ ？[/quote] 如楼上所说！很好理解吧

user: user-9
content: 引用 4 楼 zaixiankaifa 的回复:[quote=引用 1 楼 modyaj 的回复:] ,++(*ptr->name+8)) 都已经解引用了 他已经只是个值而已  相当于 int i = 10;  整个表达式右边的部分 那么数10都不能++  楼主的值当然也不能++  那么++*(ptr->name)也已经解引用了，为什么还可以前++ ？[/quote] int a = 1; a++; //ok (a + 8)++;//不ok 和解引用没关系

user: user-10
content: ++*(ptr->name+8) ++(*ptr->name+8)
user-0 提问: 高分求助：CreatFile()函数读取字符串路径失败，错误代码123(文件名、目录名或卷标语法不正确。)

回复:
user: user-1
content: 楼主问题解决了吗，我的也是_wfopen打开文件出这个错。解决了可以说一下吗

user: user-2
content: 不知道楼主的问题解决了没有     在下也碰到了同样的问题    如果楼主的问题已解决，希望也能帮我一下     谢谢

user: user-0
content: 就没有人说吗？

user: user-0
content: 引用 4 楼 jerry_dqh 的回复:[quote=引用 3 楼 Auro_L 的回复:] 哪位大虾能给小弟解惑呢，已经调试12个小时了都没解决 这种函数一般还是路径错误了，或者你没有权限写。 路径中的"\",是不是要用双\\[/quote] 路径是没有错的，因为这是字符串数组，所以没必要用\\，而且我也测试过了，还是出错 我读取不是要写，而且我把第二个参数改成GENERIC_READ，还是一样的结果 最后我连函数换成FindFirstFile()还是出错，就是不能解析字符串中的路径

user: user-3
content: 引用 3 楼 Auro_L 的回复:哪位大虾能给小弟解惑呢，已经调试12个小时了都没解决 这种函数一般还是路径错误了，或者你没有权限写。 路径中的"\",是不是要用双\\

user: user-0
content: 哪位大虾能给小弟解惑呢，已经调试12个小时了都没解决

user: user-4
content: CreateFile  要看是否Unicode ，不匹配会出错  这个函数实际是个宏定义为 CreateFileA，CreateFileW 中的一个。

user: user-0
content: 引用 1 楼 user-5 的回复:在函数刚进入时加断点，检查输入参数pwchar_param_LogFile的内容。 是下面的那个CreatFile()函数，上面的是正常的，下面的第一个参数是字符串数组，数组内容是从文件中读取来的，内容也是路径没有错，可CreatFile()就是报错

user: user-5
content: 在函数刚进入时加断点，检查输入参数pwchar_param_LogFile的内容。
user-0 提问: goto 语句会不会引起内存错误 c语言

回复:
user: user-1
content: 关键是你知不知道自己在干什么……

user: user-2
content: goto和跳转处之间行数少，还是可以把

user: user-3
content: 引用 1 楼 jerry_dqh 的回复:goto语句本身不会引起内存错误，但是可能你用goto，导致流程有了问题，从而有内存没有释放或者分配，或者有空指针之类的问题。  正解。goto本身不会引起内存错误。

user: user-4
content: 设置标志，goto统一进行处理最后结果

user: user-5
content: goto还是有其好处的，但不能滥用。 至于能否导致内存泄漏则要具体问 题具体分析，不能一句话定性。不过 在到处都是指针（非智能指针）的情 况下，导致内存泄漏的几率确实很大。

user: user-6
content: 尽量不要使用goto，否则用多了，会让你的程序看起来执行流程很乱，而且容易发生问题。

user: user-7
content: 关键不在于用的多少，而是在于用在什么地方。如楼上说的goto用来处理错误跳转是绝对好用的。而且很多优秀的开源代码都在用goto作为错误处理机制。 但是在其它用途上使用goto我倒是见得不多。所以goto不是能不能用的问题，也不是用的多少的问题，而是用的时候有没有原则的问题。

user: user-8
content: goto在处理错误跳转时绝对好用，还应该提倡。

user: user-9
content: 引用 22 楼 nadleeh123 的回复:[quote=引用 21 楼 qq523176585 的回复:] [quote=引用 20 楼 nadleeh123 的回复:] [quote=引用 2 楼 qq523176585 的回复:] 尽量不要使用goto语句  呵呵[/quote]  [/quote] 没事去看看内核编程的出错处理吧，用goto是标准模式[/quote]  目前还接触不到，我只是一个菜鸟，还有很多需要学习的地方。我觉得由浅入深的好一点，

user: user-10
content: 任何语句都不会引起内存错误. 只要正确使用. goto少用,但是有的时候使用会使代码更简洁. goto比较经典的使用请参考linux内核.几乎重要的模块都用使用goto的情况.

user: user-11
content: 引用 21 楼 qq523176585 的回复:[quote=引用 20 楼 nadleeh123 的回复:] [quote=引用 2 楼 qq523176585 的回复:] 尽量不要使用goto语句  呵呵[/quote]  [/quote] 没事去看看内核编程的出错处理吧，用goto是标准模式

user: user-9
content: 引用 20 楼 nadleeh123 的回复:[quote=引用 2 楼 qq523176585 的回复:] 尽量不要使用goto语句  呵呵[/quote]

user: user-11
content: 引用 2 楼 qq523176585 的回复:尽量不要使用goto语句  呵呵

user: user-12
content: 用好就行了 。

user: user-13
content: 关键还看goto到什么地方吧。

user: user-14
content: 如果没有分配公共资源的函数调用（例如：打开文件、创建句柄、在堆上分配内存 等）和goto搅在一起，绝对就不会有资源泄露问题，除非编译器有Bug。

user: user-15
content: 你怎么使用的？

user: user-16
content: 用起来很爽,改起来就麻烦了.我没用过,用的好也许能实现一些难以解决的问题.

user: user-17
content: 不会内存错误，倒是存在潜在的内存泄漏！核心代码用goto非常普遍，但是用户程序还是尽量少用吧。

user: user-18
content: 建议用switch case语言来替换goto
user-0 提问: 多个线程可以共用一个目的窗口句柄吗

回复:
user: user-1
content: 窗口句柄可以跨线程操作，不过如果是新建子窗口，在新线程也必须写上消息循环

user: user-2
content: postmessage是异步的，在消息响应函数里你会把参数取出来使用对吧，有可能这个参数已经无效了。栈上的变量离开作用域时会被销毁，其生存期结束。

user: user-3
content: 既然发送消息给窗口,那共用一个窗体句柄,一个消息,无所谓啦.  PS:头像是你嘛,好漂亮呀

user: user-0
content: 引用 10 楼 lm_whales 的回复:发消息没有区分来自那个串口吧！ 不知道是不是和互斥有关 http://bbs.csdn.net/topics/390606033

user: user-0
content: 引用 11 楼 dahaiI0 的回复:一发命令就死机.问题太抽象 http://bbs.csdn.net/topics/390606033就是这个

user: user-0
content: 引用 3 楼 dahaiI0 的回复:窗口跟串口没什么关系，共用一个自然木问题，不过PostMessage的时候要注意参数的生存期 生存期是什么意思？可以具体解释一下吗？万分感谢

user: user-2
content: 窗口跟串口没什么关系，共用一个自然木问题，不过PostMessage的时候要注意参数的生存期

user: user-2
content: 一发命令就死机.问题太抽象

user: user-4
content: 发消息没有区分来自那个串口吧！

user: user-0
content: 引用 2 楼 user-5 的回复:主线程　每次都是从消息队列里面取出消息来处理　并不管他们来自哪里　它视所有属于他的消息都一样　个人觉得　WM_MYMSG　可以共用　　楼主可以小试一下效果啊恩，现在能收到东西，而且似乎也正常，但是老是一发命令就死机，是不是双串口涉及多线程操作导致的呢？

user: user-0
content: 引用 6 楼 dahaiI0 的回复:postmessage是异步的，在消息响应函数里你会把参数取出来使用对吧，有可能这个参数已经无效了。栈上的变量离开作用域时会被销毁，其生存期结束。恩，现在能收到东西，而且似乎也正常，但是老是一发命令就死机，是不是双串口涉及多线程操作导致的呢？

user: user-0
content: 引用 6 楼 dahaiI0 的回复:postmessage是异步的，在消息响应函数里你会把参数取出来使用对吧，有可能这个参数已经无效了。栈上的变量离开作用域时会被销毁，其生存期结束。恩，现在能收到东西，而且似乎也正常，但是老是一发命令就死机，是不是双串口涉及多线程操作导致的呢？

user: user-5
content: 主线程　每次都是从消息队列里面取出消息来处理　并不管他们来自哪里　它视所有属于他的消息都一样　个人觉得　WM_MYMSG　可以共用　　楼主可以小试一下效果啊

user: user-0
user-0 提问: 请教各位这个宏定义该怎么理解，祝大家国庆快乐！

回复:
user: user-1
content: \是续行符的意思 至于宏里面带；这个，可以把整个宏定义后面的内容用一对{}这个括起来吧

user: user-2
content: 引用 5 楼 qq120848369 的回复:do {} while(0) 正解！

user: user-3
content: do {} while(0)

user: user-4
content: c 语言中， 见分号才算一行 define 中用 \ 将两行连接起来

user: user-2
content: 还是不够好，想想下面语句： if (...)     MSE_DEMAND_M9_CFG(...); else     doSomething();  编译都过不了  引用 1 楼 user-6 的回复:斜杠是连接符的意思。这样写比较好： #define  MSE_DEMAND_M9_CFG(pszPath, szData) \{          bufclr(szData); \          DemandInXmlExt((PXMLSTRU)pxmlstru, pszPath, szData, sizeof(szData));}

user: user-5
content: define的内容当然可以有分号，不然怎么玩复杂的语法糖？

user: user-6
content: 斜杠是连接符的意思。这样写比较好： #define  MSE_DEMAND_M9_CFG(pszPath, szData) \{          bufclr(szData); \          DemandInXmlExt((PXMLSTRU)pxmlstru, pszPath, szData, sizeof(szData));}
user-0 提问: c语言反汇编

回复:
user: user-1
content: 这是按照嵌入汇编，显示的反汇编代码 0x80484a0 明显是C格式，不是汇编格式

user: user-2
content: 这个地址应该是全局数据区的地址,在PE中是rdata这个数据节,他存储的是一些编译时需要的常量,比如 char szTemp[] = "abcd",这个"abcd"就是存储在rdata这个数据节中的.至于你说的超出程序地址空间的地址.我猜可能是你看错了!
user-0 提问: C语言， vsnprintf 打印方法

回复:
user: user-1
content: 这个问题有两个解决方案，第一个难度比较大，就是自己解释格式，自己输出，够24个换行继续输出。 //第二个，把所有数据输出到字符数组中，每次截取lensize个输出 //每行只打印lensize 个字符 int myprintf(const int lensize,const char *fmt,... ) {    char *buff=NULL;      const int termsize =4;      va_list lst;      va_start (fmt,lst);      int n = vscprintf(fmt,lst);      buff =(char *) malloc ((n + termsize )* sizeof(char));      vsnprintf(buff,n,fmt,lst);            char *pcurr =buff,*pterm;      char swaper =0;      pterm =pcurr + linesize;       //每次取出linesize字节输出，最后不足linesize的单独输出，没有处理'\t'字符。           //为了节省复制数据的操作，下面取个巧       //数据分段输出，具体方法是每个linesize个字符，输出一次      //每次输出，在分段处做替换，过程如下        //保存要被替换的字符，字符替换成结束符，输出数据,字符替换回来。      while(pterm < buff+n)      {          swaper =*pterm; //保存，被替换的数据，，          *pterm = '\0';  //替换为结束符          printf("%s\n",pcurr);          *pterm= swaper;   //替换回来          pcurr +=  linesize; //指针位置，增加linesize。          pterm += linesize;  //      }       if(pcurr< pbuf + n )          printf("%s\n",pcurr);      free(pbuff);      va_end(lst);   }   Ps ： printf 替换为 a_debug 就差不多了。

user: user-2
content: 熟悉vsnprintf的返回值，你才能写出正确的程序，兼具效率与灵活性，选一个折衷方案：  #include <stdio.h> #include <stdlib.h> #include <stdarg.h>  typedef void (*line_callback)(const char *line, int bytes);  void printf_callback(const char *line, int bytes) {     printf("%.*s\n", bytes, line); }  int limited_printf(const char *fmt, int chars_per_line, line_callback cb, ...) {     if (!fmt || !cb || chars_per_line <= 0)         return -1;      va_list ap;     va_start(ap, cb);      char minimal[1024];      char *buf = minimal;     int size = sizeof(minimal);          int ret = vsnprintf(buf, size, fmt, ap);     if (ret >= sizeof(minimal))     {         size = ret + 1;         buf = malloc(size);         ret = vsnprintf(buf, size, fmt, ap);     }      int i;     for (i = 0; i < ret; i += chars_per_line)         cb(buf + i, ret - i >= chars_per_line ? chars_per_line : ret - i);      if (size != sizeof(minimal))         free(buf);     return 0; }  int main(int argc, char *argv[]) {     limited_printf("%s", 2, printf_callback, "1234567");     return 0; }

user: user-0
content: 引用 4 楼 missheaven2011 的回复:对debug进行打印啊，24字节打印一下，人为控制下应该就可以了  怎样人为控制呢？？

user: user-3
content: http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fvsnprintf.htm

user: user-4
content: 对debug进行打印啊，24字节打印一下，人为控制下应该就可以了

user: user-5
content: 没有完全明白。 a_debug() 是什么函数？不支持多行输出吗？

user: user-0
content: 引用 1 楼 N_sev7 的回复:int vsnprintf(char *str, size_t size,  const  char  *format,  va_list ap); 参数说明: char *str [out],把生成的格式化的字符串存放在这里. size_t size [in], buffer可接受的最大字节数,防止产生数组越界. const char *format [in], 指定输出格式的字符串，它决定了你需要提供的可变参数的类型、个数和顺序。 va_list  ap [in], va_list变量. va:variable-argument:可变参数 然后呢？

user: user-6
content: int vsnprintf(char *str, size_t size,  const  char  *format,  va_list ap); 参数说明: char *str [out],把生成的格式化的字符串存放在这里. size_t size [in], buffer可接受的最大字节数,防止产生数组越界. const char *format [in], 指定输出格式的字符串，它决定了你需要提供的可变参数的类型、个数和顺序。 va_list  ap [in], va_list变量. va:variable-argument:可变参数
user-0 提问: 如何给结构体成员赋值问题

回复:
user: user-1
content: 没有错误吧！ 楼主 clean下，再make试试

user: user-2
content: gcc4.6无压力。

user: user-3
content: vs08全都没有问题（包括注释了的——）

user: user-4
content: codeblock with mingw-gcc 4.6.2没有问题。

user: user-5
content: 别太在意不同编译器的结果不同，毕竟不是搞编译器的。。。。

user: user-6
content: struct point { int x; int y; }; The keyword struct introduces a structure declaration, which is a list of declarations enclosed in braces. An optional name called a structure tag may follow the word struct (as with point here). The tag names this kind of structure, and can be used subsequently as a shorthand for the part of the declaration in braces.  那是初始化，不是赋值

user: user-7
content: 学习了！

user: user-8
content: struct student st={"John",100}; 只能在结构体定义的地方这样初始化； 如果在其他地方，就只能逐个成员初始化了，所以 st={"John",100}是不行的

user: user-9
content: 1.没见过 student st={"John",100},*ptr;的写法。不过在vs2010上可以通过。你说的不能在gcc4.2上通过，肯定是编译器的问题，我没有4.2的gcc所以没试，可以找个4.2的机子再试试，看是否是因为缺少了什么。应该还可以通过gcc网站查看不同的版本有哪些不同。 2.我了解的赋值方式就是你说的struct student st={"John",100};或者:st.name="John";st.score=100;

user: user-10
content: C语言标准是需要struct student st带struct定义结构体变量的，student st的话并不是所有编译器都支持的，如果一定要用student st的话，那么最好用typedef进行定义： typedef struct student{ 		char name[20]; 		int score; 	}student;  引用 楼主 zaixiankaifa 的回复:#include <stdio.h>  int main() { 	struct student{ 		char name[20]; 		int score; 	};  	struct student st={"John",100},*ptr; 	//	  student st={"John",100},*ptr; 		ptr=&st;  	printf("ptr->name=%s\n",ptr->name);  return 0; }        用gcc 4.2编译器无法编译：//	  student st={"John",100},*ptr;,但是用VS08却可以, 是不是编译器问题？       另外用gcc 4.2也无法这样编译：st={"John",100};是不是只能这样赋值：struct student st={"John",100};或者:st.name="John";st.score=100; ?
user-0 提问: 请大家给我个方向 

回复:
user: user-1
content: tcpcopy啊, 学习一下.

user: user-2
content: 网络搜索下"FTP" 参考下

user: user-3
content: 引用 6 楼 chen908987082 的回复:谢谢各位的帮助，最近在找工作，但是没什么项目，能不能推荐一些能写在简历上的LINUX网络项目，我打算一周搞定，谢谢各位  不如静下心看：unix网络编程

user: user-0
content: 谢谢各位的帮助，最近在找工作，但是没什么项目，能不能推荐一些能写在简历上的LINUX网络项目，我打算一周搞定，谢谢各位

user: user-4
content: 文件传输FTP靠谱点！ 找FTP的源码学习学习吧！

user: user-5
content: 了解一下socket编程~然后自己定义一下通讯协议!

user: user-6
content: 参考wget源码。  引用 楼主 chen908987082 的回复:有语言基础，想做个小项目：linux下网络文件传输工具（一周时间内），但是不知道如何下手
user-0 提问: c++ primer

回复:
user: user-1
content: 抱歉，发错地方了  这里解释一下你的问题： 这句话的实质是 1）地址本身是不区分类型的，你可以用同一个地址，存储不同类型（字节数）的数据。 2）某地址中的数据类型，是地址所代表的存储单元，内部存储的数据的类型（数据大小，字节数）。

user: user-1
content: 网上搜到的的一个算法  http://www.ahathinking.com/archives/103.html  你可以看一看。

user: user-2
content: 我们可以用一个地址是指任何几个不同大小的位地址字节集

user: user-3
content: 我们可以使用一个地址来引用任何几个不同大小的字节地址位的集合 大概的意思就是，可以用一个地址给不同类型的变量赋值，不同类型的变量的位的个数是不一样的，例如当你给int赋值时collections of bits是32，char就是8，但是都是字节的的整数倍，下次再贴这样的句子的时候最好能把上下文都贴上，那样别人帮你理解起来也简单些
user-0 提问: 关于IOCCC的一道题，兴趣看看

回复:
user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:A[B] 等价于 *(A+B) 等价于 *(B+A) 等价于 B[A]  赵老师正解

user: user-2
content: A[B] 等价于 *(A+B) 等价于 *(B+A) 等价于 B[A]

user: user-2
content: 对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 除了“加数”可以任意交换外，还有什么？

user: user-4
content: 引用 2 楼 qq523176585 的回复:VC下编译通不过哈。。。。 C专家编程里面有讲这个。。。。   VC上面需要定义一个宏  #define unix 1  其实和这个是差不多的 "abcde"[1] = 1["abcde"] = 'b';"abcde"是一个指向'a'的地址

user: user-4
content: VC下编译通不过哈。。。。 C专家编程里面有讲这个。。。。

user: user-5
content: http://www.cnblogs.com/me_hades/archive/2011/08/06/2129726.html 这里面解释了。

user: user-6
content: 仅仅限于有印象而已

user: user-7
content: 在VS中编译不过？ 是要加#define unix 1 吗？ 输出的东西好诡异！
user-0 提问: ACM 寻找素数对

回复:
user: user-1
content: 用筛法把10000以内的素数筛出来.

user: user-2
content: 方向要反，这样找到第一个就是所求的，如果还不行 为了提高速度，可以先把10000以内的素数先求出来，然后在程序里面查表就可以了
user-0 提问: 关于链码表转线段表的问题

回复:
user: user-1
content: 我的理解是,所谓“中间点、左端点、右端点”是指端点在线段围成的区域的相对方位，而不是指端点在线段中的方位。请看下例（其中数字代表方向）：

user: user-2
content: 5 6 7 4 X 0            八联通示意图 3 2 1

user: user-3
content: 不知所云，无法回答

user: user-0
content: 自己 顶一下  啊
user-0 提问: 请教free函数的作用

回复:
user: user-1
content: 引用 6 楼 u012287871 的回复:可是执行后，是正确的结果，并且是唯一的结果啊 [quote=引用 3 楼 lin5161678 的回复:] 这么做是不对的  未定义行为了[/quote]不做保证  你换一个编译 换一下编译参数 结果可能就不对了

user: user-2
content: free只是释放了指针所指向地址的空间，本质上就是做了一些标记而已，所以指针及空间内容都还是存在的，只不过有隐患罢了。  引用 4 楼 u012287871 的回复:那current->next这个指针本身，不是在current指向的内存块中存储的吗？ [quote=引用 1 楼 turingo 的回复:] free的是current所指向地址的内存，而不是current->next所指向地址的内存。  [quote=引用 楼主 u012287871 的回复:] 我看c primer的书里，有这么个结构 struct film{     char title[TSIZE];     int rating;     struct film * next; } 下面的current, head都是这个结构的指针。 在清理列表的时候 current = head; while(current != NULL) {     free(current);     current = current->next; } 这里我理解的是，free()已经释放了current指向内存，可是，为什么current->next还是可以指向这个指针成员？[/quote][/quote]

user: user-0
content: 引用 11 楼 mingliang1212 的回复:[quote=引用 6 楼 u012287871 的回复:] 可是执行后，是正确的结果，并且是唯一的结果啊 [quote=引用 3 楼 lin5161678 的回复:] 这么做是不对的  未定义行为了[/quote]  看本好书。 你判断正确和错误的标准有问题。 google 未定义行为 [/quote]  好的~感谢提醒~~

user: user-3
content: 引用 6 楼 u012287871 的回复:可是执行后，是正确的结果，并且是唯一的结果啊 [quote=引用 3 楼 lin5161678 的回复:] 这么做是不对的  未定义行为了[/quote]  看本好书。 你判断正确和错误的标准有问题。 google 未定义行为

user: user-0
content: 我明白了！！！感谢大家的耐心回答！！结贴~~~~~~

user: user-4
content: free(current); //要求在此没有别的线程或进程修改current->next的值 current = current->next;

user: user-5
content: 释放的是当前的地址，它的next地址还是有效的 这是链表删除的基本操作吧！ 分配的内存谁分配谁释放，每分配一次，都必须对应释放一次的！

user: user-6
content: 操作系统肯定要这样做，一个效率高，一个也没必要 不过程序员free后，是应该吧指针设置为NULL的，才是标准的，不然就是野指针了。

user: user-0
content: 可是执行后，是正确的结果，并且是唯一的结果啊 引用 3 楼 lin5161678 的回复:这么做是不对的  未定义行为了

user: user-0
content: 意思是释放的内存块，只是通知内存又可以覆盖别的了，可是他现在的内容其实并没有清空？ 我觉得你这么说好像有点道理啊 引用 2 楼 Idle_Cloud 的回复:这个内存是释放了，操作系统也知道了，但是free不会去做清零的动作，也没必要。

user: user-0
content: 那current->next这个指针本身，不是在current指向的内存块中存储的吗？ 引用 1 楼 turingo 的回复:free的是current所指向地址的内存，而不是current->next所指向地址的内存。  [quote=引用 楼主 u012287871 的回复:] 我看c primer的书里，有这么个结构 struct film{     char title[TSIZE];     int rating;     struct film * next; } 下面的current, head都是这个结构的指针。 在清理列表的时候 current = head; while(current != NULL) {     free(current);     current = current->next; } 这里我理解的是，free()已经释放了current指向内存，可是，为什么current->next还是可以指向这个指针成员？[/quote]

user: user-1
content: 这么做是不对的  未定义行为了

user: user-6
content: 这个内存是释放了，操作系统也知道了，但是free不会去做清零的动作，也没必要。

user: user-2
content: free的是current所指向地址的内存，而不是current->next所指向地址的内存。  引用 楼主 u012287871 的回复:我看c primer的书里，有这么个结构 struct film{     char title[TSIZE];     int rating;     struct film * next; } 下面的current, head都是这个结构的指针。 在清理列表的时候 current = head; while(current != NULL) {     free(current);     current = current->next; } 这里我理解的是，free()已经释放了current指向内存，可是，为什么current->next还是可以指向这个指针成员？
user-0 提问: 求一函数～可以检查出静态分配的地址偏移量没有和其他的冲突！

回复:
user: user-1
content: 另外你可以写一个程序，作为编译器的辅助工具； 检查有没有重叠之类的地址冲突，如果编译器自身提供不了类似功能的话。

user: user-1
content: 你可以做个静态链表， 或者B+树来管理文件系统

user: user-2
content: 没看明白楼主的需求 要说重复覆盖的问题，只能是你们设计的问题。 如果有多个文件都申请的话，应该是统一由一个函数去申请（该函数管理一个链表结构，类似内存管理），而不能每个文件自己实现一个申请的函数。

user: user-1
content: 所有地址，写到一个头文件 定义为  宏常量， 或者枚举常量 或者C++常量 使用时调整这些常量即可，不用检查。

user: user-3
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-4
content: lz 是怀疑compiler 有问题？

user: user-0
content: 引用 4 楼 user-8 的回复:别扯啦，根本不可能冲突的啊。 只会是你自己使用过程中数组越界。  我是初学者，可能是我表达的不太清楚，程序用的是文件系统进行数据存储，每个文件都负责管理不同种类的数据，在文件内对应一张存储分配表，表里面的包括数据项的DI和偏移地址。例如：static DBSS_ITEM ms_parms[] =  { //	DI				Offset 	{0x00000000,	0x00000000},  	{0x00000001,	0x00000120}, 	{0x00000002,	0x00000200},         。。。 }; DI代表了一种数据，这个数据的可能是个结构体也可能是个数组也可能是任何复杂的复合类型，但是他的最大长度是确定的，OFFSET是偏移起始地址。如图第一个DI的最大长度是120字节，我给他分配对应的地址范围是0x00000000到0x00000120,第二个DI就是接着DI1后面继续偏移，后面的DI偏移地址也是这样人工自定义的，整个工程可能包含很多个这样的文件，对应的也有很多张这个表，我怎么确保文件之间分配的静态存储空间偏移是别人没有用过的。自己一个一个去检查可能太耗时间，因为整个工程有很多个模块，每个模块有专门的人负责编写，其他人怎么申请静态存储（他申请的是哪一段存储空间等），可能事先都不知道，而且就算不同的人用了重复的空间，最后编译都不会报错，只是在程序运行后存数据的时候会不停的彼此覆盖，这样对于我们来说是最可怕的失误，所以我想做个函数检查一下整个工程里面，有没有重复的申请静态存储空间，可以提前打印调试信息。希望可以帮帮我（有点啰嗦，希望能帮助理解。）。

user: user-5
content: 楼主想干啥？这怎么可能冲突呢？

user: user-6
content: 静态分配，感觉要检查难度很大啊。 为何不考虑初始化的时候动态申请呢？申请的时候记录起始地址和大小，这样由系统来保证内存不重叠

user: user-7
content: 根本就不会有地址重叠，你要把握好指针与数组的关系。注意指向位置，就算是重叠也变成双向的链表了

user: user-8
content: 别扯啦，根本不可能冲突的啊。 只会是你自己使用过程中数组越界。

user: user-0
content: 求关注求关注

user: user-0
content: 求关注！！！求关注
user-0 提问: 求解：对一组字符数组按照自定义的字母顺序排序应该怎么做

回复:
user: user-1
content: //字母优先级是  d, f, e, c, a .  然后字符数组是str=｛"deec","dac","ceef","fee"｝;输出的是"deec","dac","fee","ceef" #include <stdio.h> #include <string.h> int od(char c) {     char *p;     char order[6]="dfeca";      if (0==c) return -1;     p=strchr(order,c);     if (NULL==p) return -1;     return p-order; } int cmp(char *s1,char *s2) {     int od1,od2;      while (1) {         od1=od(*s1);         od2=od(*s2);         if (od1<od2) return -1;         if (od1>od2) return  1;         if (-1==od1 && -1==od2) return 0;         s1++;         s2++;     } } int main() {     char *str[4]={"deec","dac","ceef","fee"};     char *t;     int i,j;     for (i=0;i<4-1;i++) {         for (j=i+1;j<4;j++) {             if (1==cmp(str[i],str[j])) {                 t=str[i];str[i]=str[j];str[j]=t;             }         }     }      for (i=0;i<4-1;i++) printf("\"%s\",",str[i]);     printf("\"%s\"",str[i]);     return 0; } //"deec","dac","fee","ceef"

user: user-2
content: 给每个字母重新定义权值，类似于： int right[26] = { xx, xx, xx, ... , xx };  对于楼主举的这个例子：d, f, e, c, a  可以这样做：  int right[26] = {1, 0, 2, 5, 3, 4, 0, 0, ...., 0};  一个新的字符串比较的函数：  int mystrcmp( const char *str1, const char *str2) {     while (*str1 && *str2 && *str1++ == *str2++) ;     if ('\0' == *str1 && '\0' == *str2)  return 0;     if ('\0' == *str1 )   return -*str2;     if ('\0' == *str2 )   return *str1;     return right[*str1 - 'a'] - right[*str2 - 'a']; }  我这个写的只是举个例子，希望能起到抛砖引玉的效果

user: user-3
content: 做个表吧  char alphaorder[26]= {......};//自定义顺序

user: user-4
content: 先写个最基础的函数，参数是两个字母，返回bool，通过这个函数确定字母的优先级，然后需要实现字符串排序函数

user: user-5
content: >>> priority = {'d':0, 'f':1, 'e':2, 'c':3, 'a':4 } >>> def keyfunc(str): 	return priority[str[0]]  >>> slist = {'deec', 'dac', 'ceef', 'fee'} >>> result = sorted(slist, key = keyfunc) >>> result ['dac', 'deec', 'fee', 'ceef']  python写了一个。 priority为字符串到int的映射表，keyfunc返回sorted函数用于比较的主键。 sorted对字符串slist的所有键排序，结果在result中。
user-0 提问: const char * 转 char * 疑问

回复:
user: user-1
content: 日经贴

user: user-2
content: const char *s="hello world";  这样s是一个指针，指向一块只读区域，该区域最开始处是"hello world\0",程序无法修改只读区域的内容；  char s[]="hello world";  这样s是一个数组，或者说数组名，该数组在编译连接后确定为含12个元素（包括结束符'\0'），指针转换后，可以修改数组中元素内容

user: user-3
content: const char *s="hello world";  这么申明字符串本来就没法修改。 char s[]="hello world";  这么申明才可以修改。
user-0 提问: 位运算的小程序求解

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:位预算符而已！   z=~0;   //~一元运算符， 0000 0000对数据取反1111 1111 z=(z>>n1)&(z<<(16-n2));  //把z先右移n1位和左移16-n2位的结果取与运算， //(具体的是不是这样得实践下，这里我一般会分开操作) z=value&z; //z和value 与运算 z=z>>(16-n2); //把z右移16-n2位，结果赋值给z  参考下 http://blog.csdn.net/heiniaoyuyouling/article/details/4696586 版主大大 你好！我输入7，接着输入位数14 ，15，最后得出3，能为我分析一下么……谢谢了

user: user-1
content: 位预算符而已！   z=~0;   //~一元运算符， 0000 0000对数据取反1111 1111 z=(z>>n1)&(z<<(16-n2));  //把z先右移n1位和左移16-n2位的结果取与运算， //(具体的是不是这样得实践下，这里我一般会分开操作) z=value&z; //z和value 与运算 z=z>>(16-n2); //把z右移16-n2位，结果赋值给z  参考下 http://blog.csdn.net/heiniaoyuyouling/article/details/4696586

user: user-0
content: n1，n2是要提取的位数，忘了表明了
user-0 提问: ACM 简单A+B

回复:
user: user-1
content: 什么叫无法调试？ 目测代码无问题啊

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

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。 我也知道的啦，是这题我纠结了一下午了，实在看不出哪里有问题，后来才发现是软件出BUG了，囧死了、。。。
user-0 提问: 哪位老师讲解的算法比较好，求推荐。有视频的。

回复:
user: user-1
content: 数据结构的视频我强烈推荐郝斌的。。

user: user-2
content: 国外的麻省理工的算法导论，国内的就是严蔚敏的视频。国外的比较经典但不一定适合国情，可以先看看国内的。大话数据结构一书基本是严蔚敏版教材的详解版，可以做参考教材！

user: user-3
content: 引用 6 楼 fetag 的回复:其实我觉得我讲的很不错...真心话~~ 额，有视频嘛？话说，自学真的好难

user: user-4

user: user-5
content: mit的，还有knuth的art貌似也非常经典。

user: user-6
content: 其实我觉得我讲的很不错...真心话~~

user: user-7
content: 引用 1 楼 user-11 的回复:- -！ 推荐《麻省理工学院公开课:算法导论》，结合《算法导论》一书不错，， 不过我还是推荐你去看严蔚敏的视频---《数据结构》~~~  关键是学得好

user: user-8
content: 1、如果仅仅是入门，知道基本的栈、队列、链表等数据结构，清华严蔚敏版的差不多了。  2、如果需要进一步提高，了解各种排序算法的优劣及深入原理，学会使用动态规划和贪心算法，以及一些高级数据结构，比如图、红黑树、堆、二叉平衡树等的实现及机制。那么，首推《算法导论》，目前中文版只有第二版的，第三版的英文版也已经有了。相关视频，在网易公开课中有，麻省的，该书的作者主讲。  此外，对于《算法导论》这本书，不要作为教科书来看，除非你要参加ACM这种大赛做集训，一般情况下，你只需要重点学习吃透其中的2、6、7、10、11、15、16、22章就够了，这几章你吃透，基本可以秒杀90%以上的程序猿面试题了（包括MS, GOOGLE的）。

user: user-9
content: 引用 1 楼 user-11 的回复:- -！ 推荐《麻省理工学院公开课:算法导论》，结合《算法导论》一书不错，， 不过我还是推荐你去看严蔚敏的视频---《数据结构》~~~ 1.麻省理工学院公开课:算法导论(在线)：http://edu.51cto.com/lesson/id-2236.html 语言是英文的，不过字幕已经被翻译为中文。 2.数据结构经典疑难问题视频讲解（在线）：http://edu.51cto.com/course/course_id-158.html 这个主要是描述问题，然后如何用程序实现，没有巧妙的算法，但是解决问题的方法还可以。 3.清华大学《数据结构与算法》课程（严蔚敏）（在线）：http://edu.51cto.com/lesson/id-4133.html 4.郝斌数据结构：下载地址参见：http://www.52pojie.cn/thread-130075-1-1.html 书籍使用的是严蔚敏的。

user: user-10
content: 引用 1 楼 user-11 的回复:- -！ 推荐《麻省理工学院公开课:算法导论》，结合《算法导论》一书不错，， 不过我还是推荐你去看严蔚敏的视频---《数据结构》~~~  ++

user: user-11
content: - -！ 推荐《麻省理工学院公开课:算法导论》，结合《算法导论》一书不错，， 不过我还是推荐你去看严蔚敏的视频---《数据结构》~~~
user-0 提问: C语言 循环使用fwrite

回复:
user: user-1
content: fwrite 有返回值啊你可以累加这个返回值来得到已经写的数据量，此外，你可以借助 fseek定位到文件的位置进行读写

user: user-2
content: 引用 7 楼 haoba74257 的回复:关键是 怎么循环写呢？？？ 不会用啊  这个fwrite函数 如果想循环使用的话 假如每次写入1M字节的话，下次写的时候是不是从1M处开始写呢？？？怎么定位呢???  要写的总大小已经知道了，每次定量写多少，写多少次循环，你自己决定就好了！ 是的，当你写了1M之后，只要文件没有关闭或者没有手动移动文件描述符fw的话，会在1M字节后面开始写的， 这个不需要我们定位的，fw文件描述符会搞定的

user: user-0
content: 关键是 怎么循环写呢？？？ 不会用啊  这个fwrite函数 如果想循环使用的话 假如每次写入1M字节的话，下次写的时候是不是从1M处开始写呢？？？怎么定位呢???

user: user-3
content: 10*1024*1024 ,10M读写，没有问题吧？？？ 不能一次读写，每次读1024 总可以吧 每次写成功指针，递增1024，就行了。 10×1024次完成。

user: user-4
content: fwrite()+fseek() 读多少就偏移多少

user: user-5
content: 可以将数据分成几份，然后循环读取，放到指定的缓存里。这个不是特别难实现，不过需要注意读取（实际读取）的字节数，和存放缓存的指定位置。

user: user-6
content: static char dataread[10*1024*1024]=""; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-7
content: 不是很明白意思   一次读10M 确实有点多了，就读 4K 吧   int main() {    int time;    int i;    time = 10*1024*1024/4096;     for (i = 0; i < time; i++) {        read(); /* read data */        write(); /* write to file */    } }

user: user-6
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了
user-0 提问: 指标内容重新设的问题

回复:
user: user-1
content: 引用 2 楼 shanwu1985 的回复:我百度了一下，它说是在文字常量区… 能不能请前辈介绍一本书，让我能学更完整一些 :)      [quote=引用 1 楼 user-1 的回复:]  char *ptr="hello";静态区的，可读不可以改的！  用char ptr[10] = "hello";[/quote] 字符串常量应该是存储在静态存储区， 你说的文字常量区貌似比较少听到，应该也是静态存储区的吧！

user: user-0
content: 这边有也有解说，给有同样问题的其它人参考下

user: user-0
content: 我百度了一下，它说是在文字常量区… 能不能请前辈介绍一本书，让我能学更完整一些 :)      引用 1 楼 user-1 的回复:char *ptr="hello";静态区的，可读不可以改的！  用char ptr[10] = "hello";

user: user-1
content: char *ptr="hello";静态区的，可读不可以改的！  用char ptr[10] = "hello";
user-0 提问: 请教大神，interrupt affinity怎么用？

回复:
user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:请亲自动手打开procmon.chm查看。  啊，好的，谢谢！

user: user-1
content: 请亲自动手打开procmon.chm查看。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:那建议用软件 procmon filemon regmon 监视你那个小工具在运行时都干了些啥。  请问用procmon要怎么看到某应用程序都做了什么操作呢？刚刚下到该程序，但还不会用……

user: user-0
content: 引用 8 楼 user-2 的回复:为什么要改这个？ 改乱了 会很麻烦的 请问这个改后复原不行么？

user: user-0
content: 引用 8 楼 user-2 的回复:为什么要改这个？ 改乱了 会很麻烦的  需要屏蔽某些核的中断来完成实时性较高的处理。 我也发现改过后再恢复QQ和另一个软件就不能用了…………

user: user-2
content: 为什么要改这个？ 改乱了 会很麻烦的

user: user-0
content: 引用 6 楼 user-2 的回复:这个工具修改的是注册表 http://msdn.microsoft.com/zh-cn/subscriptions/ff547969.aspx  从MSND弄明白 有关的注册表项 然后用注册表WIN32 API自己去修改。  好的，谢谢~~~！

user: user-2
content: 这个工具修改的是注册表 http://msdn.microsoft.com/zh-cn/subscriptions/ff547969.aspx  从MSND弄明白 有关的注册表项 然后用注册表WIN32 API自己去修改。

user: user-1
content: API 文件 注册表

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:那建议用软件 procmon filemon regmon 监视你那个小工具在运行时都干了些啥。  这个能监视到什么？？

user: user-1
content: 那建议用软件 procmon filemon regmon 监视你那个小工具在运行时都干了些啥。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:SetProcessAffinityMask SetThreadAffinityMask ？ 呃，不是这个

user: user-1
content: SetProcessAffinityMask SetThreadAffinityMask ？
user-0 提问: 一个奇怪的socket 端口冲突问题

回复:
user: user-0
content: 自己顶一个。。。

user: user-1
content: 在SO_REUSEPORT尚未普及的情况下, 内核中的每个port只应属于一个process，但是有两个特例：  1，bind后fork的。 2，listen后accept的。  楼主问题1：既然随机端口被占用着，你bind肯定是失败的，除非有REUSERPORT选项。 楼主问题2：你是说系统会给你分配到一个已经bind的端口？不太可能。

user: user-0
content: 多谢版主出马，SO_REUSEPORT目前并不支持； 问题依旧： 1、随机端口被占用，比如说51365，那么在51365上的监听就起不来么？(这个是我碰到的问题的根源) 那这么说所有的监听端口是不是都要在随机端口的范围下面才合适？ netstat -an |grep 44445 tcp        0      0 172.18.64.64:51365      172.17.236.122:44445    ESTABLISHED   44445是我主机的一个监听，实验主机用的客户端程序连接到44445，产生随机端口51365 然后悲剧发生了：实验主机上的服务端程序绑定51365失败了。。。 socket ok! setsockopt ok! bind()sockfd[3]fail, errno[98], errmsg[Address already in use] 主要是这个怎么解释？？？  2、我在实验主机的客户端connect之前SO_REUSEADDR，问题就解决了，相当于clt和svr都设置了SO_REUSEADDR才可以。。。 当然，作为服务端程序，第一次碰到跟别人的随机端口冲突，也不能指望别人调用之前SO_REUSEADDR，更不能寄希望系统不会分配到跟我们监听端口一样的随机端口； 这个该怎么解释？？  这个问题最终是可以解决的，就是listen在随机端口范围以下的端口就ok了； 但是1和2是为什么？？？？

user: user-0
content: 再说一下实验过程吧： SUSE Linux ： 1、客户端socket  connect 172.17.233.122：44445 2、连接成功 tcp  0  0 172.18.64.64:54050  172.17.236.122:44445    ESTABLISHED  3、服务端socket  setsockopt(SO_REUSEADDR) bind(172.18.64.64:54050)  listen accept 4、启动服务端，bind失败，errno98   1、客户端socket  setsockopt(SO_REUSEADDR) connect 172.17.233.122：44445 2、连接成功 tcp  0  0 172.18.64.64:54052  172.17.236.122:44445    ESTABLISHED  3、服务端socket  setsockopt(SO_REUSEADDR) bind(172.18.64.64:54052)  listen accept 4、启动服务端，bind成功  IBM AIX: 上述两种情况都bind成功，只要svr设置了setsockopt(SO_REUSEADDR)； 上述两种情况都bind失败，只要svr没有设置setsockopt(SO_REUSEADDR)；

user: user-0
content: 版主说要用REUSERPORT选项来实现，但是我的这个例子中用SO_REUSEADDR已经可以解决这个冲突问题了，但是苦于在UNP上SO_REUSEADDR的四条用法中找不到对应的解释： SO_REUSEADDR可以用在以下四种情况下：      (摘自《Unix网络编程》卷一，即UNPv1)      1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时，而你启 动的程序的socket2要占用该地址和端口，你的程序就要用到该选项。      2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但 每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可 以测试这种情况。      3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上，但每个soc ket绑定的ip地址不同。这和2很相似，区别请看UNPv1。      4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的 多播，不用于TCP。  我所纠结的问题在这儿： 1、既然存在这种跟随机端口冲突的问题，那我的监听端口该设定为多少才能保证不会跟随机端口冲突，就是svr监听端口的取值范围问题 2、从上述实验中只有clt和svr都设置了SO_REUSEADDR，绑定在该端口上的bind操作才会成功，只要一个没有设置就errno98，如何解释，必须要clt也设置SO_REUSEADDR； 3、实际上我在AIX上也做过实验，AIX只需要svr设置了SO_REUSEADDR就可以bind在一个已经分配了的随机端口上，还是想知道如何解释这个实现机制。

user: user-1
content: 引用 1 楼 user-1 的回复:SO_REUSERPORT是可以多进程bind同一个Port的，但只有linux3.x内核才刚刚支持这个选项，之前此选项是不起作用的。  SO_REUSERADDR是复用TIME_WAIT的，没问题。  多提一句吧，windows的socket早就支持SO_REUSERPORT这个功能了，很多木马会扫除比如QQ正在使用的通讯端口，然后也bind到这个端口上，从而避免杀软发现自己。  你只要知道TCP是4元组，那么肯定知道在本地bind 无数次同一个Port是毫无问题的，只是linux内核一直把SO_REUSERPORT这个选项别扭着没实现。

user: user-1
content: SO_REUSERPORT是可以多进程bind同一个Port的，但只有linux3.x内核才刚刚支持这个选项，之前此选项是不起作用的。  SO_REUSERADDR是复用TIME_WAIT的，没问题。
user-0 提问: 如果给出节点的顺序打乱，用孩子兄弟法如何建立树？

回复:
user: user-1
content: 似乎应该这么做： if(j==0)         Array[parentid].FirstChild=&Array[childid];             else               Array[lastid].NextSibling=&Array[childid];  不过数组存储树，一般都是用索引，而不用指针。 一般指针用于链式存储。 另外你这个树，好奇怪，居然没有数据。  任何数据结构，只在数据存储方式，和一些基本算法上有用。  我们使用数据结构，是为了用这种结构存储数据，和使用这种算法，而不是为数据结构，而开个数据结构。  数据是核心，数据结构和相应的算法，是为了数据服务的。  你这个树的数据是什么。难道不用存储数据？？？？？  还是你只关系，数据结构，不关心数据？？？

user: user-0
content: 引用 5 楼 lm_whales 的回复:你这说的太简单，信息太少。 首先，你这是那种数据结构，其他节点如何除了（没给出孩子节点的节点）  马马虎虎，可以看出，这似乎是一棵树。  你可以先创建一片森林，然后查找，每棵树的根节点在主树的位置，插入主树对应的节点上。即可。  也可一先创建主树。 然后再插入节点数据。   具体看你的树本身，是个什么树。 擦，怎么缩进没有了，再弄一遍 typedef struct Tree *PtrToTree; struct Tree {   PtrToTree FirstChild;   PtrToTree NextSibling; }; PtrToTree *Array;  int main(void) {   int i,j;   int childid,parentid,lastid;   int childnum;   scanf("%d %d",&n,&m);   while(n)   {     Array=(PtrToTree *)malloc(sizeof(PtrToTree)*(n+1));     maxlevel=0;     for(i=0;i<m;i++)   {       scanf("%d %d",&parentid,&childnum);       if(!childnum)         Array[parentid]->FirstChild=NULL;       else      {          for(j=0;j<childnum;j++)          {             scanf("%d",&childid);             if(j==0)                Array[parentid]->FirstChild=Array[childid];             else                Array[lastid]->NextSibling=Array[childid];             lastid=childid;           }        Array[childid]->NextSibling=NULL;     }   }   } return 0; }

user: user-0
content: 引用 5 楼 lm_whales 的回复:你这说的太简单，信息太少。 首先，你这是那种数据结构，其他节点如何除了（没给出孩子节点的节点）  马马虎虎，可以看出，这似乎是一棵树。  你可以先创建一片森林，然后查找，每棵树的根节点在主树的位置，插入主树对应的节点上。即可。  也可一先创建主树。 然后再插入节点数据。   具体看你的树本身，是个什么树。 唔，我才刚学树，树林是什么还不知道。。 我刚刚写了这个程序，定义一个指向结构的指针数组 typedef struct Tree *PtrToTree; struct Tree { 	PtrToTree FirstChild; 	PtrToTree NextSibling; }; PtrToTree *Array;  int main(void) { 	int i,j; 	int childid,parentid,lastid; 	int childnum; 	scanf("%d %d",&n,&m); 	while(n) 	{ 		Array=(PtrToTree *)malloc(sizeof(PtrToTree)*(n+1)); 		maxlevel=0; 		for(i=0;i<m;i++) 		{ 			scanf("%d %d",&parentid,&childnum); 			if(!childnum) 				Array[parentid]->FirstChild=NULL; 			else 			{ 				for(j=0;j<childnum;j++) 				{ 					scanf("%d",&childid); 					if(j==0) 						Array[parentid]->FirstChild=Array[childid]; 					else 						Array[lastid]->NextSibling=Array[childid]; 					lastid=childid; 				} 				Array[childid]->NextSibling=NULL; 			} 		}  调试的时候在“Array[parentid]->FirstChild=Array[childid];”这里出现了问题，难道这不可以吗？

user: user-1
content: 你这说的太简单，信息太少。 首先，你这是那种数据结构，其他节点如何除了（没给出孩子节点的节点）  马马虎虎，可以看出，这似乎是一棵树。  你可以先创建一片森林，然后查找，每棵树的根节点在主树的位置，插入主树对应的节点上。即可。  也可一先创建主树。 然后再插入节点数据。   具体看你的树本身，是个什么树。

user: user-0
content: 难道木有人知道吗

user: user-0
content: 来人啊，求帮助

user: user-2
content: 数据结构问题在CSDN上好像很少受关注啊 顶一下
user-0 提问: 我一直很想问一个问题，关于想编写游戏的话有什么书推荐

回复:
user: user-0
content: 我找到一个开源的曹操传的项目，希望对和我一样有同样兴趣的朋友有用 http://code.google.com/p/caocaozhuan/source/checkout

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:搜开源策略游戏 谢谢，举一反三，我搜索开源战棋游戏看看嘿嘿

user: user-0
content: 引用 4 楼 uniquecapo 的回复:http://blog.csdn.net/zhmxy555/article/category/1104646/3 【 Visual C++】游戏开发笔记，希望对你有帮助。  谢谢

user: user-1
content: 《Visual C++ 游戏开发经典案例详解》 搜网络教程“学OpenGL编3D游戏”。

user: user-1
content: 搜开源策略游戏

user: user-2
content: http://blog.csdn.net/zhmxy555/article/category/1104646/3 【 Visual C++】游戏开发笔记，希望对你有帮助。

user: user-0
content: 引用 2 楼 N_sev7 的回复:个人觉得： 还是先研究算法吧，比如3D场景显示的时候你用什么算法能高效的显示出来 至于那些画面什么的3D场景的模型，看OpenGL3D编程呗  不要3D我就想自己能编一个像曹操传一样的战棋游戏这行了这是2D吧 主要是觉得看C++方面的书我一个人又没有经验也不会项目，可能还是需要例子来引导更好 一步步上手也更容易，有目标一些 只看你所说的还是不能写出游戏来

user: user-3
content: 个人觉得： 还是先研究算法吧，比如3D场景显示的时候你用什么算法能高效的显示出来 至于那些画面什么的3D场景的模型，看OpenGL3D编程呗
user-0 提问: 有关约瑟夫环的我自己写的一个程序 调试了N遍都不对 求大神帮个忙看下 感激不尽

回复:
user: user-1
content: //假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }

user: user-2
content: LZ程序如下加一行即可:    for(i=0;i<number;i++)   {     pb=NULL;//加  这样就不会把2组数据链成一个环了.
user-0 提问: WlanHostedNetworkStartUsing调用成功，但承载网络却未启动，为什么？

回复:
user: user-0
content: 找到了问题所在，代码第30行的WlanCloseHandle(WlanHandle, NULL);要去掉，关闭了句柄wifi也会关闭，还有程序退出之后wifi也会自动关闭

user: user-0
content: WlanHostedNetworkForceStart()可以启动，但前提是需要管理员权限运行
user-0 提问: 'NULL':未定义的标识符

回复:
user: user-1
content: 引用 20 楼 my_live_123 的回复:完全可以自己定义一个  #define NULL (void*)(0)  #ifndef NULL #ifdef __cplusplus #define NULL    0 #else  /* __cplusplus */ #define NULL    ((void *)0) #endif  /* __cplusplus */ #endif  /* NULL */

user: user-2
content: 缺少头文件#include<stdlib.h>

user: user-3
content: 完全可以自己定义一个  #define NULL (void*)(0)

user: user-4
content: 加 #include<cstdio>或<stdio.h>  亲测可行

user: user-5
content: #define NULL 0 不太放心的话就使用 nullptr

user: user-6
content: 引用 5 楼 hai200501019 的回复:if(curr==NUll||curr->rightChild==NULL)return NULL; 楼主注意拼写啊  curr==NULL  而不是curr==NUll   ，看好了 还有 if(curr==NULL||curr->leftChild=NULL)  return NULL; 应该是 curr->leftChild == NULL +++

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

user: user-8
content: using namespace std  NULL在std里

user: user-9
content: 实在不行  自己定义呀

user: user-10
content: 自己定义吧#define    NULL (void*)0

user: user-11
content: 这么简单的问题，未定义定义一个就好了呀 在你程序文件前面，头文件后面加上几行： #ifndef NULL #define NULL ((void *)0) #endif

user: user-12
content: curr==NUll||curr->rightChild==NULL 好像这句错了吧，注意拼写NULL

user: user-12
content: 实在不行，直接#define NULL 0，效果是一样的，如果还有错就是其他问题了。 你的实现文件是分开写的？确定每个文件都加了stdio.h吗？再仔细看一下。

user: user-12
content: 引用 6 楼 yangyi_33855 的回复:头文件包含错了吧，是#include <stdio.h>什么的 “”表示在当前文件夹啊 这个是没问题的，""会先查找当前文件夹再查找库，<>是直接搜索库，如果反过来用<>查找当前文件夹就错了，不过如果当前文件夹有很多文件的话也不建议用""来代替<>

user: user-13
content: cstddef cstdio cstring ctime

user: user-14
content: 头文件包含错了吧，是#include <stdio.h>什么的 “”表示在当前文件夹啊

user: user-15
content: if(curr==NUll||curr->rightChild==NULL)return NULL; 楼主注意拼写啊  curr==NULL  而不是curr==NUll   ，看好了 还有 if(curr==NULL||curr->leftChild=NULL)  return NULL; 应该是 curr->leftChild == NULL

user: user-16
content: 运行时就出错？？？  编译连接都没问题吗

user: user-0
content: 这是所有的代码，可是运行时就出错

user: user-0
content: #include "stdafx.h" #include  "stdlib.h" #include  "stdio.h" #include  "stddef.h" //#include "windows.h" typedef  char DataType; //#define NULL (Node *)0 #include  "bitreenode.h"  int _tmain(int argc, _TCHAR* argv[]) { 	BiTreeNode *root,*p;  	Initiate(&root); 	p=InsertLeftNode(root,'A'); 	p=InsertLeftNode(p,'B'); 	p=InsertLeftNode(p,'D'); 	p=InsertLeftNode(p,'G'); 	p=InsertRightNode(root->leftChild,'C'); 	InsertLeftNode(p,'E'); 	InsertRightNode(p,'F'); 	return 0; }