Question: fseek问题

衡量普通硬盘的性能不是用时间复杂度和空间复杂度；而是用转速、寻道时间、IO时间、……综合起来就是每秒多少MB，试试用HDTunePro软件测试一下你的硬盘的各项指标。

如果使用fat32 的画，差不多是一个字节一个字节的来

跟使用的磁盘文件系统有关

好高深复杂啊。。。。

谁来保证两个小文件或一个大文件的两个不同部分，分布在机械硬盘上的同一磁道内，当在两者之间来回切换读写时不用寻道呢？！

引用 18 楼 zxh707wk 的回复:[quote=引用 17 楼 Android_iPhone 的回复:] [quote=引用 12 楼 zxh707wk 的回复:] [quote=引用 11 楼 Android_iPhone 的回复:] 文件指针就是指针，存的就是地址。 如果打开一个2G的文本文件，那么按照你的说法这2G的每个字节都有一个指针对应？ 还有，导航地图依靠的是网络传输，而不是本地文件 [/quote]  如果打开一个2G的文本文件，那么按照你的说法这2G的每个字节都有一个指针对应？  关于这个问题，回答如下：  如果打开一个2G的文本文件，有一个指向这个文本文件的指针。 而文本文件中的2G个字节都有一个唯一的地址，是操作系统在保存这个文件时就已经事前决定好的了。  fseek可以通过origin和offset参数，迅速的立即定位到任何一个想要访问的地址，而不是1个字节1个字节的遍历 对于计算机来讲，定位到第1个字节，第2个字节，第N个字节，所用的时间是基本上相差无几的  针对原来楼主的问题的回复如下： 这个时间复杂度是o(1) ，能随机移位到n，而不是一个个移 [/quote]但存储在硬盘上的文件字节是随机的，你知道第一个字节的地址，却不一定知道第二个字节的地址[/quote]   你是错误的. 一个文件在电脑上有一个首地址,, 并且是连续的内存地址. 比如说我一个文本文件里面内容是 abcdefg a在磁盘里面的地址是100 那么b就是100+2(sizeof(char)是2), 那么如果你知道a的地址了 你要跳到f处只需要让地址做简单的加法就可以了 100+2*5 = 110 这就是f的地址. 所以不需要遍历

寻道和旋转似乎可以并行，不知道硬盘是怎么做的， 是不是还要测试，是否到达某一磁道到了。

引用 28 楼 zhao4zhong1 的回复: 唉，硬盘转速的单位，也搞错了 不过按照，你提供的资料，寻道时间，和转一圈的时间数量级别是一样的。 单独一个小文件读写（M以内）， 只怕几乎不用去寻道的，估计只需要第一次读写寻道，就差不多了（其余数据可以放在缓冲里）。 那种测试是一种极端条件测试， 如果只是读写一个文件，或者3，5个文件，只怕也不会寻道很多次。

引用 28 楼 zhao4zhong1 的回复:http://bollaxu.iteye.com/blog/858320的内容： 硬盘一次读写的时间由两个部分组成：  time = latency + data_size / bandwidth     latency主要由平均硬盘寻道时间和平均硬盘转动延迟组成。硬盘有多个磁盘片组成，每个磁盘又由N个同心的track构成，每个track又分成M个sector。磁头移动到目标track，就是寻道的时间(seek time)。那硬盘转动延迟(rotational delay)取决于硬盘转速，即如果硬盘转速为7200rpm(每分钟7200转)，那每转一圈就要1/120=8.3ms，平均延迟就是它的一般，大概是4.17ms。一般的硬盘平均寻道时间是8ms，那么latency就是8+4.17=12.17ms。     所以一般小文件的传输时间主要由latency来决定，而大文件的传输时间则受latency影响较小。而看硬盘性能的时候，主要要看它对小文件的随机读写速度(市面上的所谓传输速率大多是大文件的连续读写，是理想状态，所以实际的性能往往要差很多)。 那看来我想错了，不过现在记录密度又高了，只怕也不能确定到底哪个快

你就想一下  int a = 10; int *p = &a;  我要得到p所指向的值   难道要从0x00000000开始移动吗？

引用 26 楼 lm_whales 的回复:[quote=引用 24 楼 zhao4zhong1 的回复:] [quote=引用 22 楼 lm_whales 的回复:] 约等于O(1) 一般来说，不会消耗太多时间，大概不应该超过磁盘转半圈 。 现在磁盘转速一般是 7200/S或者更高 一圈消耗时间 1/7200 秒应该很快了  另外，磁盘操作都是带缓冲的，摊还时间，应该还是O(1)的 一般读取若干块数据，可以只有一次真正的磁盘寻道。 磁头来回移动的时间不算了？[/quote ]磁头移动比旋转要快，因为移动位置非常小，虽然旋转是持续的，但是一圈距离 跟磁道间距比较，还是巨大无比的数字。 平均起来，还是旋转要慢。    [/quote] 具体我也不是很清楚。我印象中来回移动的延迟要比在同一柱面等所需扇区转到磁头下面的延迟大。 有此为证：http://bollaxu.iteye.com/blog/858320

引用 24 楼 zhao4zhong1 的回复:[quote=引用 22 楼 lm_whales 的回复:] 约等于O(1) 一般来说，不会消耗太多时间，大概不应该超过磁盘转半圈 。 现在磁盘转速一般是 7200/S或者更高 一圈消耗时间 1/7200 秒应该很快了  另外，磁盘操作都是带缓冲的，摊还时间，应该还是O(1)的 一般读取若干块数据，可以只有一次真正的磁盘寻道。 磁头来回移动的时间不算了？[/quote ]磁头移动比旋转要快，因为移动位置非常小，虽然旋转是持续的，但是一圈距离 跟磁道间距比较，还是巨大无比的数字。 平均起来，还是旋转要慢。

在文件大小相同的前提下：  读刚读过的文件比头次读没读过的文件快  读转速快的硬盘上的文件比读转速慢的硬盘上的文件快  读没有磁盘碎片的文件比读有磁盘碎片的文件快  读文件不处理比边读边处理快  单线程从头到尾一次读文件比多线程分别读文件各部分快（非固态硬盘上）  读固态硬盘上的文件比读普通硬盘上的文件快

引用 22 楼 lm_whales 的回复:约等于O(1) 一般来说，不会消耗太多时间，大概不应该超过磁盘转半圈 。 现在磁盘转速一般是 7200/S或者更高 一圈消耗时间 1/7200 秒应该很快了  另外，磁盘操作都是带缓冲的，摊还时间，应该还是O(1)的 一般读取若干块数据，可以只有一次真正的磁盘寻道。 磁头来回移动的时间不算了？

要知道，操作系统很多时候，  都是不停的在内存和磁盘上交换数据， 你一般感觉不到，这个过程。

可以想象成直接跳转，一个个跳的话，太慢了，不科学

呵呵，记得当年初学个位数加法的时候，老师还教过要用手指头单步跟踪...

引用 18 楼 zxh707wk 的回复:[quote=引用 17 楼 Android_iPhone 的回复:] [quote=引用 12 楼 zxh707wk 的回复:] [quote=引用 11 楼 Android_iPhone 的回复:] 文件指针就是指针，存的就是地址。 如果打开一个2G的文本文件，那么按照你的说法这2G的每个字节都有一个指针对应？ 还有，导航地图依靠的是网络传输，而不是本地文件 [/quote]  如果打开一个2G的文本文件，那么按照你的说法这2G的每个字节都有一个指针对应？  关于这个问题，回答如下：  如果打开一个2G的文本文件，有一个指向这个文本文件的指针。 而文本文件中的2G个字节都有一个唯一的地址，是操作系统在保存这个文件时就已经事前决定好的了。  fseek可以通过origin和offset参数，迅速的立即定位到任何一个想要访问的地址，而不是1个字节1个字节的遍历 对于计算机来讲，定位到第1个字节，第2个字节，第N个字节，所用的时间是基本上相差无几的  针对原来楼主的问题的回复如下： 这个时间复杂度是o(1) ，能随机移位到n，而不是一个个移 [/quote]但存储在硬盘上的文件字节是随机的，你知道第一个字节的地址，却不一定知道第二个字节的地址[/quote]    对啊，是我考虑不周，虽然知道第一个字节的地址，但是光用图片中的Offset，肯定不能马上计算出来后面字节的地址，那算法得多复杂啊。 老师说的还是对，必须得一个字节一个字节的移动到后面才行，这个时间复杂度是o(n)才对。  当n非常大的时候，比如即使是一个本地视频，如果很大的话，我们打开它马上开始从头播放，一般不会卡； 而如果一下子拖到比较靠后的地方，确实会稍微卡一下的。 认真仔细考虑了一下，还得相信老师才正确。


Question: 请教关于构造alloc函数的相关问题

引用 2 楼 zxx150633 的回复:[quote=引用 1 楼 lovesmiles 的回复:] 首先，定义了一个长为LEN的base数组，所有分配的内存都是在这个数组上面的。 然后 将p指向未分配的内存首地址，第一次分配时，首地址就是base. alloc分配开始，参数n指明了要分配多少字节。 于是在首地址分配4字节(即sizeof(unsigned int)的长度)表存放n的值班，然后将p赋值给pp，然后将p移到n+sizeof(unsigned int)的地方。这样p还是表示空闲的内存空间。 返回pp.  free,就是找到pp所在的位置，因为我们知道有一个n存在pp这个位置，这个n表示后面的n个内存都可以释放掉，于是将p向前移动n个字节。 为什么要p+sizeof(unsigned int)+n<base+LEN呢？我感觉只要p+n<base+LEN就好了。 还有一个问题，*(unsigned int*)p=n;的作用是什么呢？ 非常感谢[/quote]*（unsigned int*）p=n，其实就是*p = n，应该是指已分配的内存大小吧。。。

引用 1 楼 lovesmiles 的回复:首先，定义了一个长为LEN的base数组，所有分配的内存都是在这个数组上面的。 然后 将p指向未分配的内存首地址，第一次分配时，首地址就是base. alloc分配开始，参数n指明了要分配多少字节。 于是在首地址分配4字节(即sizeof(unsigned int)的长度)表存放n的值班，然后将p赋值给pp，然后将p移到n+sizeof(unsigned int)的地方。这样p还是表示空闲的内存空间。 返回pp.  free,就是找到pp所在的位置，因为我们知道有一个n存在pp这个位置，这个n表示后面的n个内存都可以释放掉，于是将p向前移动n个字节。明白了，谢谢。

引用 1 楼 lovesmiles 的回复:首先，定义了一个长为LEN的base数组，所有分配的内存都是在这个数组上面的。 然后 将p指向未分配的内存首地址，第一次分配时，首地址就是base. alloc分配开始，参数n指明了要分配多少字节。 于是在首地址分配4字节(即sizeof(unsigned int)的长度)表存放n的值班，然后将p赋值给pp，然后将p移到n+sizeof(unsigned int)的地方。这样p还是表示空闲的内存空间。 返回pp.  free,就是找到pp所在的位置，因为我们知道有一个n存在pp这个位置，这个n表示后面的n个内存都可以释放掉，于是将p向前移动n个字节。 为什么要p+sizeof(unsigned int)+n<base+LEN呢？我感觉只要p+n<base+LEN就好了。 还有一个问题，*(unsigned int*)p=n;的作用是什么呢？ 非常感谢


Question: 如何播放.exe文件内嵌的MP3文件？

引用 楼主 u013491662 的回复:我不要释放到硬盘然后在播放的方法 ... 听不明白你的意思，你的exe不就在硬盘上吗？还要释放什么？

引用 2 楼 zhao4zhong1 的回复:搜“播放内存中的mp3”+1

搜“播放内存中的mp3”

写一个DirectShow Source Filter

http://www.cnblogs.com/michaelhuwei/archive/2009/12/25/1632129.html 看有帮助没

推理下： 你既然有办法把mp3放进exe，那肯定也能加载到内存，能加载到内存，Wdinwos就有办法替你播放…… 你甚至不用整个加载到内存，按需动态加载也有可能

自用的话，试试bass库吧，mp3大的话，就直接播exe文件，不要整个载入内存...

额 我是想做一个小游戏 只有一个exe文件，想做出来播放音乐的，由于不知道怎么播放内存中的MP3资源，所以特来请教！ 上网搜“播放内存中的mp3”基本没有C语言的 请大神出来解答。。谢谢！

内嵌在exe中的音频，就是内存中的。。。播放内存中的音乐？不过谁设计的是放在exe中啊，一般资源文件都会放在文件夹中啊


Question: C语言中函数类型以及函数参数类型的关系

函数的声明和定义必须要一致啊, 至于void表示空啊  void foo(void)表示没有参数没有返回值

引用 3 楼 Idle_ 的回复:是我语文差了没看懂题目？   int func(double a, char* b);  谁说要一致的？ 是你没看懂吧？ 它问的是 int func(double a, char* b); 和 int func(double a, char* b) {  }  一个声明和一个定义，类型是不是要一致。

需要一致。 。。

第一个问题，要一致。 第二个问题，你就当它是一个null.void 参数，就是没有参数，void返回值，就是没有返回值。

引用 4 楼 lovesmiles 的回复:[quote=引用 3 楼 Idle_ 的回复:] 是我语文差了没看懂题目？   int func(double a, char* b);  谁说要一致的？ 是你没看懂吧？ 它问的是 int func(double a, char* b); 和 int func(double a, char* b) {  }  一个声明和一个定义，类型是不是要一致。[/quote]  还是无法看出问题中问的是你说的事：  引用 楼主 luo_wei_leader 的回复:在这一点我很迷惑，【定义一个函数】 【  实】（时） 【申明里面的】  【 实参变量的】 【 类型】 【 要和】 【 这个】 【函数类型】  一致吗？顺便讲解一下void这个类型的用法及返回值。谢谢！！

void void declarator  When used as a function return type, the void keyword specifies that the function does not return a value. When used for a function's parameter list, void specifies that the function takes no parameters. When used in the declaration of a pointer, void specifies that the pointer is "universal."  If a pointer's type is void *, the pointer can point to any variable that is not declared with the const or volatile keyword. A void pointer cannot be dereferenced unless it is cast to another type. A void pointer can be converted into any other type of data pointer.  A void pointer can point to a function, but not to a class member in C++.  You cannot declare a variable of type void.  Example  // Examples of the void keyword void vobject;             // Error void *pv;                 // Okay int  *pint; int i; void main()               // main has no return value { pv = &i; pint = (int *)pv;     // Cast optional in C                       //     required in C++ }


Question: 类似getch的函数

引用 14 楼 u011761982 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] 搜“NCURSES”库 赵老师，你这答案犹如莫奈的日出一样，朦胧且唯美，印象派大师呀[/quote] http://www.baidu.com/s?wd=NCURSES&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_enter=0&inputT=9453

搜“NCURSES”库

引用 13 楼 zhao4zhong1 的回复:搜“NCURSES”库 赵老师，你这答案犹如莫奈的日出一样，朦胧且唯美，印象派大师呀

引用 11 楼 Bokutake 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] rewind(stdin); getch()的作用是直接读取键盘输入，而不显示在屏幕上。 而rewind(stdin)是清除键盘缓冲区。清除了键盘缓冲区，getchar()就读不到东西了。 Windows下有_getch() ，Linux有getch()，不过必须使用curses。 #include <curses.h> initscr(); int ch = getch(); endwin();[/quote] 可以试试我上面的代码，rewind(stdin)之后，第二个getchar()还是获取到了回车 我的环境是centos 还有getch好像是windows先有的吧，在conio.h里面的，反倒是Linux默认没有这个函数，man不到

引用 6 楼 zxh707wk 的回复:你说的是在哪个系统上用的？ 主要windows上，最好也有linux上的

引用 5 楼 zhao4zhong1 的回复:rewind(stdin); 这个有啥用？定位流的呀

引用 5 楼 zhao4zhong1 的回复:rewind(stdin); getch()的作用是直接读取键盘输入，而不显示在屏幕上。 而rewind(stdin)是清除键盘缓冲区。清除了键盘缓冲区，getchar()就读不到东西了。 Windows下有_getch() ，Linux有getch()，不过必须使用curses。 #include <curses.h> initscr(); int ch = getch(); endwin();

试了一把，代码如下：  #include <stdio.h>  int main() { 	char s1 = getchar(); 	rewind(stdin); 	printf("\nhello");  	char s2 = getchar(); 	printf("\nhello");  	return 0; }  debug的时候，还是要回车才会输入，第二个char输入的是回车键，达不到getch的效果

引用 5 楼 zhao4zhong1 的回复:rewind(stdin);+1,直接用这个吧

准确的讲，应该不是跳过键盘缓冲，而是将缓冲区的内容“吃掉”，清空缓冲区。

你说的是在哪个系统上用的？

rewind(stdin);

引用 楼主 u011761982 的回复:求助： 在c标准库有没有一个函数可以实现类似getch的功能，可以跳过键盘缓冲。 kbhit(); 这个，只要键盘有按下，就返回一个值。

嗯，不知道，我就是知道 getchar(); 能吃掉上次操作的回车等，缓冲区的东西~

我觉得没有，99%的把握。“跳过键盘缓冲”这种操作是平台相关的。


Question: C语言结构体里面动态多为数组问题？

还是用赵老师的方法。谢谢大家的热心回复。

纯正的c中不能使用STL吧？

引用 5 楼 zhao4zhong1 的回复://在堆中开辟一个3×4×5的3维int数组 #include <stdio.h> #include <malloc.h> int ***p; int i,j,k; void main() {     p=(int ***)malloc(3*sizeof(int **));     if (NULL==p) return;     for (i=0;i<3;i++) {         p[i]=(int **)malloc(4*sizeof(int *));         if (NULL==p[i]) return;         for (j=0;j<4;j++) {             p[i][j]=(int *)malloc(5*sizeof(int));             if (NULL==p[i][j]) return;         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 p[i][j][k]=i*20+j*5+k;             }         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 printf(" %2d",p[i][j][k]);             }             printf("\n");         }         printf("---------------\n");     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             free(p[i][j]);         }         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //--------------- // 20 21 22 23 24 // 25 26 27 28 29 // 30 31 32 33 34 // 35 36 37 38 39 //--------------- // 40 41 42 43 44 // 45 46 47 48 49 // 50 51 52 53 54 // 55 56 57 58 59 //---------------  赵老师这个更狠，工作中谁要让我阅读这种代码，我非杀了他不可，不过秀一秀还不不错滴

请问@Yuiliet，使用的时候如何分配呢，又该怎么引用呢？

struct NODE { int ***p; int ***q; int ***r; };

请问三维动态数组做函数参数，这样写对吗？ double ***p

人家说C   你们都把stl搬出来了  哎

仅供参考 //在堆中开辟一个2×3×4×5的4维int数组 #include <stdio.h> #include <malloc.h> int ****p; int h,i,j,k; void main() {     p=(int ****)malloc(2*sizeof(int ***));     if (NULL==p) return;     for (h=0;h<2;h++) {         p[h]=(int ***)malloc(3*sizeof(int **));         if (NULL==p[h]) return;         for (i=0;i<3;i++) {             p[h][i]=(int **)malloc(4*sizeof(int *));             if (NULL==p[h][i]) return;             for (j=0;j<4;j++) {                 p[h][i][j]=(int *)malloc(5*sizeof(int));                 if (NULL==p[h][i][j]) return;             }         }     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 for (k=0;k<5;k++) {                     p[h][i][j][k]=h*60+i*20+j*5+k;                 }             }         }     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 for (k=0;k<5;k++) {                     printf(" %3d",p[h][i][j][k]);                 }                 printf("\n");             }             printf("--------------------\n");         }         printf("=======================\n");     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 free(p[h][i][j]);             }             free(p[h][i]);         }         free(p[h]);     }     free(p); } //   0   1   2   3   4 //   5   6   7   8   9 //  10  11  12  13  14 //  15  16  17  18  19 //-------------------- //  20  21  22  23  24 //  25  26  27  28  29 //  30  31  32  33  34 //  35  36  37  38  39 //-------------------- //  40  41  42  43  44 //  45  46  47  48  49 //  50  51  52  53  54 //  55  56  57  58  59 //-------------------- //======================= //  60  61  62  63  64 //  65  66  67  68  69 //  70  71  72  73  74 //  75  76  77  78  79 //-------------------- //  80  81  82  83  84 //  85  86  87  88  89 //  90  91  92  93  94 //  95  96  97  98  99 //-------------------- // 100 101 102 103 104 // 105 106 107 108 109 // 110 111 112 113 114 // 115 116 117 118 119 //-------------------- //======================= //

我要把动态的三维数组作为函数参数，数组有4个，这样的话感觉参数太多了，请问应该怎么解决啊？

建议使用标准库容器

建议不要使用大于一维的数组 struct x { std::vector< int > a; std::vector< double > b; std::vector< x * > c; std::vector< y > d; }


Question: C++如何寻找文件目录

system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。

对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。 #include <windows.h> #include <commdlg.h>  static OPENFILENAME ofn;  void FileDlgInit (HWND hwnd) {     static TCHAR szFileFilter[] =TEXT ("TXT Files (*.TXT)\0*.TXT\0") \ 								 TEXT ("EPS Files (*.EPS)\0*.EPS\0") \ 								 TEXT ("DOC Files (*.DOC)\0*.DOC\0") \ 								 TEXT ("All Files (*.*)\0*.*\0\0") ;            ofn.lStructSize       = sizeof (OPENFILENAME);      ofn.hwndOwner         = hwnd;      ofn.hInstance         = NULL;      ofn.lpstrFilter       = szFileFilter;      ofn.lpstrCustomFilter = NULL;      ofn.nMaxCustFilter    = 0;      ofn.nFilterIndex      = 0;      ofn.lpstrFile         = NULL;       ofn.nMaxFile          = MAX_PATH;      ofn.lpstrFileTitle    = NULL;      ofn.nMaxFileTitle     = MAX_PATH;      ofn.lpstrInitialDir   = NULL;      ofn.lpstrTitle        = NULL;      ofn.Flags             = 0;      ofn.nFileOffset       = 0;      ofn.nFileExtension    = 0;      ofn.lpstrDefExt       = TEXT ("txt");      ofn.lCustData         = 0L;      ofn.lpfnHook          = NULL;      ofn.lpTemplateName    = NULL; }  BOOL FileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName) {      ofn.hwndOwner         = hwnd;      ofn.lpstrFile         = pstrFileName;      ofn.lpstrFileTitle    = pstrTitleName;      ofn.Flags             = OFN_HIDEREADONLY | OFN_CREATEPROMPT;            return GetOpenFileName (&ofn) ; }  BOOL FileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName) {      ofn.hwndOwner         = hwnd;      ofn.lpstrFile         = pstrFileName;      ofn.lpstrFileTitle    = pstrTitleName;      ofn.Flags             = OFN_OVERWRITEPROMPT;            return GetSaveFileName (&ofn); }

你是说CFileDialog，去网上搜索用法

用winapi遍历所有目录。


Question: 嵌入式下，内存不够用，mmap可以吗？

或者用固态硬盘也可以无视碎片问题.

Linux的文件系统号称没有磁盘碎片问题.

引用 20 楼 zhao4zhong1 的回复:[quote=引用 17 楼 npu_wy 的回复:] [quote=引用 15 楼 zhao4zhong1 的回复:] 我解决内存不够用的思路只有一条： 用文件读写模拟内存读写，参考_lseeki64函数。 使用这种方法，只要硬盘空间够用，比如用1TB的存储空间毫无压力。可是碎片如何管理？鸵鸟策略，还是自己来写下？[/quote] 文件管理不怕碎片。 您是否希望迅速对您频繁使用的文件进行碎片整理？使用 Contig 优化单个的文件，或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428 [/quote]Contig是M$的exe，linux也用不了...  创建连续的新文件或许会占用太多空间....

内存不够考虑把占用内存的代码优化掉，比如减少线程和减少缓存

引用 19 楼 zhao4zhong1 的回复:因为mmap用不了1TB那么大。为什么不可以呢？

引用 17 楼 npu_wy 的回复:[quote=引用 15 楼 zhao4zhong1 的回复:] 我解决内存不够用的思路只有一条： 用文件读写模拟内存读写，参考_lseeki64函数。 使用这种方法，只要硬盘空间够用，比如用1TB的存储空间毫无压力。可是碎片如何管理？鸵鸟策略，还是自己来写下？[/quote] 文件管理不怕碎片。 您是否希望迅速对您频繁使用的文件进行碎片整理？使用 Contig 优化单个的文件，或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428

因为mmap用不了1TB那么大。

引用 16 楼 zhao4zhong1 的回复:[quote=引用 15 楼 zhao4zhong1 的回复:] 我解决内存不够用的思路只有一条： 用文件读写模拟内存读写，参考_lseeki64函数。 使用这种方法，只要硬盘空间够用，比如用1TB的存储空间毫无压力。 当然如果嵌入式环境不支持_lseeki64只支持fseek或_lseek的话，最大只能是4GB甚至2GB了。[/quote]为什么不用mmap呢？不过，即使是mmap，还是要面临类似存储管理的问题，碎片呀，分配策略呀什么的。 如果说文件用久了直接关了重开，这个想法还是算了，假如我就开一个文件，一直在用

引用 15 楼 zhao4zhong1 的回复:我解决内存不够用的思路只有一条： 用文件读写模拟内存读写，参考_lseeki64函数。 使用这种方法，只要硬盘空间够用，比如用1TB的存储空间毫无压力。可是碎片如何管理？鸵鸟策略，还是自己来写下？

引用 15 楼 zhao4zhong1 的回复:我解决内存不够用的思路只有一条： 用文件读写模拟内存读写，参考_lseeki64函数。 使用这种方法，只要硬盘空间够用，比如用1TB的存储空间毫无压力。 当然如果嵌入式环境不支持_lseeki64只支持fseek或_lseek的话，最大只能是4GB甚至2GB了。

引用 25 楼 zhao4zhong1 的回复:或者用固态硬盘也可以无视碎片问题.虽然我没弄清楚核心问题，也许是我问的不清楚，不过还是很谢谢您了！ 请你去这个帖子也回复下，分呈上！ http://bbs.csdn.net/topics/390850139?page=1#post-397906189

mmap是映射整个文件到内存中。 是占用内存，不是释放内存用的。 所以不能满足你的要求。  内存不够，可心缓存到磁盘。设定swap大小

帮你顶一下吧，没有研究过

引用 7 楼 zhao4zhong1 的回复:嵌入式系统支持mmap，且不超过2GB们可以用mmap刚才重新测试了以下mmap开辟的文件，情况完全和之前不一样： open打开一个文件，lseek设置其为2GB(是个空洞文件)，然后交给mmap去映射，得到其返回的指针； 接下来，我向这个指针开始的“缓冲区”中循环0x7fffffff次  memcpy，每次1B，向文件写2.1GB的字符，结果在写的过程中，使用du -lh filename发现：随着写入字符的增多，文件在增大，关键的是，使用pgrep a.out  和 cat \proc\pid\status | grep VmRSS 发现：VmRSS 和文件大小同步增大，直到2.1GB，说明……  之前的想法是错误的，物理内存被占用了…… 您有解决内存不够用的思路吗？ 麻烦您思考下吧

引用 12 楼 zhao4zhong1 的回复:引用 11 楼 npu_wy 的回复:[quote=引用 10 楼 zhao4zhong1 的回复:] 64位不过我64位ubuntu sizeof(size_t)为8..... 8个字节不就是64位吗。[/quote]I'm sorry，犯傻了

引用 11 楼 npu_wy 的回复:引用 10 楼 zhao4zhong1 的回复:64位不过我64位ubuntu sizeof(size_t)为8..... 8个字节不就是64位吗。


Question: C语言函数声明和定义都写在头文件里

在定义自定义的头文件时，尽量将头文件与工程文件放在同一个目录下，这样方面查找，并且用到头文件需要在*.c文件中添加头文件，并且需要指定文件的路径，默认是从当前目录开始查找，在引用自定义头文件时需要使用双引号""，不能用尖括号<>。

链接时，要把.cpp编译出来的.o文件加进去一起参与链接

引用 楼主 zhaolewen 的回复:最近调程序，本来头文件.h中存放函数声明，C文件存放函数定义，可是调试的时候总是提示 找不到符号，后来把函数的定义也写到头文件里，程序调试就没有问题了，不知打架有没有遇到过类似的问题，谢谢。 我也知道不能这么搞，可是不知道是哪里设置的问题，请问应该从哪入手

找不到符号，说明你的c文件没有被编译。检查c文件名和头文件名是否一致，工程编译选项是否设置正确，文件的依赖关系是还设置正确。

lz在工程里包含了.c和.h文件了吗

函数定义定在头文件肯定是不行的, 这样的文件如果在同一工程里的不同文件包含就编译不过了. 调试的时候找不到符号肯定是工程设置有问题, 但解决不能这么解决啊


Question: unsigned short dd = '\254'; //八进制: '\254', printf("%u\n", dd); //输出: 65452, 为什么不

引用 1 楼 lovesmiles 的回复:'\254'是一个字符，是char型的，char的表示范转是-128到127。所以char无法表示成172.只能表示成172相对于256的补码-84.  也就是dd =-84;由于unsigned short是无符号数，所以后-84又表示成65536的补码，即65452。也就是你看到的输出。  将代码改成如下即可： unsigned short dd = (unsigned char)('\254'); //八进制: '\254', 将char 型强制转换成unsigned char。使得172不会超出表示范围。 printf("%u\n", dd); //输出: 65452, 为什么不是172?  我强调一下，用'\254'来表示一个8进制数真的是很烂很烂的想法！  谢谢，谢谢， 懂了

引用 1 楼 lovesmiles 的回复:'\254'是一个字符，是char型的，char的表示范转是-128到127。所以char无法表示成172.只能表示成172相对于256的补码-84.  也就是dd =-84;由于unsigned short是无符号数，所以后-84又表示成65536的补码，即65452。也就是你看到的输出。  将代码改成如下即可： unsigned short dd = (unsigned char)('\254'); //八进制: '\254', 将char 型强制转换成unsigned char。使得172不会超出表示范围。 printf("%u\n", dd); //输出: 65452, 为什么不是172?  我强调一下，用'\254'来表示一个8进制数真的是很烂很烂的想法！+1lz请注意一下字符型的取值范围

这样用转义字符好像不能超过'\177',也就是十进制的127。


Question: 关于编译64位程序的问题

《The Intel 64 and IA-32 Architectures Software Developer's Manual》

同一份代码，既可以采用32位编译，也可以使用64位编译，但编译出来的程序会有些许差别：  1. 采用32位编译方式编译出来的程序，既能跑在32位的计算机上，也能跑在64位的计算机上，但无论在哪种计算机平台下，这个程序所能使用的内存上限为4GB。也就是说，即使在64位且128GB内存的计算机下，这个程序也不能使用超过4GB的内存。  2. 采用64位编译方式，生成的程序只能跑在64位计算机下（跑在32位计算机下会报错），但程序可以使用超过4GB的内存空间。  3. 某些变量类型所占的字节数有所不同，如VS2010中采用32位编译方式，指针占4字节，set类型占24字节，而在64位编译方式下指针则占8字节，set类型占48字节。当然，一些类型如char，int等，它们所占用的字节数在32位和64位方式下都一样，分别为1字节和4字节。

64位程序可以在32位环境下的64位虚拟机里面运行

引用 4 楼 zilaishuichina 的回复:32位程序 一样可以使用 int64，  跟你使不使用64位变量 半毛钱关系也没有。  64位程序是指你在编译的时候， 编译选项设置成x64，  64位程序无法在32位环境下运行+1

vs2010后的版本吧 都有设置的 64位编译出来后，32位系统就不能用了,只能在64位系统上面跑吧

《程序员的自我修养》这本书有提到32位exe和64位的exe有什么不一样。 你要是问怎么才能开发出一个64位的程序，楼上已经有说明。

64位变量 + 64位编译器 WIN64


Question: C free 软件中的几个小问题，求解！多谢。

在工具-选项里可以选保存的是.c还是.cpp文件

感谢 1 楼 2楼的回复 。按照1楼的方法来做，第一次运行后保存是.c格式的文件 ，但是之后所有的文件运行之后 保存时 选中 .c格式 依然不是C格式的文件，，求解 这是什么原因呢？ PS：我新建的是文件，没有新建工程，

新建工程会后成工程文件，这些文件会包括项目的资源，配置，编译选项等属性。你可以在工程的基础上面添加文件。

工程是由多个文件构成的 .cpp是不能直接运行的，需要编译链接生成对应的可执行文件才可以运行。


Question: 如何为vc++6.0的exe文件图标进行修改

引用 5 楼 fangshiling 的回复:win 32 console application   , 空程序控制台， 工程目录树是什么- -（菜鸟Ing） 如果没有旧在视图那边点击右键“add->resource->Icon”

引用 5 楼 fangshiling 的回复:win 32 console application   , 空程序控制台， 工程目录树是什么- -（菜鸟Ing） VS2010的，和2008查不多：

引用 3 楼 fangshiling 的回复:我在myproject里没找到rse的文件夹.....res在哪里- - 你建立的工程是什么类型的？控制台类型？ 把你的工程目录树截图放上来看看。

我在myproject里没找到rse的文件夹.....res在哪里- -

引用 1 楼 zjq9931 的回复:[quote=引用 楼主 fangshiling 的回复:] 有人说在res文件夹中添加什么的不是太懂，求大家不嫌麻烦详细赐教 进入工程中的res文件夹，里面有.ico文件，那个就是程序的图标文件。修改那个文件就可以修改程序图标。 在IDE开发环境中选择“资源视图（resource view）”，也可以找到图标，进行修改的。[/quote] 对，你自己在那个图标上面画几下再编译出来就可以看到效果了。

引用 楼主 fangshiling 的回复:有人说在res文件夹中添加什么的不是太懂，求大家不嫌麻烦详细赐教 进入工程中的res文件夹，里面有.ico文件，那个就是程序的图标文件。修改那个文件就可以修改程序图标。 在IDE开发环境中选择“资源视图（resource view）”，也可以找到图标，进行修改的。


Question: 不用strcat函数连接两个字符串

可以用strlen函数检查一下，你目标的str3，是不是你预期的str1+str2的长度，输出有乱码的情况str3肯定比你str1+str2长。 建议单步调试一下，在有乱码的情况下结尾必然不是'\0'

凡是遇到 过长 过短字符串问题  优先考虑‘\0’结束符的问题！

#include <stdio.h> #include <conio.h> #include <math.h> main() { 	char c,str1[100],str2[100],str3[300]; 	int i,j; 	printf("Please input the first string\nConfirm by Enter\n"); 	gets(str1); 	printf("Please input the second string\nConfirm by Enter\n"); 	gets(str2); 	for(i=0;(c=str1[i])!='\0';i++) 	{ 		str3[i]=str1[i]; 	}; 	j=i; 	for(i=0;(c=str2[i])!='\0';i++,j++) 	{ 		str3[j]=str2[i]; 	};  	str3[j] = '\0';	//添加'\0'  	printf("The string which has been connected is:\n%s",str3);  	getch(); }   因为你代码能将两个字符串拼接起来，但是输出时却输出了其他的字符，所以就可以知道输出时并没有正常结束，输出字符串一般都是遇到‘\0’字符才会结束输出。而且你两个for循环判断都是以'\0'作为结束标识，所以数组最后一个'\0'字符并不会存入数组中，只需要在数组最后添加'\0'字符就能正常输出了。

引用 1 楼 zjq9931 的回复:第二个字节的结束符要放进去才对，改了一下。增加了一句。  #include "stdio.h" #include "conio.h" #include "math.h" int main() { 	char c,str1[100],str2[100],str3[300]; 	int i,j; 	printf("Please input the first string\nConfirm by Enter\n"); 	gets(str1); 	printf("Please input the second string\nConfirm by Enter\n"); 	gets(str2); 	for(i=0;(c=str1[i])!='\0';i++) 	{ 		str3[i]=str1[i]; 	} 	j=i; 	for(i=0;(c=str2[i])!='\0';i++,j++) 	{ 		str3[j]=str2[i]; 	} 	str3[j]=str2[i];//'\0'要放进去才行。 	printf("The string which has been connected is:\n%s",str3); 	getch(); 	return 0; } +1

过来围观一下  顺便说一句，我处理字符串要是忘了加结尾，一般都是出一堆“烫”

引用 3 楼 qq_18876709 的回复:嗯 确实是 加一个'\0'可以解决问题 但不知原因是什么 原因就是，没有'\0'结束符，会把后面的内存的东西也显示出来，直到遇到‘\0’为止，所以你那里出现了那个当年叫做“实人头”的字符。

嗯 确实是 加一个'\0'可以解决问题 但不知原因是什么

memmove


Question: http 分片取数据 (断点续传)

206 Partial Content  正解

如果你发现发回Response是这样开头的，那就找到支持续传的服务器啦 206 Partial Content  更多解释： The server is delivering only part of the resource due to a range header sent by the client. The range header is used by tools like wget to enable resuming of interrupted downloads, or split a download into multiple simultaneous streams.

恩恩。试试谢谢。

你肯定手上已经完成一些代码了，你可以尝试不同的HTTP服务器（可以续传的，不可以续传的）， 看一下返回的Response头部的那些字段的不同，相信很容易看明白

一定要明确：HTTP服务器有权拒绝断点续传请求， 在发回的response里，有专门的字段告诉你续传是否成功 你需要根据response的header相关字段判断，传回的数据是续传的，还是普通的方式  仅仅发出断点续传的请求并不能保证就能得到满足，换句话说，你只有权力提出一个协商请求，人家不一定同意 许多网站为了禁止多线程下载行为，直接就不提供给你断点续传的可能性  可能是我罗嗦，再加一句解释：多线程下载，通常就是通过断点续传实现的（HTTP/FTP都类似）


Question: zigbee2530片内温度采集例程串口输出不对

引用 5 楼 jie417813216 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 在任何开发环境下，先学会使用调试器调试。 或者先学会写日志。[/quote]  额额，愿闻其详。[/quote] 调试器： debug symdeb turbo debug codeview sofe-ice windbg ollydbg gdb …… 写日志： TRACE printf log4c MyLog： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中

引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 在任何开发环境下，先学会使用调试器调试。 或者先学会写日志。[/quote]  额额，愿闻其详。

引用 1 楼 lovesmiles 的回复:帮你顶一下。  谢谢，刚创博客，多点光顾哈~

引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 jie417813216 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 在任何开发环境下，先学会使用调试器调试。 或者先学会写日志。[/quote]  额额，愿闻其详。[/quote] 调试器： debug symdeb turbo debug codeview sofe-ice windbg ollydbg gdb …… 写日志： TRACE printf log4c MyLog： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中 [/quote] 谢谢您啊~ 这得慢慢消化。。

引用 2 楼 zhao4zhong1 的回复:在任何开发环境下，先学会使用调试器调试。 或者先学会写日志。

在任何开发环境下，先学会使用调试器调试。

帮你顶一下。


Question: 部标808 协议 位置上报解析问题

参考：部标系列博客文章

楼主，能不能分享一下，这个是怎么解析的呢？

解决了说一下怎么解决的啊

这个是严格按照JT/T808协议的完整数据包格式，你把JT/T808协议的文档看一遍就可以对号入座了

已经解决了

我搞过,你需要资料,短我,我可以帮你解决

问楼下

引用 3 楼 lovesmiles 的回复:没有搞过这个协议，帮你一下。  谢谢了,周围朋友有搞过的吗,帮忙问问

没有搞过这个协议，帮你一下。

引用 1 楼 zjq9931 的回复:[quote=引用 楼主 q656705009 的回复:] 7E 02 00 00 3C 01 37 17 86 19 55 14 78 00 00 00 00  00 00 00 02  02 61 61 D8  06 EE 18 28  00 00  00 00  00 00  14 08 06 02 40 07 01 04 00 00 00 00  33 18 2A 4D 30 30 2C 31 35 2C 31 30 34 30 32 31 30 38 37 36 35 34 33 32 31 23 B6 7E  这个是位置上报的报文 哪一段是经度纬度 还有就是怎么解析 谢邀，实在抱歉，我对这个完全外行。不了解。。。[/quote]  引用 1 楼 zjq9931 的回复:[quote=引用 楼主 q656705009 的回复:] 7E 02 00 00 3C 01 37 17 86 19 55 14 78 00 00 00 00  00 00 00 02  02 61 61 D8  06 EE 18 28  00 00  00 00  00 00  14 08 06 02 40 07 01 04 00 00 00 00  33 18 2A 4D 30 30 2C 31 35 2C 31 30 34 30 32 31 30 38 37 36 35 34 33 32 31 23 B6 7E  这个是位置上报的报文 哪一段是经度纬度 还有就是怎么解析 谢邀，实在抱歉，我对这个完全外行。不了解。。。[/quote]  谢谢了.有朋友搞过吗.帮我问问

引用 楼主 q656705009 的回复:7E 02 00 00 3C 01 37 17 86 19 55 14 78 00 00 00 00  00 00 00 02  02 61 61 D8  06 EE 18 28  00 00  00 00  00 00  14 08 06 02 40 07 01 04 00 00 00 00  33 18 2A 4D 30 30 2C 31 35 2C 31 30 34 30 32 31 30 38 37 36 35 34 33 32 31 23 B6 7E  这个是位置上报的报文 哪一段是经度纬度 还有就是怎么解析 谢邀，实在抱歉，我对这个完全外行。不了解。。。

大家帮帮忙啊...


Question: 跪求各位大神~~有木有C/Matlab的模拟电梯系统的源代码？

引用 2 楼 u010340197 的回复:楼主是在做。。。课程设计？！  算是吧~主要是个beginner各种手足无措啊~

引用 1 楼 lovesmiles 的回复:百度即可找到。  找到咯~谢谢

百度即可找到。

楼主是在做。。。课程设计？！


Question: 新手问几个问题

我记得PS3 貌似是基于 OpenGL ES的 ~

引用 7 楼 u013656585 的回复:楼主有个领导的梦，但是缺乏基层锻炼，先下乡看看吧 梦不敢谈 确实还差得多

第一个问题，一个是声明变量，逗号作为分隔符功能；一个是表示式，逗号作为运算符，连接多个表达式，看不出有什么不能区分的。其实你压根不需要区别，区别已经这么明显了。 第二个问题，字符串最后的'\0'是编译器帮你加上的，编译器君还是很智能的。还有因为c语言不检测数组越界的，你往里填多少字符都随你，反正程序出错也是你的问题。c语言原则就是要相信程序员，结果你自己坑自己... 第三个问题，sizeof返回的是类型大小而不是字符个数，楼上说的很清楚了。对于任何字符串处理函数，或者说%s，人家写程序的时候，就写好了，要判断'\0'作为字符串结束的标志，可能就是约定成俗嘛。所以对于字符串来说，‘\0'是非常特殊的，其他的都是一般字符，木有区别。 后面的交给专业人士。 看书，看书，实践，实践

引用 8 楼 whxsdqduowan 的回复:[quote=引用 5 楼 zjq9931 的回复:] [quote=引用 4 楼 whxsdqduowan 的回复:] [quote=引用 2 楼 zjq9931 的回复:] [quote=引用 楼主 whxsdqduowan 的回复:] 1， 逗号运算符和逗号分隔符 我之前for(n=1, o=2; n>=10; n++)中是逗号运算符 printf函数的参数列表是逗号分隔符能分得清   但是自从我知道了char name01, name02中的逗号也是分隔符以后 我就完全对以前的区分方法产生了怀疑 现在我无法准确区分了    2，是不是字符串是一个特殊的数组，且只有字符串才自动在数组的最后一个元素中加入空字符？那么就是说char[5] = "abcde";中的e会被舍位？    3，空字符 空白字符这两者 在sizeof   sizeof()   length   函数scanf   函数printf中的哪几个会有特殊影响？（比如停止读取或打印 或者其返回的结果不包含这两者）    4，LLVM安装我有点看不明白 跟一般软件不一样 这款编译器或者编程书写工具不是一个直观的东西吗 是付费的吧   5，如果以开发家用游戏机软件为暂定就职目标（非PC 所以不知道有没有人了解） 程序员需要根据哪几个方面来选择职位呢 或者说 家用游戏机软件程序员的工作大致分为几大类？需要哪些基础？  1.不清楚你哪里搞不清楚，哪里混乱了？ 2.char[5] = "abcde";这个是越界,e不会被舍位。另外要加上变量名：char str[5] = "abcde";字符串，是特殊的字符型数组，以0为结尾的字符型数组。 3.空白字符，一般指，不可显示字符，比如空格，TAB键等。空字符，一般指'\0'。sizeof返回的是数据类型的大小，数组的大小，变量的大小。length是长度，如果是字符串的话，那么就是除空字符外的字符个数；空白字符，空字符，都会影响scanf,空字符会影响printf，但空白字符不会影响。  4.LLVM我没有用过。 5.编程语音掌握好，C/C++为主，其他语言用的不多。专用的游戏机，肯定有专用的API，如果API有对外发布，那么就可以自己联系，如果没有，那么就现学。[/quote]  1，因为假如要是硬记不去找规律的话 我可以背下来 但是我第一次见到char name01, name02; 感觉逗号两侧的元素的关系和特点更接近for(n=1, o=2; n>=10; n++)的逗号 而不是printf中的  3，也就是说sizeof 既包含空字符也包含空白字符 length包含空白字符不包含空字符是吗  5，现学需不需要掌握3维空间里物体生成的原理（比如为何移动摄像机可以从看到物体的另一侧） 或者动画曲线是如何制作出来的 如果有引擎支持 那么程序员的工作剩下哪些？[/quote] 1.逗号，用来做分隔符的时候，比用来做表达式的时候多。 char name01, name02; 这个是声明变量。也是分隔符。因为这是一个整体的表达式。 n=1, o=2;这个是分隔两个表达式；printf中的逗号也是分隔符的啊。这几个的作用可以说是一样的啊。  3.sizeof，不是既包含空字符也包含空白字符，和字符没有关系。sizeof是得到“变量、数组、数据类型”这个箱子的大小，和箱子里面装什么东西无关。length，是得到箱子里面装了多少东西，空字符，相等于一个结束标记。  5.我没有做过游戏，但根据我的经验，大型的游戏制作，都是需要多人分工完成的，入行，只要知道制作的标准和原理就可以了，当然如果深入了解那肯定是需要的了解的。有了游戏引擎，程序猿要做的是，脚本编写，游戏逻辑支撑，把游戏剧情翻译成代码，关卡，等级等的，设定保证没有漏洞。[/quote]  3, 不是字符串的数组不会有空字符吗？   空字符不也是箱子里装的东西吗 难道说在声明数组下标时 空字符是不包含在数组下标声明的空位之中的？  1， 逗号在确定是运算符的时候 整个才可以定性成表达式 假如事先不知道逗号到底是哪一个的话 那么整个语句中的name01, name02我也可以看做是一个逗号表达式 就像for语句中的n=1, o=2是一个表达式一样 printf之中的因为逗号分隔开的参数对应的是各自的打印说明符 而不是同一个对象 而是两个地方 换句话说 前两者其实是在一个位置放了两个东西 他们都做同一件事 而printf中的逗号我觉得是在两个位置各自放了一个东西 他们是做各自的事 所以我在之前将char name01, name01;中的逗号归类给了for语句那样 属于运算符  5， 这个看来还得工作经验的人说说 具体工作需要的是哪方面 虽然很多人都是想做游戏才来的 但我不是追逐梦想的那种 技术活分工多 不同职位各自知识也不知道方向有多大不同 还是找对方向 别眼高手低了[/quote]  1.确实是你说的这样。就像函数有返回值一样，如果把分隔符应当成表达式，是没有问题的，那么逗号表达式的返回值，是什么，我们不关注的时候，就不用管其返回值是什么，就像printf函数，也是有返回值的，一般情况下是没有人关注的。  3.不是字符串的数组当然可以有空字符。空字符也是装在箱子里的东西，没错。你说的声明下标。这个我没有太明白你想表达什么意思。  5.是的。需要有经验的人来说说。

1、你怀疑什么？ 2、在C语言中，使用字符数组表示字符串 3、自己可以动手写个程序试一下 4、直观？怎么说？ 5、不清楚，可以试一试google、百度

引用 5 楼 zjq9931 的回复:[quote=引用 4 楼 whxsdqduowan 的回复:] [quote=引用 2 楼 zjq9931 的回复:] [quote=引用 楼主 whxsdqduowan 的回复:] 1， 逗号运算符和逗号分隔符 我之前for(n=1, o=2; n>=10; n++)中是逗号运算符 printf函数的参数列表是逗号分隔符能分得清   但是自从我知道了char name01, name02中的逗号也是分隔符以后 我就完全对以前的区分方法产生了怀疑 现在我无法准确区分了    2，是不是字符串是一个特殊的数组，且只有字符串才自动在数组的最后一个元素中加入空字符？那么就是说char[5] = "abcde";中的e会被舍位？    3，空字符 空白字符这两者 在sizeof   sizeof()   length   函数scanf   函数printf中的哪几个会有特殊影响？（比如停止读取或打印 或者其返回的结果不包含这两者）    4，LLVM安装我有点看不明白 跟一般软件不一样 这款编译器或者编程书写工具不是一个直观的东西吗 是付费的吧   5，如果以开发家用游戏机软件为暂定就职目标（非PC 所以不知道有没有人了解） 程序员需要根据哪几个方面来选择职位呢 或者说 家用游戏机软件程序员的工作大致分为几大类？需要哪些基础？  1.不清楚你哪里搞不清楚，哪里混乱了？ 2.char[5] = "abcde";这个是越界,e不会被舍位。另外要加上变量名：char str[5] = "abcde";字符串，是特殊的字符型数组，以0为结尾的字符型数组。 3.空白字符，一般指，不可显示字符，比如空格，TAB键等。空字符，一般指'\0'。sizeof返回的是数据类型的大小，数组的大小，变量的大小。length是长度，如果是字符串的话，那么就是除空字符外的字符个数；空白字符，空字符，都会影响scanf,空字符会影响printf，但空白字符不会影响。  4.LLVM我没有用过。 5.编程语音掌握好，C/C++为主，其他语言用的不多。专用的游戏机，肯定有专用的API，如果API有对外发布，那么就可以自己联系，如果没有，那么就现学。[/quote]  1，因为假如要是硬记不去找规律的话 我可以背下来 但是我第一次见到char name01, name02; 感觉逗号两侧的元素的关系和特点更接近for(n=1, o=2; n>=10; n++)的逗号 而不是printf中的  3，也就是说sizeof 既包含空字符也包含空白字符 length包含空白字符不包含空字符是吗  5，现学需不需要掌握3维空间里物体生成的原理（比如为何移动摄像机可以从看到物体的另一侧） 或者动画曲线是如何制作出来的 如果有引擎支持 那么程序员的工作剩下哪些？[/quote] 1.逗号，用来做分隔符的时候，比用来做表达式的时候多。 char name01, name02; 这个是声明变量。也是分隔符。因为这是一个整体的表达式。 n=1, o=2;这个是分隔两个表达式；printf中的逗号也是分隔符的啊。这几个的作用可以说是一样的啊。  3.sizeof，不是既包含空字符也包含空白字符，和字符没有关系。sizeof是得到“变量、数组、数据类型”这个箱子的大小，和箱子里面装什么东西无关。length，是得到箱子里面装了多少东西，空字符，相等于一个结束标记。  5.我没有做过游戏，但根据我的经验，大型的游戏制作，都是需要多人分工完成的，入行，只要知道制作的标准和原理就可以了，当然如果深入了解那肯定是需要的了解的。有了游戏引擎，程序猿要做的是，脚本编写，游戏逻辑支撑，把游戏剧情翻译成代码，关卡，等级等的，设定保证没有漏洞。[/quote]  3, 不是字符串的数组不会有空字符吗？   空字符不也是箱子里装的东西吗 难道说在声明数组下标时 空字符是不包含在数组下标声明的空位之中的？  1， 逗号在确定是运算符的时候 整个才可以定性成表达式 假如事先不知道逗号到底是哪一个的话 那么整个语句中的name01, name02我也可以看做是一个逗号表达式 就像for语句中的n=1, o=2是一个表达式一样 printf之中的因为逗号分隔开的参数对应的是各自的打印说明符 而不是同一个对象 而是两个地方 换句话说 前两者其实是在一个位置放了两个东西 他们都做同一件事 而printf中的逗号我觉得是在两个位置各自放了一个东西 他们是做各自的事 所以我在之前将char name01, name01;中的逗号归类给了for语句那样 属于运算符  5， 这个看来还得工作经验的人说说 具体工作需要的是哪方面 虽然很多人都是想做游戏才来的 但我不是追逐梦想的那种 技术活分工多 不同职位各自知识也不知道方向有多大不同 还是找对方向 别眼高手低了

帮忙顶一下算了

引用 4 楼 whxsdqduowan 的回复:[quote=引用 2 楼 zjq9931 的回复:] [quote=引用 楼主 whxsdqduowan 的回复:] 1， 逗号运算符和逗号分隔符 我之前for(n=1, o=2; n>=10; n++)中是逗号运算符 printf函数的参数列表是逗号分隔符能分得清   但是自从我知道了char name01, name02中的逗号也是分隔符以后 我就完全对以前的区分方法产生了怀疑 现在我无法准确区分了    2，是不是字符串是一个特殊的数组，且只有字符串才自动在数组的最后一个元素中加入空字符？那么就是说char[5] = "abcde";中的e会被舍位？    3，空字符 空白字符这两者 在sizeof   sizeof()   length   函数scanf   函数printf中的哪几个会有特殊影响？（比如停止读取或打印 或者其返回的结果不包含这两者）    4，LLVM安装我有点看不明白 跟一般软件不一样 这款编译器或者编程书写工具不是一个直观的东西吗 是付费的吧   5，如果以开发家用游戏机软件为暂定就职目标（非PC 所以不知道有没有人了解） 程序员需要根据哪几个方面来选择职位呢 或者说 家用游戏机软件程序员的工作大致分为几大类？需要哪些基础？  1.不清楚你哪里搞不清楚，哪里混乱了？ 2.char[5] = "abcde";这个是越界,e不会被舍位。另外要加上变量名：char str[5] = "abcde";字符串，是特殊的字符型数组，以0为结尾的字符型数组。 3.空白字符，一般指，不可显示字符，比如空格，TAB键等。空字符，一般指'\0'。sizeof返回的是数据类型的大小，数组的大小，变量的大小。length是长度，如果是字符串的话，那么就是除空字符外的字符个数；空白字符，空字符，都会影响scanf,空字符会影响printf，但空白字符不会影响。  4.LLVM我没有用过。 5.编程语音掌握好，C/C++为主，其他语言用的不多。专用的游戏机，肯定有专用的API，如果API有对外发布，那么就可以自己联系，如果没有，那么就现学。[/quote]  1，因为假如要是硬记不去找规律的话 我可以背下来 但是我第一次见到char name01, name02; 感觉逗号两侧的元素的关系和特点更接近for(n=1, o=2; n>=10; n++)的逗号 而不是printf中的  3，也就是说sizeof 既包含空字符也包含空白字符 length包含空白字符不包含空字符是吗  5，现学需不需要掌握3维空间里物体生成的原理（比如为何移动摄像机可以从看到物体的另一侧） 或者动画曲线是如何制作出来的 如果有引擎支持 那么程序员的工作剩下哪些？[/quote] 1.逗号，用来做分隔符的时候，比用来做表达式的时候多。 char name01, name02; 这个是声明变量。也是分隔符。因为这是一个整体的表达式。 n=1, o=2;这个是分隔两个表达式；printf中的逗号也是分隔符的啊。这几个的作用可以说是一样的啊。  3.sizeof，不是既包含空字符也包含空白字符，和字符没有关系。sizeof是得到“变量、数组、数据类型”这个箱子的大小，和箱子里面装什么东西无关。length，是得到箱子里面装了多少东西，空字符，相等于一个结束标记。  5.我没有做过游戏，但根据我的经验，大型的游戏制作，都是需要多人分工完成的，入行，只要知道制作的标准和原理就可以了，当然如果深入了解那肯定是需要的了解的。有了游戏引擎，程序猿要做的是，脚本编写，游戏逻辑支撑，把游戏剧情翻译成代码，关卡，等级等的，设定保证没有漏洞。

引用 2 楼 zjq9931 的回复:[quote=引用 楼主 whxsdqduowan 的回复:] 1， 逗号运算符和逗号分隔符 我之前for(n=1, o=2; n>=10; n++)中是逗号运算符 printf函数的参数列表是逗号分隔符能分得清   但是自从我知道了char name01, name02中的逗号也是分隔符以后 我就完全对以前的区分方法产生了怀疑 现在我无法准确区分了    2，是不是字符串是一个特殊的数组，且只有字符串才自动在数组的最后一个元素中加入空字符？那么就是说char[5] = "abcde";中的e会被舍位？    3，空字符 空白字符这两者 在sizeof   sizeof()   length   函数scanf   函数printf中的哪几个会有特殊影响？（比如停止读取或打印 或者其返回的结果不包含这两者）    4，LLVM安装我有点看不明白 跟一般软件不一样 这款编译器或者编程书写工具不是一个直观的东西吗 是付费的吧   5，如果以开发家用游戏机软件为暂定就职目标（非PC 所以不知道有没有人了解） 程序员需要根据哪几个方面来选择职位呢 或者说 家用游戏机软件程序员的工作大致分为几大类？需要哪些基础？  1.不清楚你哪里搞不清楚，哪里混乱了？ 2.char[5] = "abcde";这个是越界,e不会被舍位。另外要加上变量名：char str[5] = "abcde";字符串，是特殊的字符型数组，以0为结尾的字符型数组。 3.空白字符，一般指，不可显示字符，比如空格，TAB键等。空字符，一般指'\0'。sizeof返回的是数据类型的大小，数组的大小，变量的大小。length是长度，如果是字符串的话，那么就是除空字符外的字符个数；空白字符，空字符，都会影响scanf,空字符会影响printf，但空白字符不会影响。  4.LLVM我没有用过。 5.编程语音掌握好，C/C++为主，其他语言用的不多。专用的游戏机，肯定有专用的API，如果API有对外发布，那么就可以自己联系，如果没有，那么就现学。[/quote]  1，因为假如要是硬记不去找规律的话 我可以背下来 但是我第一次见到char name01, name02; 感觉逗号两侧的元素的关系和特点更接近for(n=1, o=2; n>=10; n++)的逗号 而不是printf中的  3，也就是说sizeof 既包含空字符也包含空白字符 length包含空白字符不包含空字符是吗  5，现学需不需要掌握3维空间里物体生成的原理（比如为何移动摄像机可以从看到物体的另一侧） 或者动画曲线是如何制作出来的 如果有引擎支持 那么程序员的工作剩下哪些？

楼主有个领导的梦，但是缺乏基层锻炼，先下乡看看吧

学习XBox开发。

引用 楼主 whxsdqduowan 的回复:1， 逗号运算符和逗号分隔符 我之前for(n=1, o=2; n>=10; n++)中是逗号运算符 printf函数的参数列表是逗号分隔符能分得清   但是自从我知道了char name01, name02中的逗号也是分隔符以后 我就完全对以前的区分方法产生了怀疑 现在我无法准确区分了    2，是不是字符串是一个特殊的数组，且只有字符串才自动在数组的最后一个元素中加入空字符？那么就是说char[5] = "abcde";中的e会被舍位？    3，空字符 空白字符这两者 在sizeof   sizeof()   length   函数scanf   函数printf中的哪几个会有特殊影响？（比如停止读取或打印 或者其返回的结果不包含这两者）    4，LLVM安装我有点看不明白 跟一般软件不一样 这款编译器或者编程书写工具不是一个直观的东西吗 是付费的吧   5，如果以开发家用游戏机软件为暂定就职目标（非PC 所以不知道有没有人了解） 程序员需要根据哪几个方面来选择职位呢 或者说 家用游戏机软件程序员的工作大致分为几大类？需要哪些基础？  1.不清楚你哪里搞不清楚，哪里混乱了？ 2.char[5] = "abcde";这个是越界,e不会被舍位。另外要加上变量名：char str[5] = "abcde";字符串，是特殊的字符型数组，以0为结尾的字符型数组。 3.空白字符，一般指，不可显示字符，比如空格，TAB键等。空字符，一般指'\0'。sizeof返回的是数据类型的大小，数组的大小，变量的大小。length是长度，如果是字符串的话，那么就是除空字符外的字符个数；空白字符，空字符，都会影响scanf,空字符会影响printf，但空白字符不会影响。  4.LLVM我没有用过。 5.编程语音掌握好，C/C++为主，其他语言用的不多。专用的游戏机，肯定有专用的API，如果API有对外发布，那么就可以自己联系，如果没有，那么就现学。

前二个问题和后二个问题差太远了。 我只回答第一个问题，你为什么要区分逗号是分隔符还是运算符？你既然只列出这三种情况，你不是已经做到区分了吗？列出第四种你区分不了的情况来看看嘛


Question: printf("char len is %d", strlen(&c)) ?????????????

char c = 'x';你知道c后面的内存放的是什么么？你不知道。要是其后面的内存里木有'\0'，strlen(&c)得到的长度能大得超乎你想象，当然最大的可能是段错误了。 提供一个strlen()的实现，方便理解：  int strlen(const char *str) { 	const char *p = str;  	while(*p != '\0')  //就是在这里需要'\0'，来判断字符串结束了 		p++; 	return p - str; }

学习了。

strlen是求字符串，里面的参数应该是字符串，不是字符或者地址

引用 29 楼 zxh707wk 的回复:[quote=引用 28 楼 zhangleiyigeren 的回复:] [quote=引用 25 楼 zxh707wk 的回复:] 目测lz没看书 别这么直接，，看书，，都忘了。。。不过这个问题是想要的答案是自己表达能力的问题。。。没表达出来[/quote]那你怎么没分清字符和字符串呢[/quote] 嗨嗨。。。分不清字符和字符串，，，？？？这个，，，嗨嗨，，

嗨嗨。。。分不清字符和字符串，，，？？？这个，，，嗨嗨，，，不辩

引用 24 楼 zhangleiyigeren 的回复:局部变量的高地址处  不同的编译器、不同的平台不一样。

目测lz没看书

局部变量的高地址处

引用 22 楼 go_and_see 的回复:这个问题，没啥好争论的吧？实在不明白有啥不理解的。  在栈中，main函数里的局部参数的高地址处存放的是什么

这个问题，没啥好争论的吧？实在不明白有啥不理解的。

引用 28 楼 zhangleiyigeren 的回复:[quote=引用 25 楼 zxh707wk 的回复:] 目测lz没看书 别这么直接，，看书，，都忘了。。。不过这个问题是想要的答案是自己表达能力的问题。。。没表达出来[/quote]那你怎么没分清字符和字符串呢

引用 25 楼 zxh707wk 的回复:目测lz没看书 别这么直接，，看书，，都忘了。。。不过这个问题是想要的答案是自己表达能力的问题。。。没表达出来

引用 26 楼 go_and_see 的回复:[quote=引用 24 楼 zhangleiyigeren 的回复:] 局部变量的高地址处  不同的编译器、不同的平台不一样。[/quote] 知道不同的编译器不同的平台，，，自己懒，，少说了，在自己的x86 gcc下面是这样的。

引用 12 楼 lin5161678 的回复:[quote=引用 11 楼 FENGQIYUNRAN 的回复:] 跑出多少 和 你说的东西毫无关系  全部说错了  多看看别人的回答 别自己YY 不喜勿喷[/quote]  哪一句话是在喷了   不允许别人说你错了吗  玻璃心?[/quote] 百度玻璃心：就是心很脆弱.. 容易受伤..或者说是很心软。学习了，呵呵

引用 11 楼 FENGQIYUNRAN 的回复:跑出多少 和 你说的东西毫无关系  全部说错了  多看看别人的回答 别自己YY 不喜勿喷[/quote]  哪一句话是在喷了   不允许别人说你错了吗  玻璃心?

引用 10 楼 lin5161678 的回复:[quote=引用 5 楼 FENGQIYUNRAN 的回复:] 在我的机器上这个代码跑出来时8，我的是X86的cpu，内存地址表示为0x00000000，其中0x表示十六进制，后面的8个0是就是实际字符的个数8；至于，你的长度是5，那么我能给出的解释就是你这个跑在8086PC上，因为他的内存表示00000~9FFFF是由5个字符表示的。楼主搜下“内存地址”学习下。 个人愚见，不保证准确。我的智能创意，聆讯儿，请您支持一下！跑出多少 和 你说的东西毫无关系  全部说错了  多看看别人的回答 别自己YY [/quote] 不喜勿喷

引用 5 楼 FENGQIYUNRAN 的回复:在我的机器上这个代码跑出来时8，我的是X86的cpu，内存地址表示为0x00000000，其中0x表示十六进制，后面的8个0是就是实际字符的个数8；至于，你的长度是5，那么我能给出的解释就是你这个跑在8086PC上，因为他的内存表示00000~9FFFF是由5个字符表示的。楼主搜下“内存地址”学习下。 个人愚见，不保证准确。我的智能创意，聆讯儿，请您支持一下！跑出多少 和 你说的东西毫无关系  全部说错了  多看看别人的回答 别自己YY

奇了怪了 我换到另一台X64配置如下：  结果每次稳稳的是8：  难道是和编译器有关？先洗洗睡了

引用 17 楼 Yuiliet 的回复:这是汇编部分的知识，叫内存填充什么的 为的是方便编译器寻址不对 和内存填充没什么必然联系

引用 5 楼 FENGQIYUNRAN 的回复:在我的机器上这个代码跑出来时8，我的是X86的cpu，内存地址表示为0x00000000，其中0x表示十六进制，后面的8个0是就是实际字符的个数8；至于，你的长度是5，那么我能给出的解释就是你这个跑在8086PC上，因为他的内存表示00000~9FFFF是由5个字符表示的。楼主搜下“内存地址”学习下。 个人愚见，不保证准确。我的智能创意，聆讯儿，请您支持一下！ 对不对的，但是有想法！


Question: 有向图的邻接表建立出现问题（C语言实现）

anyone?

实在是太悲壮了

Sorry,I don't know...

经过您这样一改问题更多了哈

#include<stdio.h> #include<stdlib.h>   #define MAX 100   struct EdgeNode {     int adjvex;     EdgeNode *next; };   typedef struct {     char data;     EdgeNode *firstNext; }VertexNode,AdjList[MAX];   typedef struct {     AdjList adjList;     int numVertexes;     int numArcs; }GraphAdjList;   int locate(GraphAdjList G,char c) {     int i=0;       while(G.adjList[i++].data!=c && i<G.numVertexes);       if(i<G.numVertexes)         return i;     else return -1;   }   void CreateAdjList(GraphAdjList *G) {     int i,j,k;     EdgeNode *p,*q;     char m,n;       printf("请输入顶点和弧的数目\n");     scanf("%d %d",&G->numVertexes,&G->numArcs);             for(k=0;k<G->numVertexes;k++)     {         printf("请输入第%d个顶点的信息\n",k);         scanf("%c",&G->adjList[k].data);         G->adjList[k].firstNext=NULL;     }       for(k=0;k<G->numArcs;k++)     {         printf("请按顺序输入弧的弧头v和弧尾w\n");         scanf("%c %c",&m,&n);           q=(EdgeNode *)malloc(sizeof(EdgeNode));           i=locate(*G,m);         j=locate(*G,n);           q->adjvex=j;           if( G->adjList[i].firstNext!=NULL )             G->adjList[i].firstNext=q;         else         {             p=G->adjList[i].firstNext->next;             while(p)             {                 p=p->next;             }             p->next=q;         }     } }   void print(GraphAdjList *G) {     int i;     EdgeNode *p;       for(i=0;i<G->numVertexes;i++)     {         printf("%c",G->adjList[i].data);         p=G->adjList[i].firstNext;         while(p)         {             printf("->%d",p->adjvex);             p=p->next;         }         printf("->NULL\n");     }       free(p); }     int main() {     GraphAdjList *G;     CreateAdjList(G);     print(G);       return 0; }

Compiling... fuck.c D:\WorkSpace\fuck.c(61) : error C2115: 'function' : incompatible types D:\WorkSpace\fuck.c(61) : warning C4024: 'locate' : different types for formal and actual parameter 1 D:\\WorkSpace\fuck.c(62) : error C2115: 'function' : incompatible types D:\WorkSpace\fuck.c(62) : warning C4024: 'locate' : different types for formal and actual parameter 1 D:\WorkSpace\fuck.c(70) : warning C4133: '=' : incompatible types - from 'struct EdgeNode *' to 'struct EdgeNode *' D:\WorkSpace\fuck.c(73) : warning C4133: '=' : incompatible types - from 'struct EdgeNode *' to 'struct EdgeNode *' D:\WorkSpace\fuck.c(75) : warning C4133: '=' : incompatible types - from 'struct EdgeNode *' to 'struct EdgeNode *' D:\WorkSpace\fuck.c(92) : warning C4133: '=' : incompatible types - from 'struct EdgeNode *' to 'struct EdgeNode *' Error executing cl.exe.  fuck.obj - 2 error(s), 6 warning(s)


Question: WININET.dll如何对其隐藏

引用 1 楼 zhao4zhong1 的回复:奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！  ---------------  的确，

奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！


Question: C++的模糊查询

引用 12 楼 whoho 的回复:[quote=引用 8 楼 zhi_ai_yaya 的回复:] [quote=引用 4 楼 taodm 的回复:] 楼主，听说过马尔科夫链么？ 没听说过的，就随便糊弄一下就行啦。 之前就看过一个微软亚洲研究院的研究院使用马尔科夫建立一个行为学习模型，用于搜索引擎的广告支付收益最大化的计算。  对于lz的新需求，有种用牛刀杀鸡，大炮轰蚊子的感觉  [/quote]   马尔可夫链（译名有多个，别纠正我了），也不必太认为是大炮啦，用于字符串的基本算法实现是很简单的 有C++的教科书就是用这个作例子  当然你要做更复杂的应用或者理论分析，那是另外一个层面，说高大上才不为过[/quote] 额，这些专业词汇的中文译名肯定是稍有差别的，但是我们都明白是指同一样事物呀，这并不影响沟通。呵呵

引用 1 楼 lovesmiles 的回复:数据库的sql语句就有模糊查找的关键词 like  select *from table where name like ‘%哈%’ and like ‘%理%’ and like‘%工%’  如果你要用c++。直接用string操作即可，分别查找哈，理，工三个字。如果这三个字都存在，即找到。+1

SQLserver中不是有模糊查询的语句么？

“模糊查询”是个很模糊的概念 实现上能天差地别 比较容易实现的方法，楼上好像都说了，特别是3楼lovesmiles兄的答复

引用 8 楼 zhi_ai_yaya 的回复:[quote=引用 4 楼 taodm 的回复:] 楼主，听说过马尔科夫链么？ 没听说过的，就随便糊弄一下就行啦。 之前就看过一个微软亚洲研究院的研究院使用马尔科夫建立一个行为学习模型，用于搜索引擎的广告支付收益最大化的计算。  对于lz的新需求，有种用牛刀杀鸡，大炮轰蚊子的感觉  [/quote]   马尔可夫链（译名有多个，别纠正我了），也不必太认为是大炮啦，用于字符串的基本算法实现是很简单的 有C++的教科书就是用这个作例子  当然你要做更复杂的应用或者理论分析，那是另外一个层面，说高大上才不为过

仅供参考//摘自《代码之美》 // 字符     含义 // .        匹配任意的单个字符 // ^        匹配输入字符串的开头 // $        匹配输入字符串的结尾 // *        匹配前一个字符的零个或者多个出现 #include <stdio.h> int matchhere(char *regexp, char *text);  int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of text    do {// a * matches zero or more instances        if (matchhere(regexp, text)) return 1;    } while (*text != '\0' && (*text++ == c || c == '.'));    return 0; } int matchhere(char *regexp, char *text) {// matchhere: search for regexp at beginning of text    if (regexp[0] == '\0') return 1;    if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text);    if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0';    if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1);    return 0; }  int match(char *regexp, char *text) {// match: search for regexp anywhere in text     if (regexp[0] == '^') return matchhere(regexp+1, text);     do {// must look even if string is empty         if (matchhere(regexp, text)) return 1;     } while (*text++ != '\0');     return 0; } void main() {     printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));     printf("%d==match(^a  ,abc)\n",match("^a"  ,"abc"));     printf("%d==match(c$  ,abc)\n",match("c$"  ,"abc"));     printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));     printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));     printf("-------------------\n");     printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));     printf("%d==match(^B  ,abc)\n",match("^B"  ,"abc"));     printf("%d==match(A$  ,abc)\n",match("A$"  ,"abc"));     printf("%d==match(a..c,abc)\n",match("a..c","abc"));     printf("%d==match(a.*d,abc)\n",match("a.*d","abc")); } //1==match(abc ,abc) //1==match(^a  ,abc) //1==match(c$  ,abc) //1==match(a.c ,abc) //1==match(a.*c,abc) //------------------- //0==match(ABC ,abc) //0==match(^B  ,abc) //0==match(A$  ,abc) //0==match(a..c,abc) //0==match(a.*d,abc)

那你应该使用正则表达式，来匹配你的字符。http://blog.csdn.net/lxcnn/article/details/4268033

引用 3 楼 lovesmiles 的回复:[quote=引用 2 楼 u011666331 的回复:] 那你是如何判断关键字的啊？ 看你的关键字是怎么定义，你要是说哈尔滨理工大学的简称是‘黑龙江’，你觉得你搜黑龙江能不能搜到它？显然不能，关键词和原词至少要有数个字是一样的才能称之为关键词吧。你搜‘哈工大’，将哈，工，大三个字分别搜，如果这三个字同时存在一个字符串，这就是你要搜的结果，这时可能会搜到哈尔滨理工大学，也可能搜到哈尔滨工业大学，这从‘哈工大’三个字已经没有办法分出那个结果比较正确。  这是最简单的将词拆成字搜索的办法。复杂一点的就是你自己建立词库，比如‘黑龙江’对应的就是哈尔滨理工大学。那你搜索黑龙江，马上就能搜到它了。  更复杂的词法分析算法说你也不懂了。[/quote]  这应该是最适合公交站牌查询的方法了  C++的STL不是有Map和mutimap的么，用mutimap建立一个公交词库，包含不同的key对应一个value（公交站名）。 每次输入，都获取输入内容，并进行匹配，然后返回value进行选择。

引用 4 楼 taodm 的回复:楼主，听说过马尔科夫链么？ 没听说过的，就随便糊弄一下就行啦。 之前就看过一个微软亚洲研究院的研究院使用马尔科夫建立一个行为学习模型，用于搜索引擎的广告支付收益最大化的计算。  对于lz的新需求，有种用牛刀杀鸡，大炮轰蚊子的感觉

C++primer有例子

楼主，听说过马尔科夫链么？ 没听说过的，就随便糊弄一下就行啦。

引用 2 楼 u011666331 的回复:那你是如何判断关键字的啊？ 看你的关键字是怎么定义，你要是说哈尔滨理工大学的简称是‘黑龙江’，你觉得你搜黑龙江能不能搜到它？显然不能，关键词和原词至少要有数个字是一样的才能称之为关键词吧。你搜‘哈工大’，将哈，工，大三个字分别搜，如果这三个字同时存在一个字符串，这就是你要搜的结果，这时可能会搜到哈尔滨理工大学，也可能搜到哈尔滨工业大学，这从‘哈工大’三个字已经没有办法分出那个结果比较正确。  这是最简单的将词拆成字搜索的办法。复杂一点的就是你自己建立词库，比如‘黑龙江’对应的就是哈尔滨理工大学。那你搜索黑龙江，马上就能搜到它了。  更复杂的词法分析算法说你也不懂了。

那你是如何判断关键字的啊？


可以。～～～

可以，挺好用的，不过个人觉得vc6.0也不错

没用过，如果只是c或c++感觉钟家民的软件不错


Question: DllMina() 函数内部不可以再定义函数吗？

引用 2 楼 lovesmiles 的回复:不要说DLL内部，就算是一般的函数内部也不能这样。  你随便写个函数都会报错，和DLL没什么关系。 函数是不可以嵌套定义的！！！+1

引用 1 楼 zhao4zhong1 的回复:#include <objbase.h> #include <stdio.h>  _declspec(dllexport) int add(int a, int b){     return a+b; } _declspec(dllexport)int sub(int a, int b){     return a-b; }  // 定义下边的函数 int funDemo() {     return 0; } BOOL APIENTRY DllMain(     HANDLE hModule,     DWORD  ul_reason_for_call,     LPVOID lpReserved ){     if(ul_reason_for_call == DLL_PROCESS_ATTACH){         TRACE("Congratulations! DLL is loaded!\n");     } } 说得对

引用 2 楼 lovesmiles 的回复:不要说DLL内部，就算是一般的函数内部也不能这样。  你随便写个函数都会报错，和DLL没什么关系。 函数是不可以嵌套定义的！！！对啊，傻B了，我是搞JS的，搞混了


Question: fopen 写到文件内容部正确，哪儿有问题？

引用 7 楼 zjq9931 的回复:[quote=引用 5 楼 aaadddzxc 的回复:] VS2013 UP2 WIN7SP1 打开文件时的，w+换成wb，或者wb+[/quote]  谢谢 wb+ 就行了！

引用 5 楼 aaadddzxc 的回复:VS2013 UP2 WIN7SP1 打开文件时的，w+换成wb，或者wb+

int _tmain(int argc, _TCHAR* argv[]) {     LPCTSTR lpszBuff = _T("MainVersion = 20140811\r\nMainDescription = http://www.1111.org/updatades.txt\r\nMainFileList = http ://www.1111.org/updatalist.txt");     LPCTSTR lpszPath = _T("C:\\Users\\qyt\\Desktop\\Win32Project1\\updatalist.txt");     FILE *pSt_File = NULL;     if (0 != _tfopen_s(&pSt_File,lpszPath,_T("wb")))     {         return 1;     }     if (NULL == pSt_File)     {         return 2;     }     int nBuffferLen = _tcslen(lpszBuff);     int nCount = 0;     int nRet = fwrite(lpszBuff,sizeof(TCHAR),nBuffferLen,pSt_File);     if (nRet!=nBuffferLen) {         fclose(pSt_File);         return 3;     }     fclose(pSt_File);     return 0; }  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

VS2013 UP2 WIN7SP1

我又调试了下，发现   int _tmain(int argc, _TCHAR* argv[]) { 	LPCTSTR lpszBuff = _T("MainVersion = 20140811 MainDescription = http://www.1111.org/updatades.txt MainFileList = http ://www.1111.org/updatalist.txt"); 	LPCTSTR lpszPath = _T("C:\\Users\\qyt\\Desktop\\Win32Project1\\updatalist.txt"); 	FILE *pSt_File = NULL; 	if (0 != _tfopen_s(&pSt_File,lpszPath,_T("w+"))) 	{ 		return 0; 	} 	if (NULL == pSt_File) 	{ 		return 0; 	} 	int nBuffferLen = _tcslen(lpszBuff); 	int nCount = 0; 	while (TRUE) 	{ 		int nRet = fwrite(lpszBuff + nCount,sizeof(TCHAR),nBuffferLen - nCount,pSt_File); 		nCount += nRet;  		if (nCount >= nBuffferLen) 		{ 			break; 		} 	} 	fclose(pSt_File); 	return 0; }     发现只要  _T("MainVersion = 20140811 MainDescription = http://www.1111.org/updatades.txt MainFileList = http ://www.1111.org/updatalist.txt"); 换成   LPCTSTR lpszBuff = _T("MainVersion = 20140811\r\nMainDescription = http://www.1111.org/updatades.txt\r\nMainFileList = http ://www.1111.org/updatalist.txt");  格式就有问题，怎么回事？加了换行符就出错了

引用 2 楼 zhao4zhong1 的回复:int nRet = fwrite(lpszBuff + nCount,nBuffferLen - nCount,sizeof(TCHAR),pSt_File);  还是一样 写出的内容有问题  引用 1 楼 zjq9931 的回复:[quote=引用 楼主 aaadddzxc 的回复:]   int _tmain(int argc, _TCHAR* argv[]) { 	LPCTSTR lpszBuff = _T("MainVersion = 20140811\r\nMainDescription = http://www.1111.org/updatades.txt\r\nMainFileList = http ://www.1111.org/updatalist.txt"); 	LPCTSTR lpszPath = _T("C:\\Users\\qyt\\Desktop\\Win32Project1\\updatalist.txt"); 	FILE *pSt_File = NULL; 	if (0 != _tfopen_s(&pSt_File,lpszPath,_T("w+"))) 	{ 		return 0; 	} 	if (NULL == pSt_File) 	{ 		return FALSE; 	} 	int nBuffferLen = _tcslen(lpszBuff); 	int nCount = 0; 	while (TRUE) 	{ 		int nRet = fwrite(lpszBuff + nCount,nBuffferLen - nCount,1,pSt_File); 		nCount += nRet;  		if (nCount >= nBuffferLen) 		{ 			break; 		} 	} 	fclose(pSt_File); 	return 0; }   错误一： LPCTSTR lpszBuff = _T("MainVersion = 20140811\r\nMainDescription = http://www.1111.org/updatades.txt\r\nMainFileList = http ://www.1111.org/updatalist.txt");  LPCTSTR lpszPath = _T("C:\\Users\\qyt\\Desktop\\Win32Project1\\updatalist.txt"); ------------------------- 这里可能会有问题。在开启unicode编码的模式下。 建议用_TCHAR*   错误二： 如果你打开了UNICODE模式，那么，写到文件里面的是unicode编码的字符，那么unicode编码的文件，要求最开始两个字节是（0xff，0xfe，UTF16），所以如果直接写的是unicode码的数据，而文件最开始两个字节又不是这两个，那么看起来就会是乱码，或者不对。 解决办法是： sizeof(_TCHAR)，如果是2，则就是unicode码的那么在文件最开始写上那两个字节。如果是1，那么就不用写那两个字节。[/quote]   UNICODE是个问题，但是ANSI也是出问题

引用 楼主 aaadddzxc 的回复:  int _tmain(int argc, _TCHAR* argv[]) { 	LPCTSTR lpszBuff = _T("MainVersion = 20140811\r\nMainDescription = http://www.1111.org/updatades.txt\r\nMainFileList = http ://www.1111.org/updatalist.txt"); 	LPCTSTR lpszPath = _T("C:\\Users\\qyt\\Desktop\\Win32Project1\\updatalist.txt"); 	FILE *pSt_File = NULL; 	if (0 != _tfopen_s(&pSt_File,lpszPath,_T("w+"))) 	{ 		return 0; 	} 	if (NULL == pSt_File) 	{ 		return FALSE; 	} 	int nBuffferLen = _tcslen(lpszBuff); 	int nCount = 0; 	while (TRUE) 	{ 		int nRet = fwrite(lpszBuff + nCount,nBuffferLen - nCount,1,pSt_File); 		nCount += nRet;  		if (nCount >= nBuffferLen) 		{ 			break; 		} 	} 	fclose(pSt_File); 	return 0; }   错误一： LPCTSTR lpszBuff = _T("MainVersion = 20140811\r\nMainDescription = http://www.1111.org/updatades.txt\r\nMainFileList = http ://www.1111.org/updatalist.txt");  LPCTSTR lpszPath = _T("C:\\Users\\qyt\\Desktop\\Win32Project1\\updatalist.txt"); ------------------------- 这里可能会有问题。在开启unicode编码的模式下。 建议用_TCHAR*   错误二： 如果你打开了UNICODE模式，那么，写到文件里面的是unicode编码的字符，那么unicode编码的文件，要求最开始两个字节是（0xff，0xfe，UTF16），所以如果直接写的是unicode码的数据，而文件最开始两个字节又不是这两个，那么看起来就会是乱码，或者不对。 解决办法是： sizeof(_TCHAR)，如果是2，则就是unicode码的那么在文件最开始写上那两个字节。如果是1，那么就不用写那两个字节。


Question: 求助帮写个希尔排序的程序

百度没有吗？


Question: C通过execvp/system执行一个Shell脚本的问题，请教

如果vfork（）成功则在父进程会返回新建立的子进程代码（PID）， 而在新建立的子进程中则返回0。如果vfork失败则直接返回-1，失 败原因存于errno中。 错误代码 EAGAIN 进程数已达系统规定上限 ENOMEM内存不足，无法配置核心所需的数据结构空间。

错误码是什么？


引用 楼主 yanggm001 的回复:在设置时钟的时候， #define CLOCK_SETUP           1 #define SCS_Val               0x00000020 #define CLKSRCSEL_Val         0x00000001 #define PLL0_SETUP            1 #define PLL0CFG_Val           0x00050063 #define PLL1_SETUP            1 #define PLL1CFG_Val           0x00000023 #define CCLKCFG_Val           0x00000003 #define USBCLKCFG_Val         0x00000000 #define PCLKSEL0_Val          0x00000000 #define PCLKSEL1_Val          0x00000000 #define PCONP_Val             0xEFEFF7DE #define CLKOUTCFG_Val         0x00000000 也就是cpu的FCCLK=100M=12M/4*100/6*2 (fosc/4*M/N) 而我的UART0的FPCLK=12M*8/4=24M 时可以工作， 那么FPCLK和FCCLK是什么关系呢？独立的吗？ 谢邀，实在抱歉，一直在搞的都是PC的，对硬件完全外行。

百度一下LPC1768的手册，你的问题太专业了。要精通这片子的人才懂。

UART 在APB总线上，时钟是固定的24M吗？

补充，如果UART用FCCLK分频设置波特率的话，串口也不能正常工作。

参考硬件手册？


Question: 我现在遇到了个难题求大神指教，我想从wincc里的数据库实时调用两个数据，然后给显示屏一个信号让它实时更新，很急拜托！！！！！

急也没有办法，你做到那一步了，有什么问题说嘛？是数据库访问还是显示还是想别人写一个完整的东西给你？


Question: 亲们

这样的提问方式很难有人回答你，早点结贴吧。

这样的提问方式很难有人回答你，早点结贴吧。

不知道你想说啥

while 定时循环

wincc安装时默认用的是MS-SQL，直接访问数据库操作即可吧


Question: 求解释这一段代码，说明需要测试的功能点

static void TSP_Proc_Main_Step_2(void) { GM_BOOL rt = GM_FALSE; /*CR:TSP00002604 应用运行时间*/ GM_UINT32 startTime = 0U; GM_UINT32 endTime = 0U;  /*CR:TSP00002604 应用运行时间*/ startTime = GM_CurrentTimestamp((GM_UINT8)(1U)); /*add by joseph 20120917,备系要进行数据同步，所以要learn*/  if((GM_FALSE == TSP_State_Interface_Is_Active(GM_FALSE)) && (TSP_STATE_DATA_SYN_OK == TSP_State_Interface_Get(TSP_STATE_TYPE_SELF_CUR_DATA_SYN))) {  /* Initialize();*/ /*CR:TSP00001802 删除 20121204 ironMan*/ /*CR:TSP00001720 20121119 ironMan*/ #ifndef TSP_MPS_MPU_TST_YWB_256K  TSP_Interface_Learn();  /*CR:2286 20130513 OO,若TSP_App_Syn_RxData.trxFlag为false，则置自身不同步*/  if(GM_FALSE == GetTrxFlagStatus())  {  	/*设置自身数据不同步*/  TSP_State_Interface_Set(TSP_STATE_TYPE_SELF_CUR_DATA_SYN, TSP_STATE_DATA_SYN_NOT);   } #endif  TSP_Interface_Reset_Syn_RxProc(); }       TSP_Interface_Main_Proc();      /*add by joseph 20120917,主系要向备系发送同步数据，所以要teach*/     if(GM_TRUE == TSP_State_Interface_Is_Active(GM_FALSE))     {     	TSP_Interface_Reset_Syn_TxProc();/*cr:2241*/     	TSP_Interface_Teach();     }  rt = TSP_Interface_RXMQ_Clear();/*错误处理已在函数中*/ if (GM_FALSE == rt) { TSP_ErrProc_Safefault_Proc(); }  /*CR:TSP00002604 应用运行时间*/ endTime = GM_CurrentTimestamp((GM_UINT8)(1U));        g_globalinfo_struct.g_app_run_time = GM_TimestampInterval(endTime,startTime);  rt = TSP_TASK_CHECK(g_globalinfo_struct.g_VSN1, 2U); if(GM_FALSE == rt) { TSP_ErrProc_Interface_Add(MAINPROC_ERROR_TASK_SLOT2); TSP_ErrProc_Safefault_Proc(); }  bFlag = GM_TRUE;  return; }

爱莫能助，帮顶！！！！！！！！


Question: 如何设定控制台程序显示的位置？

你不知道任何手动操作都可程序实现吗？！

引用 1 楼 zhao4zhong1 的回复:开始、运行、打开： cmd /k "title xyz" 确定 弹出一个标题为xyz的控制台窗口。 在该窗口左上角图标上点鼠标右键、属性、布局、窗口位置、由系统定位窗口前面的勾去掉，左：0，上：0，确定。 弹出“应用属性”窗口，选“保存属性，供以后具有相同标题的窗口使用”，确定。  以后只要创建标题是xyz的控制台窗口，都会显示在桌面的左上角。 上CSDN好多年了，讲真，从来没看到你的答案是对的，只要看到你的头像，我就知道，你的答案又再鬼扯了，这次实在忍不住了，楼主问的是程序再屏幕的中间显示，你却说什么开始运行输入命令，也真是驴头不对马嘴了

GetConsoleWindow Function  Retrieves the window handle used by the console associated with the calling process.   HWND WINAPI GetConsoleWindow(void);  Parameters This function has no parameters.  Return Value The return value is a handle to the window used by the console associated with the calling process or NULL if there is no such associated console.  Remarks To compile an application that uses this function, define _WIN32_WINNT as 0x0500 or later. For more information, see Using the Windows Headers.  Requirements Client  Requires Windows Vista, Windows XP, or Windows 2000 Professional.   Server  Requires Windows Server 2008, Windows Server 2003, or Windows 2000 Server.   Header  Declared in Wincon.h; include Windows.h.   Library  Use Kernel32.lib.   DLL  Requires Kernel32.dll.    See Also Console Functions    Send comments about this topic to Microsoft   Build date: 8/15/2007

引用 3 楼 zhao4zhong1 的回复:使用APIMonitor或Process Monitor 监视1楼操作是Explorer.exe都调用过哪些API，写过哪些注册表。 谢谢 最后再问下 获得当前窗口的句柄的函数是什么？

用GetConsoleWindow获取窗口句柄，然后MoveWindow MoveWindow The MoveWindow function changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to the upper-left corner of the screen. For a child window, they are relative to the upper-left corner of the parent window's client area.   BOOL MoveWindow(   HWND hWnd,      // handle to window   int X,          // horizontal position   int Y,          // vertical position   int nWidth,     // width   int nHeight,    // height   BOOL bRepaint   // repaint flag );   Parameters hWnd  Handle to the window.  X  Specifies the new position of the left side of the window.  Y  Specifies the new position of the top of the window.  nWidth  Specifies the new width of the window.  nHeight  Specifies the new height of the window.  bRepaint  Specifies whether the window is to be repainted. If this parameter is TRUE, the window receives aWM_PAINT message. If the parameter is FALSE, no repainting of any kind occurs. This applies to the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of moving a child window. If this parameter is FALSE, the application must explicitly invalidate or redraw any parts of the window and parent window that need redrawing.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, callGetLastError.  Remarks If the bRepaint parameter is TRUE, the system sends the WM_PAINT message to the window procedure immediately after moving the window (that is, the MoveWindow function calls the UpdateWindow function). If bRepaint is FALSE, the system places the WM_PAINT message in the message queue associated with the window. The message loop dispatches the WM_PAINT message only after dispatching all other messages in the queue.   MoveWindow sends WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, and WM_NCCALCSIZE messages to the window.   Windows CE: The bRepaint parameter is ignored and is assumed to be FALSE.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winuser.h.   Import Library: Use user32.lib.  See Also Windows Overview, Window Functions, SetWindowPos,UpdateWindow, WM_GETMINMAXINFO,WM_PAINT

我说的是程序  #include <stdio.h> #include <windows.h> int main() { 	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 	CONSOLE_SCREEN_BUFFER_INFO info; 	GetConsoleScreenBufferInfo(hOut, &info); 	info.srWindow.Left=0; 	info.srWindow.Top=0; 	SetConsoleWindowInfo(hOut, 1, &info.srWindow); 	return 0; }   我取消了由系统定位窗口 可还是不管用？？？


Question: 控制台窗口如何虚化？

应该和窗口的Z order 有关

控件全透明效果

看着是个“口”，实际是“冂”下面“一”。


Question: 抽象数据类型(ADT)的问题

引用 4 楼 fetag 的回复:如果想适应一致的不同类型，那你应该看C++的 template 部分  如果是想混用各种不同类型，那你可以看 Boost 库的 boost::any  搜索了一下 boost::any 现在完全看不懂…… C++的语法与C差别挺大……

剩余代码：  /*  ***************************************************************  * File Name:    pet.c  * Declaration:  用户自定类型 宠物名及种类名  * Author:       jiaga  * Created Time: 2014年08月03日 星期日 10时19分50秒  ***************************************************************  */  #include <stdio.h> #include <stdlib.h> #include <string.h> #include "pet.h"   static char *get_string(char *str);  void * new_pet(void) {         Pet *pet;          pet = (Pet *)malloc(sizeof(Pet));         if (pet != NULL) {                 printf("Please input pet's name: ");                 get_string(pet->petname);                 printf("Please input pet's kind: ");                 get_string(pet->petkind);                 return (void *)pet;         } else                 return NULL; }  void show_pet(void * pet_item) {         Pet *pet;          pet = (Pet *)pet_item;         printf("name: %-20s  kind: %-20s\n", pet->petname, pet->petkind); }  static char *get_string(char *str) {         char *find;          if (fgets(str, LEN, stdin) != NULL) {                 find = strchr(str, '\n');                 if (find)                         *find = '\0';                 return str;         } else {                 return NULL;         } } /*  ***************************************************************  * File Name:    coordinate.h  * Declaration:    * Author:       jiaga  * Created Time: 2014年08月03日 星期日 10时30分01秒  ***************************************************************  */  #ifndef __COORDINATE_H #define __COORDINATE_H  typedef struct coordinate{         int x;         int y; }Coordinate;  void * new_coordinate(void); void show_coordinate(void * coordinate_item);  #endif /*  ***************************************************************  * File Name:    coordinate.c  * Declaration:  用户自定类型 坐标 X Y 值  * Author:       jiaga  * Created Time: 2014年08月03日 星期日 10时37分32秒  ***************************************************************  */  #include <stdio.h> #include <stdlib.h> #include "coordinate.h"  static int get_number(void);  void * new_coordinate(void) {         Coordinate * coordinate;          coordinate = (Coordinate *)malloc(sizeof(Coordinate));         if (coordinate != NULL) {                 printf("Please input point x: ");                 coordinate->x = get_number();                 printf("Please input point y: ");                 coordinate->y = get_number();                 return (void *)coordinate;         } else                 return NULL; }  void show_coordinate(void * coordinate_item) {         Coordinate * coordinate;          coordinate = (Coordinate *)coordinate_item;         printf("X=%d Y=%d\n", coordinate->x, coordinate->y); }  static int get_number(void) {         int number;          while (scanf(" %d", &number) != 1) {                 printf("Please input number: ");                 while (getchar() != '\n')                         continue;         }          return number; }    Makefile: objs=main.o pet.o coordinate.o list.o  test_void_list: $(objs) 	gcc -o test_void_list $(objs)  main.o: main.c list.h pet.h coordinate.h 	gcc -c main.c list.h pet.h coordinate.h  pet.o: pet.c pet.h 	gcc -c pet.c pet.h  coordinate.o: coordinate.c coordinate.h 	gcc -c coordinate.c coordinate.h  list.o: list.c list.h 	gcc -c list.c list.h  clean: 	rm test_void_list $(objs)

c++还没开始学o(╯□╰)o   现在学着c语言 还没打算这么快跨到c++。只是想问下c语言下这样的做法合适么 ，或者有没有其他的办法？

/*  ***************************************************************  * File Name:    pet.h  * Declaration:  用户自定的数据结构类型及其输入输出操作。  * Author:       jiaga  * Created Time: 2014年08月03日 星期日 10时20分11秒  ***************************************************************  */  #ifndef __PET_H #define __PET_H  #define LEN 20  typedef struct pet {         char petname[LEN];         char petkind[LEN]; }Pet;  /*   * 获取类该型数据输入，  * 强制转换数据的指针为(void *)作为返回值   * 若申请存储空间失败则返回NULL  */ void * new_pet(void);  /*   * 输出该类型数据   * 从参数获取(void *)指针并做强制转换后使用  */ void show_pet(void * pet_item);  #endif

/*  ***************************************************************  * File Name:    list.c  * Declaration:  链表ADT函数  * Author:       jiaga  * Created Time: 2014年07月27日 星期日 11时05分16秒  ***************************************************************  */  #include <stdlib.h> #include "list.h"  void init_list(List *list_head) {         *list_head = NULL; }  List_node * add_to_list(List *list_head, void *(*new_item_fun)()) {         void *new_item = NULL;         List_node *new_node;         List_node *current_node = *list_head;          new_item = new_item_fun();         if (new_item == NULL)                  return NULL;         new_node = (List_node *)malloc(sizeof(List_node));         if (new_node == NULL) {                 free(new_item);   /* 如果申请节点失败，则释放用户新项目 */                 return NULL;         }          new_node->vp_item = new_item;         new_node->next = NULL;          if (*list_head == NULL) {                 *list_head = new_node;         } else {                 while (current_node->next != NULL)                         current_node = current_node->next;                 current_node->next = new_node;         }          return new_node; }  void show_list(List *list_head, void (*show_user_item)(void *vp_item)) {         List_node * current_node = *list_head;          while (current_node != NULL) {                 show_user_item(current_node->vp_item);                 current_node = current_node->next;         } }  void del_list(List *list_head) {         List_node * current_node = *list_head;         List_node * tmp;          while (current_node != NULL) {                 tmp = current_node->next;                 free(current_node->vp_item);    /* 释放用户的数据 */                 free(current_node);             /* 释放当前节点   */                 current_node = tmp;         } }

/*  ***************************************************************  * File Name:    list.h  * Declaration:    * Author:       jiaga  * Created Time: 2014年07月27日 星期日 11时02分11秒  ***************************************************************  */  #ifndef __LIST_H #define __LIST_H  typedef struct list_node{         void * vp_item;         struct list_node * next; }List_node;  typedef List_node * List;  /* 初始化链表 */ void init_list(List *list_head);  /*   * 添加用户数据结构的指针(void *)到链表，该指针由用户的函数给出   * 成功添加则返回节点指针  * 不成功则返回NULL  */ List_node * add_to_list(List *list_head, void *(*new_item)());  /* 遍历链表，将链表中每个项目的(void *)指针给用户函数做参数 */ void show_list(List *list_head, void (*traverse)(void *vp_item));  /* 释放链表所用存储空间 */ void del_list(List *list_head);  #endif


Question: 字符串常量给字符指针赋值问题

再啰嗦一句，c++里面的标准写法是 const char *p = “abcd”;  // const表示不会修改p指向的内容，也就是*p 如果写 char *p = “abcd"; 编译器可能会给警告。

首先，编译器在常量区保存一个字符串abcd，其内容不许修改。 char *p = "abcd"; // p是一个指针，直接指向常量区，修改p[0]就是修改常量区的内容，这是不允许的。 char p[] = "abcd"; // 编译器在栈上创建一个字符串p，把abcd从常量区复制到p，修改p[0]就是修改一个局部变量，这是允许的。 更多详细解释请楼主搜索“常量区”

改成 char p[] = "abcd";

因为指针值指的是"abcd"的内存地址，它是常量，不允许修改。

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

应该编译通不过吧 常量区域的数据不能被修改的，只读的


Question: 发布一个 C99 compiler frontend 的源码，可以生成 AST 树和相关的类型信息

up!


Question: 菜鸟一枚，麻烦大家帮忙看下哪错了。

1，scanf()在读取时不检查边界，所以可能会造成内存泄露。所以vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时，必须提供一个数字以表明最多读取多少位字符。 2，for (m = 0; m < 10; m++);//for循环后多了一个分号

引用 2 楼 w673339759 的回复:注意细节+1+2

为什么会多个分号。。

引用 7 楼 sagittarius_520 的回复: 	printf("输入这次百米跑的秒数：（10个人）\n"); 	for (m = 0; m < 10; m++)			//多输入了一个分号 	{ 		scanf("%f", &n[m]);				//这个不是系统C库函数，最好别用这个输入。 		 		if (n[m] >= 13.00)     //不合格 			a++;  		if (n[m]<13.00 && n[m]>12.00) 			b++;         //合格 		if (n[m] <= 12.00) 			c++;        //优秀 	}   心细很重要。。。。

引用 7 楼 sagittarius_520 的回复: 	printf("输入这次百米跑的秒数：（10个人）\n"); 	for (m = 0; m < 10; m++)			//多输入了一个分号 	{ 		scanf("%f", &n[m]);				//这个不是系统C库函数，最好别用这个输入。 		 		if (n[m] >= 13.00)     //不合格 			a++;  		if (n[m]<13.00 && n[m]>12.00) 			b++;         //合格 		if (n[m] <= 12.00) 			c++;        //优秀 	}  scanf_s这个不是系统C库函数，最好别用这个输入。

for (m = 0; m < 10; m++);//去掉分号，for循环这里不需要分号

用IDE编译的时候，不通过一定会有提示信息的……照着报错位置推敲就好了啊……

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

scanf_s("%f", &n[m]);//输入是scanf 直接写成scanf("%f", &n[m]);即可

注意细节+1

for (m = 0; m < 10; m++); //多了个分号 {     scanf_s("%f", &n[m]);


Question: 内核模块加载

root@ubuntu:~# uname -a Linux ubuntu 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux   感谢指点。。。


Question: 对应于16位单位，int类型的最小取值范围是多少啊

1 000000000000000  对于二进制表示的负数，符号位是1。该负数对应的绝对值为所有位数取反(0 111111111111111)加1(1 000000000000000)，为32768，所以1 000000000000000对应的负数就是-32768。。 额，是不是这样

char,short  还是 -128～127，-32767~32767 这个范围 其他带符号类型 ，是对称的 这是VC limits.h 中摘录的部分内容 // #define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */  //  -2147483648 = (-2147483647 - 1) // 但是 -2147483648 只是可以存储，在 int (32Bits) 中， //int 可表示最小数为-2147483647，这是新标准吧，不然VC库也不必这么写。 //直接写 -2147483648 多好。  //#define INT_MAX       2147483647    /* maximum (signed) int value */ //#define UINT_MAX      0xffffffff    /* maximum unsigned int value */ //#define LONG_MIN    (-2147483647L - 1) /* minimum (signed) long value */ //#define LONG_MAX      2147483647L   /* maximum (signed) long value */

如果按照事实上int的使用来看，似乎并不存在有+-0的歧义，所以应该有一个标准存在。等懂的人回答你。 引用 8 楼 lovesmiles 的回复:浮点数就存在+0和-0。 1位用来表示符号，8位表示指数，23位表示尾数。 对于浮点数0，是不存在一种表示方法的。指数和尾数所有的位都是0，符号位不为0时，表示的就是负0。  对于int型，1位用来表示符号位，剩下的15位表示数位。 0 000000000000000 //这是很明显的绝对0，即+0。 1 000000000000000 //这是-0还是-1?第一位我们知道它是符号位，后面15位是0，这个就看机器怎么表示吧。如果不当它是-0，当它是-1。那它的范围就是-1~-32768.  这个到底有没有一个统一的标准？这个标准是不是在c++里面也有定义？我也不是很清楚，等懂的人回答你吧。 [quote=引用 7 楼 moyac 的回复:]  0还有分正0和负0的？  [quote=引用 5 楼 lovesmiles 的回复:] [quote=引用 楼主 moyac 的回复:] 《The C Programming Language》中1.2节里面提到是-32768~32767之间，但在《C Primer Plus》3.4.2小节中，提到是-32767~32767。（2的16次方是65 536），到底哪个才是正确的？  这个要看0是怎么表示的了。   如果分正0和负0，就是从-32767~32767.如果不分，就是-32768~32767。 c++的标准只说明了int的占多少字节，没有说它的实现是怎么实现。应该还是看不同的机器吧。 [/quote][/quote][/quote]

扔了后面那本破书

浮点数就存在+0和-0。 1位用来表示符号，8位表示指数，23位表示尾数。 对于浮点数0，是不存在一种表示方法的。指数和尾数所有的位都是0，符号位不为0时，表示的就是负0。  对于int型，1位用来表示符号位，剩下的15位表示数位。 0 000000000000000 //这是很明显的绝对0，即+0。 1 000000000000000 //这是-0还是-1?第一位我们知道它是符号位，后面15位是0，这个就看机器怎么表示吧。如果不当它是-0，当它是-1。那它的范围就是-1~-32768.  这个到底有没有一个统一的标准？这个标准是不是在c++里面也有定义？我也不是很清楚，等懂的人回答你吧。 引用 7 楼 moyac 的回复:0还有分正0和负0的？  [quote=引用 5 楼 lovesmiles 的回复:] [quote=引用 楼主 moyac 的回复:] 《The C Programming Language》中1.2节里面提到是-32768~32767之间，但在《C Primer Plus》3.4.2小节中，提到是-32767~32767。（2的16次方是65 536），到底哪个才是正确的？  这个要看0是怎么表示的了。   如果分正0和负0，就是从-32767~32767.如果不分，就是-32768~32767。 c++的标准只说明了int的占多少字节，没有说它的实现是怎么实现。应该还是看不同的机器吧。 [/quote][/quote]

都用补码存储，就没有+0和-0之分了吧

引用 2 楼 user-9 的回复:short x = -32767;   printf("%d\n", x);   x--;   printf("%d\n", x);   x--;   printf("%d\n", x);  运行结果 -32767 -32768 32767 学程序先要学会在机器上实验啊，以为不同的机器可能有不同的结果，所以在自己机器上实验最保险

引用 楼主 moyac 的回复:《The C Programming Language》中1.2节里面提到是-32768~32767之间，但在《C Primer Plus》3.4.2小节中，提到是-32767~32767。（2的16次方是65 536），到底哪个才是正确的？  这个要看0是怎么表示的了。   如果分正0和负0，就是从-32767~32767.如果不分，就是-32768~32767。 c++的标准只说明了int的占多少字节，没有说它的实现是怎么实现。应该还是看不同的机器吧。

引用 9 楼 lovesmiles 的回复:如果按照事实上int的使用来看，似乎并不存在有+-0的歧义，所以应该有一个标准存在。等懂的人回答你。 [quote=引用 8 楼 lovesmiles 的回复:] 浮点数就存在+0和-0。 1位用来表示符号，8位表示指数，23位表示尾数。 对于浮点数0，是不存在一种表示方法的。指数和尾数所有的位都是0，符号位不为0时，表示的就是负0。  对于int型，1位用来表示符号位，剩下的15位表示数位。 0 000000000000000 //这是很明显的绝对0，即+0。 1 000000000000000 //这是-0还是-1?第一位我们知道它是符号位，后面15位是0，这个就看机器怎么表示吧。如果不当它是-0，当它是-1。那它的范围就是-1~-32768.  这个到底有没有一个统一的标准？这个标准是不是在c++里面也有定义？我也不是很清楚，等懂的人回答你吧。 [quote=引用 7 楼 moyac 的回复:]  0还有分正0和负0的？  [quote=引用 5 楼 lovesmiles 的回复:] [quote=引用 楼主 moyac 的回复:] 《The C Programming Language》中1.2节里面提到是-32768~32767之间，但在《C Primer Plus》3.4.2小节中，提到是-32767~32767。（2的16次方是65 536），到底哪个才是正确的？  这个要看0是怎么表示的了。   如果分正0和负0，就是从-32767~32767.如果不分，就是-32768~32767。 c++的标准只说明了int的占多少字节，没有说它的实现是怎么实现。应该还是看不同的机器吧。 [/quote][/quote][/quote][/quote]  对于大多数计算机而言，都是补码运算的，没有+0和-0之分，所以都是 -32768~32767

请亲自打开include\limits.h看一看。

对了，8位的类似，-128~127 11111111 = -1 10000001 = -127 10000000 = -128

16位可以表示65536个数。 -32768~32767这个范围包括65536个，-32767~32767这个只包括65535个。所以前者正确。


Question: 二叉搜索树删除结点操作，算法找不出问题，调试也没看明白

t = set_up(t);//不写这样的代码会怎么样？ 你除了将变量命名为t之外，你还会想到用其它的名字吗？把t全部改掉，不同的地方用不用的变量名。然后 再测试。

目测代码太乱，而且本人不会改。。。

代码太乱，没有全部看完  struct node *set_up(struct node *t) { int a; scanf("%d", &a); if (a == 0) { t = NULL;                // t是一个临时变量，在这里设置t = NULL没有任何意义，楼主的本意应该是将t设置为NULL，那么参数应该传递struct node **t ，这里应该改为*t = NULL } else { t = (struct node *) malloc(sizeof(struct node));      // 这个t申请后应该设置t->left和t->right 为NULL，否则后面操作这两个节点会出现异常，因为malloc不会对内存初始化 if (t == NULL) { exit(1); } t->key = a; printf("insert the left of %d: ", t->key); t->left = set_up(t->left); printf("insert the right of %d: ", t->key); t->right = set_up(t->right); } return t; }


Question: C语言、关于二分查找的问题。

引用 2 楼 lovesmiles 的回复:函数内部已经将参数变成int * 计算sizeof（int*）和sizeof（int[]）是不一样的，前者是指针类型的大小，无论它指向什么都是不变的。 后者是数组的长度。  所以不能够用这个计算函数参数的长度。因为类型已经被函数转换了。这样啊，那我先在main函数中计算好，再传过去吧。

void* bsearch (const void* key, const void* base,                size_t num, size_t size,                int (*compar)(const void*,const void*));


Question: AD按键扫描程序

继续继续，，，期待哪位大神贡献好代码。

啥叫AD按键扫描？

对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。


Question: 关于后自加的问题

有点明白了，谢谢。

前面使用过有关系吗？使用后自增只限定在当前语句

谢谢两位的讲解。 第45句之前，while和if调用low，这是不是相当于已经使用过low了？

a[low++] = a[high]; 等价于  a[low] = a[high];low++;

第45行，low的值不变 第47行，low的值已经加1了


Question: 有没有什么函数能播放resource.rc里的mp3文件？

请通读MSDN中Resources相关章节。

Finding and Loading Resources Before using a resource, an application must load it into memory. The FindResource and FindResourceEx functions find a resource in a module and return a handle to the binary resource data. FindResource locates a resource by type and name. FindResourceEx locates the resource by type, name, and language. Information about FindResource in this topic also applies to FindResourceEx.   The LoadResource function uses the resource handle returned by FindResource to load the resource into memory. After an application loads a resource by using LoadResource, the system automatically unloads and reloads the resource as memory conditions and application execution require. Thus, an application need not explicitly unload a resource it no longer needs.   An application can use FindResource and LoadResource to find and load any type of resource, but these functions should be used only if the application must access the binary resource data for subsequent function calls. To use a resource immediately, an application should use one of the following resource-specific functions to find and load resources in one call.   Function Action  FormatMessage Loads and formats a message-table entry.  LoadAccelerators Loads an accelerator table.  LoadBitmap Loads a bitmap resource.  LoadCursor Loads a cursor resource.  LoadIcon Loads an icon resource.  LoadImage Loads an icon, cursor, bitmap, or enhanced metafile resource.  LoadMenu Loads a menu resource.  LoadString Loads a string-table entry.    Before terminating, an application should release the memory occupied by accelerator tables, bitmaps, cursors, icons, and menus by using one of the functions in the following table.   Resource Release function  Accelerator table DestroyAcceleratorTable  Bitmap DeleteObject  Cursor DestroyCursor  Icon DestroyIcon  Menu DestroyMenu    When the application terminates, the system automatically releases the memory occupied by the other types of resources.

引用 3 楼 zhao4zhong1 的回复:先将这个mp3资源写到磁盘文件tmp.mp3中，然后ShellExecute这个tmp.mp3播放。 哦 今天刚接触这个 请问如何找到资源文件的指针呢？ 这样就可以用fwrite写入了。。。

你要用第三方库。系统没有API可以放MP3.

引用 1 楼 zhao4zhong1 的回复:保存为临时文件tmp.mp3 然后ShellExecute这个tmp.mp3 ? 我只想做成一个exe文件 然后在里面播放一首歌  wav的文件太大了 MP3还行 但是不知道怎么弄。。


Question: 线索二叉树在遍历上的优势到底在哪？

一个是均摊O(1)，一个是最坏O(1)。在对latency有要求的情况下当然要后者。

MSDN98 mk:@MSITStore:C:\MSDN98\98VS\2052\vccore.chm::/html/_core_types_of_profiling.htm   Types of Profiling Home |  How Do I |  Details  Feature Only in Professional and Enterprise Editions   Profiling is supported only in Visual C++ Professional and Enterprise Editions. For more information, see Visual C++ Editions.  The profiler can analyze the execution of your code with two levels of detail:   Function Profiling is good for detecting inefficient code. Function profiling is faster than line profiling because there is less information to collect.  Line Profiling can be useful for checking the validity of an algorithm because it shows how many times each line is executed in response to certain input data. Line profiling also lets you see which lines aren’t executed at all.

引用 2 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！ profiler 英 ['prəʊfaɪlə(r)] 美 ['proʊfaɪlə(r)]  n. 靠模工具机；仿形铣床；仿形工   网 络  效能评测器； 软件； 仿形铣床； 靠模铣床 赵老师，这个单词此处做何解释？

评价一个算法的好坏除了可行性，就是时间复杂度和空间复杂度，尽管时间复杂度一样，那线索二叉树在遍历上的优势就是节省了空间 我的智能创意，请您支持一下，谢谢！

我觉得可能是因为递归对程序而言是份很大的开销，所以才选择线索二叉树。

看wiki吧 http://en.wikipedia.org/wiki/Threaded_binary_tree 实际上 O() 是一个很粗糙的复杂度定义，因为它表示的是最差情况下的开销，并且忽略了常数因子。它适用于理论讨论中还好些，对于实践应用有时候就会有很大的偏差。在实践应用场合，一个O(n^2)的算法快过O(n)都很正常。

哎~   还是新手~   对自己的想法和观点还是不那么肯定，但是觉得书上不对也不想盲目相信，只好到处问了，谢谢各位了

二叉树的线索化


Question: 为什么结构体中有指针类型就不能用“=”赋值了

当结构体中有指针时,  它只复制了指针, 但那个指针指向的地址中的数据还是没有变.  struct myStruct {      char * buf; };  myStruct st1, st2; char *pBuf = new char[10]; st1.buf = pBuf;  memcpy(&st2,&st1, sizeof(myStruct));   //这时st1.buf和st2.buf都指向pBuf.  //在某个地方 delete st1.buf;  //删除掉pBuf st1.buf = NULL;  //在另一个地方 st2.buf[0]  = 'a';  //crash.  因为指针相同, 这里就是野指针了. 所以这样的直接memcpy是内存不安全的.

百度搜 “深拷贝，浅拷贝”

引用 楼主 xhw88398569 的回复:不理解为什么，使用memcpy呢?  直接指针可以的，相当于复制了一个地址，前提要确保指针所指的内存块还安全

#include<stdio.h>  struct test { 	int a; 	int b; 	int c; };  int main() { 	struct test t1,t2; 	struct test* p2; 	p2=&t2;  	t1.a=1; 	t1.b=2; 	t1.c=3;  	*p2 = t1;  	printf("%d,%d,%d",t2.a,t2.b,t2.c);  	return 0; }      没问题啊 指针也可以有 = 而不用memcpy啊

能不能用这个要看你的实际意图了。POD类型的结构体，“=”表现出来的都是按位copy。。直接结果就是浅拷贝，如果你能接受那就没问题。

指针理解为能打开某个抽屉（内存）的钥匙，指针“=”意味着复制（重新配）了一把某个抽屉的钥匙，如果以抽屉中的东西改变作为内存销毁（理解为回收或不归你使用更好一些），如果有人用一把钥匙拿走了里边的东西（你是不知情的），你用“=”来的钥匙再想拿是不行的。

能赋值，只不过指针分量的值不是你所期望的值而已。

指针变量和其他的变量一样，都是可以使用=赋值的。

因为在指针=赋值的时候，你期望的不是这个指针变量被赋值，而是她指向的内容被复制。

引用 1 楼 user-8 的回复:每个数据都是一个箱子，每个指针都是一个号码，这个号码对应另一个箱子 其他类型的数据用=复制时，从一个箱子变成两个相同的箱子 指针用=复制时，从一个号码变成两个相同的号码——不管变成多少个，相同的号码永远对应同一个箱子，当一个人去砸这个号码对应的箱子的时候，另一个持有相同号码的人不可能当作没看见明白了，可以赋值，但是他们的指针成员指向的内存空间都是同一个。谢了。。


Question: 字符串的asc码值怎么算，，也就是说怎么比较两个字符串的大小

引用 26 楼 xhw88398569 的回复:[quote=引用 25 楼 lovesmiles 的回复:] [quote=引用 24 楼 u012632288 的回复:] [quote=引用 23 楼 xhw88398569 的回复:] [quote=引用 22 楼 xhw88398569 的回复:] [quote=引用 19 楼 lovesmiles 的回复:] [quote=引用 8 楼 u012632288 的回复:] [quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote] 字符串没有ASCII码！！！只有字符才有，字符串的比较就是分成一个一个字符比较，第一个和第一个比，如果二个相等，就第二个和第二个比。一直比出一个大小为止。[/quote]比如说“ab”就是(16<<97) + (8<<98) + (0<<0)  'a','b','\0'[/quote]我把操作数和移动位数写反了[/quote] 其实我看不懂，，操作数和移动位数  为什么要这样。。。[/quote]  别看他的，不知道他在写什么。我给你举个例子： "abc"和"abd"比较。 首先比较第一个字母，a,ASCII码是97.大家都一样、 比较第二个字母，b,ASCII是98，大家都一样。 比较第三个字母，前面的是c,ASCII是的99，后面的是d,ASCII是100, 100比99大，于是返回结果abd>abc. 就是这样。明白没[/quote]楼主好像说的是整体换成整数数值的大小，不是strcmp()。我也不知道楼主为什么这么想[/quote]   对，就是整体换成数值大小怎么算，操作数和移动位数 怎么弄的

引用 29 楼 ChaosStudyC 的回复:[quote=引用 20 楼 zhao4zhong1 的回复:] 这8个人的统一身份证号码是多少啊？ 我也想说这句..[/quote]  什么意思

引用 20 楼 zhao4zhong1 的回复:这8个人的统一身份证号码是多少啊？ 我也想说这句..

细说要从数据类型说起.我们知道每个变量都是储存在内存的特定空间内，比如我定义一个变量int a=98；那么a就以补码的形式储存在某个内存地址上，如果我们强行将a的数据类型变为字符型（显示转换）的话，在内存上，这个a的补码是不变的，就是说a的实际值没有改变，但是如果用cout输出到控制台上就可以看见这个98变成了ASCII对应的 b 了，ASCII就是这样的转换关系。如果要用strcmp函数来比较两个字符串的大小，首先将两个字符串的第一个字符进行比较，就拿你的例子来说，“aaa”的第一个字符是‘a’，“bb”的第一个字符是‘b’，那么a的ASCII码是97，而b的ASCII是98，所以函数就会返回-1，再假如，如果两个字符串分别是“aba”和“aca”的话，首先比较第一个字符，两个都是a，那么就会比较第二个字符，在第二次比较里面，b的ASCII是98，c的ASCII是99，那么就得出“aba”是比“aca”小，所以函数就会返回-1。其他也就这样如此类推了

引用 8 楼 u012632288 的回复:[quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote] 字符串没有ASCII码！！！只有字符才有，字符串的比较就是分成一个一个字符比较，第一个和第一个比，如果二个相等，就第二个和第二个比。一直比出一个大小为止。

引用 26 楼 xhw88398569 的回复:[quote=引用 25 楼 lovesmiles 的回复:] [quote=引用 24 楼 u012632288 的回复:] [quote=引用 23 楼 xhw88398569 的回复:] [quote=引用 22 楼 xhw88398569 的回复:] [quote=引用 19 楼 lovesmiles 的回复:] [quote=引用 8 楼 u012632288 的回复:] [quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote] 字符串没有ASCII码！！！只有字符才有，字符串的比较就是分成一个一个字符比较，第一个和第一个比，如果二个相等，就第二个和第二个比。一直比出一个大小为止。[/quote]比如说“ab”就是(16<<97) + (8<<98) + (0<<0)  'a','b','\0'[/quote]我把操作数和移动位数写反了[/quote] 其实我看不懂，，操作数和移动位数  为什么要这样。。。[/quote]  别看他的，不知道他在写什么。我给你举个例子： "abc"和"abd"比较。 首先比较第一个字母，a,ASCII码是97.大家都一样、 比较第二个字母，b,ASCII是98，大家都一样。 比较第三个字母，前面的是c,ASCII是的99，后面的是d,ASCII是100, 100比99大，于是返回结果abd>abc. 就是这样。明白没[/quote]楼主好像说的是整体换成整数数值的大小，不是strcmp()。我也不知道楼主为什么这么想[/quote] 你看楼主问的问题就知道了，asii码是什么都没有搞懂

引用 25 楼 lovesmiles 的回复:[quote=引用 24 楼 u012632288 的回复:] [quote=引用 23 楼 xhw88398569 的回复:] [quote=引用 22 楼 xhw88398569 的回复:] [quote=引用 19 楼 lovesmiles 的回复:] [quote=引用 8 楼 u012632288 的回复:] [quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote] 字符串没有ASCII码！！！只有字符才有，字符串的比较就是分成一个一个字符比较，第一个和第一个比，如果二个相等，就第二个和第二个比。一直比出一个大小为止。[/quote]比如说“ab”就是(16<<97) + (8<<98) + (0<<0)  'a','b','\0'[/quote]我把操作数和移动位数写反了[/quote] 其实我看不懂，，操作数和移动位数  为什么要这样。。。[/quote]  别看他的，不知道他在写什么。我给你举个例子： "abc"和"abd"比较。 首先比较第一个字母，a,ASCII码是97.大家都一样、 比较第二个字母，b,ASCII是98，大家都一样。 比较第三个字母，前面的是c,ASCII是的99，后面的是d,ASCII是100, 100比99大，于是返回结果abd>abc. 就是这样。明白没[/quote]楼主好像说的是整体换成整数数值的大小，不是strcmp()。我也不知道楼主为什么这么想

引用 24 楼 u012632288 的回复:[quote=引用 23 楼 xhw88398569 的回复:] [quote=引用 22 楼 xhw88398569 的回复:] [quote=引用 19 楼 lovesmiles 的回复:] [quote=引用 8 楼 u012632288 的回复:] [quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote] 字符串没有ASCII码！！！只有字符才有，字符串的比较就是分成一个一个字符比较，第一个和第一个比，如果二个相等，就第二个和第二个比。一直比出一个大小为止。[/quote]比如说“ab”就是(16<<97) + (8<<98) + (0<<0)  'a','b','\0'[/quote]我把操作数和移动位数写反了[/quote] 其实我看不懂，，操作数和移动位数  为什么要这样。。。[/quote]  别看他的，不知道他在写什么。我给你举个例子： "abc"和"abd"比较。 首先比较第一个字母，a,ASCII码是97.大家都一样、 比较第二个字母，b,ASCII是98，大家都一样。 比较第三个字母，前面的是c,ASCII是的99，后面的是d,ASCII是100, 100比99大，于是返回结果abd>abc. 就是这样。明白没

引用 23 楼 xhw88398569 的回复:[quote=引用 22 楼 xhw88398569 的回复:] [quote=引用 19 楼 lovesmiles 的回复:] [quote=引用 8 楼 u012632288 的回复:] [quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote] 字符串没有ASCII码！！！只有字符才有，字符串的比较就是分成一个一个字符比较，第一个和第一个比，如果二个相等，就第二个和第二个比。一直比出一个大小为止。[/quote]比如说“ab”就是(16<<97) + (8<<98) + (0<<0)  'a','b','\0'[/quote]我把操作数和移动位数写反了[/quote] 其实我看不懂，，操作数和移动位数  为什么要这样。。。

ASCII码是字符串的内存数值. 所以 char  buf1[] = "aaa"  其内存数值就已经是ASCII, 按顺序比较即可.

引用 22 楼 xhw88398569 的回复:[quote=引用 19 楼 lovesmiles 的回复:] [quote=引用 8 楼 u012632288 的回复:] [quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote] 字符串没有ASCII码！！！只有字符才有，字符串的比较就是分成一个一个字符比较，第一个和第一个比，如果二个相等，就第二个和第二个比。一直比出一个大小为止。[/quote]比如说“ab”就是(16<<97) + (8<<98) + (0<<0)  'a','b','\0'[/quote]我把操作数和移动位数写反了

引用 19 楼 lovesmiles 的回复:[quote=引用 8 楼 u012632288 的回复:] [quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote] 字符串没有ASCII码！！！只有字符才有，字符串的比较就是分成一个一个字符比较，第一个和第一个比，如果二个相等，就第二个和第二个比。一直比出一个大小为止。[/quote]比如说“ab”就是(16<<97) + (8<<98) + (0<<0)  'a','b','\0'

C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\STRCMP.C /*** *strcmp.c - routine to compare two strings (for equal, less, or greater) * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       Compares two string, determining their lexical order. * *******************************************************************************/  #include <cruntime.h> #include <string.h>  #ifdef _MSC_VER #pragma function(strcmp) #endif  /* _MSC_VER */  /*** *strcmp - compare two strings, returning less than, equal to, or greater than * *Purpose: *       STRCMP compares two strings and returns an integer *       to indicate whether the first is less than the second, the two are *       equal, or whether the first is greater than the second. * *       Comparison is done byte by byte on an UNSIGNED basis, which is to *       say that Null (0) is less than any other character (1-255). * *Entry: *       const char * src - string for left-hand side of comparison *       const char * dst - string for right-hand side of comparison * *Exit: *       returns -1 if src <  dst *       returns  0 if src == dst *       returns +1 if src >  dst * *Exceptions: * *******************************************************************************/  int __cdecl strcmp (         const char * src,         const char * dst         ) {         int ret = 0 ;          while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)                 ++src, ++dst;          if ( ret < 0 )                 ret = -1 ;         else if ( ret > 0 )                 ret = 1 ;          return( ret ); }

这8个人的统一身份证号码是多少啊？

引用 13 楼 xhw88398569 的回复:[quote=引用 8 楼 u012632288 的回复:] [quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote]字符ascii就那么一百多个，照你的意思“sbc”和“abb”在内存中占四个字节，每个字节对应相应的ascii码，每个字符依次偏移8位，一共是32位。你转成整形输出不就知道了[/quote] 你的回答好像是我想要的，，可以详细点吗，，举一个例子。

lz你看书没啊，怎么会提出这种不存在的东西

引用 3 楼 u012632288 的回复:字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 是先比较第一个字符的ascll码，如果相等再继续比较下一个，一个个字符比较的，网上应该很多strcmp()函数的具体实现

ascll吗是对应每一个字符的

引用 8 楼 u012632288 的回复:[quote=引用 3 楼 u012632288 的回复:] 字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少， 我现在想知道字符串的asc值怎么计算。。求大神。。注意是字符串 。。比如说  sbc 和abb 的asc码值怎么计算，，计算机制是什么[/quote]字符ascii就那么一百多个，照你的意思“sbc”和“abb”在内存中占四个字节，每个字节对应相应的ascii码，每个字符依次偏移8位，一共是32位。你转成整形输出不就知道了

引用 3 楼 u012632288 的回复:字符串的asc码值怎么计算，，，例如  aa的asc值是多少，，sd的是多少，你是想比字符ascii，还是想把他们转换成整形对比啊？“aa”这个ascii码没听过，水平太低了没见过


Question: 关于希尔排序的分段问题

引用 1 楼 bubu8633 的回复:源码贴出来看看  在楼上

源码贴出来，不过是用JAVA写的 原文在：https://d396qusza40orc.cloudfront.net/algs4partI/slides%2F21ElementarySorts.pdf    第42页  public static void shellSort(int[] arr) { 		int len = arr.length; 		int h = 1; 		while (h < len / 3) { 			h = 3 * h + 1; 		} 		while (h >= 1) { 			for (int i = h; i < len; i++) { 				for (int j = i; j >= h && arr[j] < arr[j - h]; j -= h) { 					int temp = arr[j]; 					arr[j] = arr[j - h]; 					arr[j - h] = temp; 				} 			} 			h /= 3; 		} 	}

3n+1 这个序列的数据，排一下看： 3*1+1 =3 是质数 3*2+1 =7 是质数 3*3+1 =10 是和数，但是跟7互质 3*5+1 =16 是和数 3*6+1 =19  是质数，跟16 互质 3*7+1 =22 是和数，跟19 互质 3*8+1 =25 是和数 ，跟22互质 3*9+1 =31 是质数  这个序列，有大量的质数，并且，大部分相邻的两个数，是互质的 2^n 几乎都是和数，并且相邻的两个数都不是互质的。  所以关于希尔排序， 这个增量序列比2^n 要快 如果，这个增量序列，每个数都是质数，还要更快。  具体原因，请看算法导论，或者其他算法类书籍。

源码贴出来看看


Question: 新手，求大神解惑

我的QQ407854730 哪位老师加我给讲解下 跪谢了

你看 if (year>2000)    d=(year-1-2000)/4-(year-1-2000)/100+(year-1-2000)/400+1;    else     d=(year-2000)/4-(year-2000)/100+(year-2000)/400;    dy=(year-2000)+d;     /*** 该年 1月1号 到2000年1月1号的 " 星期差 " ***/  它是先/4，然后/100，然后/400 最后d不是整数了吧而且d是闰年和平年综 合的一个差吧 ，怎么这样算的呢

万年历主要理解这两点: 1、判断是不是闰年 (year%4!=0||year%100==0&&year%400!=0)满足条件就是平年，把一年中的所有月份分为四类（28，29，30，31）。  2 、 求出 一年 中的 第一 天是 周 几  (year  +(year-1)/4-(year-1)/100+(year-1)/400)%7。  其他都简单了.


Question: C程序变量如何赋值。。

memset函数的作用只是用来清空数组的值，将数组中所有元素全部写为0.所以你想要写死一个值就可以直接用赋值语句就好了，或者调用字符串拷贝函数也可以。但是为了不出现一些错误的数据，所以在对一些重复使用到的同一个数组需要进行清零操作，防止下次输出的时候输出了一部分上一次残留在数组中的元素。

“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

GetWorkDate(prtdate);    /* 打印日期 */ 替换成 strcpy(prtdate, "YYYYMMDD");

char prtdate[8+1] = "20140805";  好吧我是来接分的

引用 1 楼 lisong694767315 的回复: char prtdate[8+1] = "20140805"; +1

将GetWorkDate(prtdate); 替换成下面的一句： sprintf(prtdate,"%s","20140805");

引用 1 楼 lisong694767315 的回复: char prtdate[8+1] = "20140805";  额，不用做memset这累操作么？

char prtdate[8+1] = "20140805";


Question: 冒泡排序法

引用 3 楼 chlth007 的回复:[quote=引用 1 楼 zjq9931 的回复:] 改了，理清思路是关键。 一遍不行，就再练一遍。  #include<stdio.h> main() { 	int t,i,j,a[5]; 	printf("input number of data:\n"); 	for(i=1;i<=5;i++) 		scanf("%d",&a[i]); 	for(i=1;i<5;i++) 	{ 		for(j=i; j<5; j++) 			if(a[j]>a[j+1]) 			{ 				t=a[j]; 				a[j]=a[j+1]; 				a[j+1]=t; 			} 	} 	for(i=1;i<=5;i++) 		printf("a[%d]=%d\n",i,a[i]); 	printf("\n"); } 我把你的运行了也不行啊 [/quote] 确实我的也错了。唉，我也粗心了。。。 有我的原因，还有另外一个原因：越界了。 下面是改好的代码：   #include<stdio.h> main() { 	int t,i,j,a[7]; 	printf("input number of data:\n"); 	for(i=1;i<=5;i++) 		scanf("%d",&a[i]);  	for(i=1;i<=5;i++) 		printf("a[%d]=%d\n",i,a[i]); 	puts(""); 	for(i=1;i<5;i++) 	{ 		for(j=i+1; j<=5; j++) 		if(a[i]>a[j]) 		{ 			t=a[i]; 			a[i]=a[j]; 			a[j]=t; 		} 	} 	for(i=1;i<=5;i++) 		printf("a[%d]=%d\n",i,a[i]); 	printf("\n"); }

引用 1 楼 zjq9931 的回复:改了，理清思路是关键。 一遍不行，就再练一遍。  #include<stdio.h> main() { 	int t,i,j,a[5]; 	printf("input number of data:\n"); 	for(i=1;i<=5;i++) 		scanf("%d",&a[i]); 	for(i=1;i<5;i++) 	{ 		for(j=i; j<5; j++) 			if(a[j]>a[j+1]) 			{ 				t=a[j]; 				a[j]=a[j+1]; 				a[j+1]=t; 			} 	} 	for(i=1;i<=5;i++) 		printf("a[%d]=%d\n",i,a[i]); 	printf("\n"); } 我把你的运行了也不行啊

引用 1 楼 zjq9931 的回复:改了，理清思路是关键。 一遍不行，就再练一遍。  #include<stdio.h> main() { 	int t,i,j,a[5]; 	printf("input number of data:\n"); 	for(i=1;i<=5;i++) 		scanf("%d",&a[i]); 	for(i=1;i<5;i++) 	{ 		for(j=i; j<5; j++) 			if(a[j]>a[j+1]) 			{ 				t=a[j]; 				a[j]=a[j+1]; 				a[j+1]=t; 			} 	} 	for(i=1;i<=5;i++) 		printf("a[%d]=%d\n",i,a[i]); 	printf("\n"); }   +1！理清思路是关键！

引用 4 楼 zjq9931 的回复:[quote=引用 3 楼 chlth007 的回复:] [quote=引用 1 楼 zjq9931 的回复:] 改了，理清思路是关键。 一遍不行，就再练一遍。  #include<stdio.h> main() { 	int t,i,j,a[5]; 	printf("input number of data:\n"); 	for(i=1;i<=5;i++) 		scanf("%d",&a[i]); 	for(i=1;i<5;i++) 	{ 		for(j=i; j<5; j++) 			if(a[j]>a[j+1]) 			{ 				t=a[j]; 				a[j]=a[j+1]; 				a[j+1]=t; 			} 	} 	for(i=1;i<=5;i++) 		printf("a[%d]=%d\n",i,a[i]); 	printf("\n"); } 我把你的运行了也不行啊 [/quote] 确实我的也错了。唉，我也粗心了。。。 有我的原因，还有另外一个原因：越界了。 下面是改好的代码：   #include<stdio.h> main() { 	int t,i,j,a[7]; 	printf("input number of data:\n"); 	for(i=1;i<=5;i++) 		scanf("%d",&a[i]);  	for(i=1;i<=5;i++) 		printf("a[%d]=%d\n",i,a[i]); 	puts(""); 	for(i=1;i<5;i++) 	{ 		for(j=i+1; j<=5; j++) 		if(a[i]>a[j]) 		{ 			t=a[i]; 			a[i]=a[j]; 			a[j]=t; 		} 	} 	for(i=1;i<=5;i++) 		printf("a[%d]=%d\n",i,a[i]); 	printf("\n"); } [/quote]谢谢，我刚学编程两个星期，有好多地方还不太清楚。


Question: 这段代码的实际内存使用量为什么与预计的

终于知道问题所在了。  正如6楼提到的第二点，malloc分配出来的实际空间会比参数指定的size还要多出一点点。如果malloc的次数少还发现不到这问题，可一旦malloc的次数十分巨大时，那些多出来的“碎片”加起来就变得十分可观了。  最后我采用的方法是预先malloc出一大片空间池，以后每次需要申请内存保存数据的话，就把指针指向那片空间池对应的位置把数据保存到里面。这样程序运行时实际使用的内存量就和之前估算的差不多了。

引用 6 楼 FancyMouse 的回复:一般会有两种浪费。 1. 这种大规模小size的内存分配正常都不会给你正好分配这个size的内存的。你得去看你的C运行库代码，看看比如是不是会对9字节的malloc请求给你实际分配了16字节。我印象里的glibc把小size内存的malloc给向上取整到2幂次，那么9字节就实际分配16字节，20字节就实际分配32字节，直接就多出来(7+12)*300w=57MB了。当然具体数字因情况而异，但是正常情况下这类浪费肯定有。大块malloc这类浪费忽略不计，但是小的肯定不行。 2. 每一块malloc的内存，在那个指针的前面，allocator会存储一些关于这块内存是如何分配的这种信息，以便它free的时候使用。具体也是要看allocator怎么写，不过正常都在8~16字节左右。每块malloc的空间都会有。这也是为什么越界经常会导致崩溃……因为这块数据被破坏了allocator就不知道该怎么free这块内存了。如果算它8字节，这里就有8*300w*3=72MB了。  所以即使通用allocator再厉害，自己做内存池的理由还是有很多的，这就是其中一个。 刚刚试用VS2010和DevCPP编译同一份代码，发现编译出来的程序在运行时使用的内存量貌似真的有很大的差异呢。  请问有没有什么编译器推介一下，可以让生成的程序占用较小的内存？ 谢谢！

几个建议： 1、编译器换最新的VS 2013 或者 gcc 4.9.x 2、把malloc内存的操作全部替换掉，改成C++ 0x11的 vector 和 tuple 组合 3、算法似乎可以优化，但不知道你的具体需求。

引用 3 楼 user-6 的回复:1. 没算name的20个字节 2. 没算栈 name的20个字节已经包含了（见估算过程的第3点），共占用20Byte * 100万 * 3 = 57.22MB。 至于栈的空间，这应该怎么算呢？会造成2-3倍的内存空间差异吗？

我的意思是，程序需要占用264.19MB的内存是不是都由这个无向图占用的。比如，如果10万条记录要用30M，那就是；如果10万条记录占用150M，那就不是。

VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

那么多malloc却只有一个free.  内存占用高也很正常, 最后也会有一大堆的内存泄漏

1. 没算name的20个字节 2. 没算栈

引用 1 楼 brookmill 的回复:建议LZ分别试一下10万、1万、1000、100、10、1条记录的情况，然后对比找规律 这个算黑盒吧，白盒的由楼下补充  我也曾经打算用1条、10条记录来调试，只是这样的内存量太少了，我在Win7的任务管理器->进程->内存一栏看不出内存的变化(那里的单位都是KB级别的......)。 或者您有什么好的工具推荐一下吗？


Question: 自己在写一个小程序的时候遇到了问题，望前辈们指教！万分感谢

这个是不是应该用java写比较好呢？我不懂诶

引用 1 楼 zjq9931 的回复:[quote=引用 楼主 bryantno1 的回复:] 本人是大学生，开学后该选课了，介于学校的网非常烂，选课那天学校的选课入口往往特别拥堵，所以我想用C语言写一个刷选课入口的程序，学校的入口如果抢不上就是显示 选课人数已满，我想做一个无限刷这个网址的程序直到不出现选课入口已满出现入口为止，无限刷的代码已经敲好，就是不知道怎么判断网页是选课人数已满还是进去入口，所以不知道什么时候break，，哪位大神能帮我看一下，万分感激！！！！ 这是我核心代码，网址就先用百度代替了，怕弄错了把机子搞死机了就先弄了5个循环  CInternetFile 这个类。 用这个类来读取文件的内容。 找到特定的位置根据字符来判断。[/quote]具体是怎样获取网页中的字符呢？刚百度了半天没找到

引用 2 楼 zhao4zhong1 的回复:使用curl库？唔。。。不懂。。我就是想获取网页中的内容。。如果显示选课人数已满 就停止这个循环。。

选个课都要这么下功夫，LZ的学校不一般啊

使用curl库？

引用 楼主 bryantno1 的回复:本人是大学生，开学后该选课了，介于学校的网非常烂，选课那天学校的选课入口往往特别拥堵，所以我想用C语言写一个刷选课入口的程序，学校的入口如果抢不上就是显示 选课人数已满，我想做一个无限刷这个网址的程序直到不出现选课入口已满出现入口为止，无限刷的代码已经敲好，就是不知道怎么判断网页是选课人数已满还是进去入口，所以不知道什么时候break，，哪位大神能帮我看一下，万分感激！！！！ 这是我核心代码，网址就先用百度代替了，怕弄错了把机子搞死机了就先弄了5个循环  CInternetFile 这个类。 用这个类来读取文件的内容。 找到特定的位置根据字符来判断。

百度

引用 5 楼 bryantno1 的回复:[quote=引用 1 楼 zjq9931 的回复:] [quote=引用 楼主 bryantno1 的回复:] 本人是大学生，开学后该选课了，介于学校的网非常烂，选课那天学校的选课入口往往特别拥堵，所以我想用C语言写一个刷选课入口的程序，学校的入口如果抢不上就是显示 选课人数已满，我想做一个无限刷这个网址的程序直到不出现选课入口已满出现入口为止，无限刷的代码已经敲好，就是不知道怎么判断网页是选课人数已满还是进去入口，所以不知道什么时候break，，哪位大神能帮我看一下，万分感激！！！！ 这是我核心代码，网址就先用百度代替了，怕弄错了把机子搞死机了就先弄了5个循环  CInternetFile 这个类。 用这个类来读取文件的内容。 找到特定的位置根据字符来判断。[/quote]具体是怎样获取网页中的字符呢？刚百度了半天没找到[/quote] 和本地文件操作差不多啊。


Question: 一个简单地c语言指针问题 求指导。

引用 17 楼 PeiS0927 的回复:#include <iostream> using namespace std;  int main() { 	int a=10;	 	int *p; 	p=&a;  	return 0; }  调试结果截图如下：  你用的是什么软件

不好意思，是我没太写明白造成你的误解 这回你写的很清楚了 学习了！

引用 15 楼 baiyang20140704 的回复:int a = 10; int *p;  p = &a;   printf("a=%d\n", a);                                //打印的是a的值 printf("a address = %d\n", &a);          //打印的是a的地址 printf("p = %d\n", *p);                          //打印的是p的值 printf("p address = %d\n", &p);        //打印的是p的地址（注：这里a的地址，而是它自己声明变量时存放的地址） printf("a &&p address = %d\n", p);  //打印的是a,p共同的地址(这里才是两个变量共同指向的一个地址)  可以自己亲手放在程序中，执行下看看，是不是这样子的！ 有两个地方有误  printf("p = %d\n", *p);                          //打印的是p的值 printf("a &&p address = %d\n", p);  //打印的是a,p共同的地址(这里才是两个变量共同指向的一个地址)  理解问题：1）*p是指针变量指向a的存储空间，即a的值                       2）p是指针变量，为a的地址

printf("%d",*p); printf("%p",p);

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495 本人纯属混分的

引用 1 楼 zjq9931 的回复:&p是a值得地址 -------------- 你这个理解是错的。 p里面存的才是a值的地址。 &p是指针p自己的地址。  [quote=引用 楼主 bo4312 的回复:] 小弟现在在看指针相关知识，有个疑惑，举例如下：         int a=10;	 	int *p; 	p=&a; 我现在知道*p是存放地址里的值也就是a的值是10，&p是a值得地址，但是不太清楚如果输出p是什么呢，我在vs里测试了下，结果如下：    请求大神讲一下这里的&p和p的输出结果怎么来的。 不胜感激！[/quote]+1

p 指针 &p 指针的地址 &a   a的地址 *p   根据a的地址取a 的值 &(*p)     a的地址 楼主不明白的话，都打印出来看看吧 打印指针用 %p

引用 楼主 bo4312 的回复:小弟现在在看指针相关知识，有个疑惑，举例如下：         int a=10;	 	int *p; 	p=&a; 我现在知道*p是存放地址里的值也就是a的值是10，&p是a值得地址，但是不太清楚如果输出p是什么呢，我在vs里测试了下，结果如下：    请求大神讲一下这里的&p和p的输出结果怎么来的。 不胜感激！         int a=10;	 	int *p;  	p=&a;  cout << a << endl;//a的值10 cout << &a << endl;//a 的地址 cout << p << endl;//指针p的地址 cout << *p << endl;//a的地址（&在此处是取地址符号，就是把a的地址赋给指针p指向的值）

因为有且只有这样，才能解决指针相关的一切问题。

引用 7 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495  赵老师怎么每次回复的都是这一句啊。。？？？

引用 4 楼 lisong694767315 的回复:p里存的就是a的地址 *p是a的值 &p是对指针取址，就是p自身的地址。

引用int a=10; int *p; p=&a; 我现在知道*p是存放地址里的值也就是a的值是10，&p是a值得地址，但是不太清楚如果输出p是什么呢 楼主说的应该是手误： *p是a的值没错，但并不是*p存放值，而是：*解引用，*p就是取p中所存地址对应位置的值，到此，楼主问题解答了，p就是a的地址！

p里存的就是a的地址 *p是a的值 &p是对指针取址，就是p自身的地址。

恩恩 你说的对 我再看看哈。 谢谢您   引用 1 楼 zjq9931 的回复:&p是a值得地址 -------------- 你这个理解是错的。 p里面存的才是a值的地址。 &p是指针p自己的地址。  [quote=引用 楼主 bo4312 的回复:] 小弟现在在看指针相关知识，有个疑惑，举例如下：         int a=10;	 	int *p; 	p=&a; 我现在知道*p是存放地址里的值也就是a的值是10，&p是a值得地址，但是不太清楚如果输出p是什么呢，我在vs里测试了下，结果如下：    请求大神讲一下这里的&p和p的输出结果怎么来的。 不胜感激！[/quote]

恩恩 你说的对 我再看看哈。 谢谢您

&p是a值得地址 -------------- 你这个理解是错的。 p里面存的才是a值的地址。 &p是指针p自己的地址。  引用 楼主 bo4312 的回复:小弟现在在看指针相关知识，有个疑惑，举例如下：         int a=10;	 	int *p; 	p=&a; 我现在知道*p是存放地址里的值也就是a的值是10，&p是a值得地址，但是不太清楚如果输出p是什么呢，我在vs里测试了下，结果如下：    请求大神讲一下这里的&p和p的输出结果怎么来的。 不胜感激！