Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 大家第一次看《The C programming language》花了多长时间？

回复:
user: user-1
content: 好像在大学里作为教科书。。看过大半，目前都忘记完了。。当时感觉读起来很累

user: user-2
content: 十年前看了前面一两章就放下了，至今没再拿起。

user: user-3
content: 引用 楼主 Xuhanyu72 的回复:感觉这本书还是很有难度的，其中的一些课后习题我不知道是翻译的问题还是我的问题，感觉不知道题目在问什么，有时候看好几遍才知道题目的意思，把题目和答案来回对照看才明白。 不知道是我自己太落后了还是大家也是这样，想知道大家的情况。 我第一遍粗略看了谭浩强得书然后再看的这本。  看了好几个月，也没完全搞懂！

user: user-0
content: 引用 12 楼 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对应的汇编并单步执行观察相应内存和寄存器变化。）谢谢您，明白了。

user: user-0
content: 引用 16 楼 leigema 的回复:我是学过C语言后，上课时抽空大概看了一下，感觉不是很难。 一个星期应该可以看完文字部分确实不难都是些概念性的知识点，但是习题部分感觉比较难

user: user-4
content: 我是学过C语言后，上课时抽空大概看了一下，感觉不是很难。 一个星期应该可以看完

user: user-5
content: 第一次看是在9年前，至今未看完。

user: user-6
content: 这本书写得本来就不太属于教材的类型。这本书的权威性，应该是来自于其是C语言的标准的来源。在没有C标准时，好像这个书就是唯一的标准。当然后来的版2就按照c标准修订过了。技术大牛写的书，不会照顾你这些初学者的，平铺直叙，到处是细节，看得初学者不知所云。所以建议你还是看看C primer plus这样的入门教材式的书籍。不过C本身并不是太难。

user: user-7
content: 计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-8
content: 大概2个月啊

user: user-9
content: 我看完指针那一章之后就没看了，主要是里面的习题和函数例子我都实现不鸟，现在在看C和指针，等看完这本再去看看，我感觉《The C programming language》这本书更像一本标准手册，你要是初学的话还是先看一下C和指针吧，里面的习题也比较贴近初学者一点。

user: user-10
content: 没看过。。。老谭带我入的门

user: user-11
content: 表示是懂了一点C语言之后，才大致浏览了一下！看的时间比较短

user: user-12
content: 没看过，哇咔咔。

user: user-0
content: 引用 7 楼 mujiok2003 的回复:引用 6 楼 Xuhanyu72 的回复:[quote=引用 4 楼 mujiok2003 的回复:] 对照英文原版看吧。 如果英文OK， 直接看原版。之前看的是原版，感觉看原版太慢了，又看回中文版，我感觉自己水平不行，看这书前面文字部分还好，一到后面编程题目就觉得比较难。可能还是前面没吃透吧。  我估计是因为你实践偏少， 你要多动手。 [/quote]嗯嗯，我觉得应该也是这样

user: user-13
content: 引用 6 楼 Xuhanyu72 的回复:引用 4 楼 mujiok2003 的回复:对照英文原版看吧。 如果英文OK， 直接看原版。之前看的是原版，感觉看原版太慢了，又看回中文版，我感觉自己水平不行，看这书前面文字部分还好，一到后面编程题目就觉得比较难。可能还是前面没吃透吧。  我估计是因为你实践偏少， 你要多动手。

user: user-0
content: 引用 4 楼 mujiok2003 的回复:对照英文原版看吧。 如果英文OK， 直接看原版。之前看的是原版，感觉看原版太慢了，又看回中文版，我感觉自己水平不行，看这书前面文字部分还好，一到后面编程题目就觉得比较难。可能还是前面没吃透吧。

user: user-13
content: 那本书好像很久没有更新了。

user: user-13
content: 对照英文原版看吧。 如果英文OK， 直接看原版。

user: user-14
content: 就看了后面的，前面基础的没细看。大概2到3个月吧，我是抽空看的。现在主要看linux系统编程的。。。
user-0 提问: 两张同样的24位bmp图片左右拼接C语言求代码

回复:
user: user-1
content: 也可以创建兼容位图 然后通过DC将他们贴在一起

user: user-2
content: 楼上高手啊！

user: user-3
content: void stiching() {     std::vector<cv::Mat> imgs(2);     imgs[0] = cv::imread("/Users/Qt/program/blogsCodes/pic/panorama_image1.jpg");     imgs[1] = cv::imread("/Users/Qt/program/blogsCodes/pic/panorama_image2.jpg");     if(imgs[0].empty() || imgs[1].empty()){         std::cerr<<"can't read image"<<std::endl;         return;     }      cv::Mat pano;     cv::Stitcher stitcher = cv::Stitcher::createDefault();     stitcher.stitch(imgs, pano);     cv::imwrite("result.jpg", pano); }       原理 http://ramsrigoutham.com/2012/11/22/panorama-image-stitching-in-opencv/  openCV（open source computer vision的defacto standard）已经全面使用c++开发，现已不再开发c的api 未来的openCV3.0会将c的api mark为"deprecated" 建议采用c++的api,简洁得多了  例子  c  double calcGradients(const IplImage *src,                       int aperture_size = 7) {     CvSize sz = cvGetSize(src);          IplImage* img16_x = cvCreateImage(sz, IPL_DEPTH_16S, 1);      IplImage* img16_y = cvCreateImage(sz, IPL_DEPTH_16S, 1);      cvSobel(src, img16_x, 1, 0, aperture_size);     cvSobel(src, img16_y, 0, 1, aperture_size);          IplImage* imgF_x = cvCreateImage(sz, IPL_DEPTH_32F, 1);     IplImage* imgF_y = cvCreateImage(sz, IPL_DEPTH_32F, 1);     cvScale(img16_x, imgF_x);     cvScale(img16_y, imgF_y);          IplImage* magnitude = cvCreateImage(sz, IPL_DEPTH_32F, 1);     cvCartToPolar(imgF_x, imgF_y, magnitude);     double res = cvSum(magnitude).val[0];          cvReleaseImage(&magnitude );     cvReleaseImage(&imgF_x);     cvReleaseImage(&imgF_y);     cvReleaseImage(&img16_x);     cvReleaseImage(&img16_y);          return res; }   c++  double contrast_measure(Mat& img) {     Mat dx, dy;     Sobel(img, dx, 1, 0, 3, CV_32F);     Sobel(img, dy, 0, 1, 3, CV_32F);     magnitude(dx, dy, dx);          return sum(dx)[0]; }   那个容易理解，维护？一目了然

user: user-4
content: 关注一下，等高手现身
user-0 提问: 流媒体

回复:
user: user-1
content: live555貌似可以

user: user-2
content: h264流服务端rtp组包发送代码 参考下，注意几个步骤就好了！

user: user-3
content: 一块内存里有12345，在开辟个内存头是67，把12345拷过去

user: user-0
content: 我晓得加个RTP头就可以，可问题是怎么加？

user: user-3
content: 加个rtp头就可以了吧
user-0 提问: 请问C语言里面的指针里面的“*”和“&”用法怎么区别一下，各种混乱啊！谢谢！

回复:
user: user-1
content: 在声明中和在语句中不一样。

user: user-2
content: 具体看你这个函数是要干什么了！调用时总归会是  int *b; ...; add(&b);  在add函数内 a表示b的地址，只是个形参，调用过程中不会对原本b产生任何影响！ *a表示b的值，对*a的修改直接反馈到b的值上面。 &a表示的是一个二级指针，存放的是a的地址也就是b的地址的地址，类型是int **，你这个函数估计是不会用到的！

user: user-3
content: int a,int *a都是定义一个局部变量（一个整形，一个指针），它都局部于函数内部。函数结束自动灭亡。 int &a是C++中引用特性，即另一个变量的“别名”。 当外部调用函数，传递参数num(或者&num)时，那么 fun(int a) == a = num; fun(int *a)== a = # fun(int &a)== &a = num;

user: user-4
content: 变量a 本质上代表一个存储单元。CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值：存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性，C语言规定a表示存储单元中的数据，&a表示存储单元的地址。 a存储单元中的数据可以是一个普通数值，也可以是另一个存储单元的地址，比如：a = &b; 语句就是将b的存储单元的地址存入a存储单元中。C语言规定*a代表a中存储的地址对应的存储单元中的数据，也就是访问*a就等于访问b，于是*a提供了通过a访问b中的数据的手段。  a表示a对应的存储单元中的数据。 &a表示a对应的存储单元的地址。 *a表示：首先，要求a对应的存储单元中的数据一定是另一个存储单元的地址。         于是，*a表示另一个存储单元中的数据。 当a声明的类型是int时，a中存储的是一个整数数值，通过a可以访问（读取或修改）这个数值。 当a声明的类型是int*时，a中存储的是一个存储单元的地址，而该存储单元中存储的数据是一个整数数值；通过*a可以访问（读取或修改）这个数值。a == &*a 都是该存储单元的地址。 当a声明的类型是int**时，a中存储的是一个存储单元的地址，而该存储单元中存储的数据是另外一个存储单元的地址，另外这个存储单元中存储的是一个整数数值；通过**a可以访问（读取或修改）这个数值。 ...  最后，在C语言里地址叫指针。

user: user-5
content: http://download.csdn.net/detail/max_min_/6333711 c和指针   多看看！

user: user-6
content: 找本语法书看看

user: user-7
content: void Add(int * a)   // a 是一个int型的指针,a指的地址存放的是int型的数据 {   a    // 取指针a的值(即地址)   *a   // 取指针a指向的内容   &a   // 取存放指针a的值的地址 }

user: user-8
content: a、*a、还是&a  对于声明或定义int * a; a 是一个指针,存放一个地址，a的值就是这个地址。 *a 是指针a，所存放的地址中存放的数据。 &a 指针也是数据的一种，而且它也有个地址，&a就是这个地址。 一切需要存放的数据，都有地址。  一般我们 都只考虑，变量的地址，而不考虑常量的地址；  因为常量，要么没有地址，要么像变量一样，也有一个地址， 这种有地址的常量，当作变量看待就可以了。

user: user-9
content: *a代表类型指针，a代表某类型的变量，&a代表某类型的变量的引用 *a 是指向某个地址，字节都是4 , a表示复制一个变量的值，字节与要复制的变量的字节一样大，&a表示引用某一个变量字节与类型有关！
user-0 提问: C语言中怎么利用API获得操作系统和CPU的信息？(求大神指点)

回复:
user: user-1
content: shell不错 很方便 学习下

user: user-1
content: 批处理啊，Linux Shell都出来了，哈哈。 偶是这么干的：物理内存信息是用GlobalMemoryStatusEx读取的。CPU信息是用汇编cpuid读取的。系统信息直接注册表读取出来的。  系统版本: Windows 7 Ultimate 产品号:  所有者: Microsoft CPU制造商: GenuineIntel CPU型号:        Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz 总共物理内存: 9.86 GB

user: user-2
content: 内联汇编好像可以

user: user-3
content: 操作系统信息，要读取硬盘启动扇区的硬盘分区标志，但是linux,可以运行在，windows 分区，所以一般不是靠程序测试出来的，而是由编译器定义的。 CPU信息，X86及兼容CPU，可以通过内置汇编，CPUID指令得到。

user: user-0
content: @logiciel    为什么还是有错误 不会改啊。。。

user: user-0
content: 要用C语言。。。

user: user-4
content: man 5 proc

user: user-0
content: 看不懂 我是新手小白。。。这是程序吗

user: user-5
content: 使用C语言调用系统shell批处理.... 用批处理获取电脑机器码的方法 以下是获取cpu和硬盘序列号的组合ID   @echo off&setlocal ENABLEDELAYEDEXPANSION set sig=0 for /f %%i in ('wmic DISKDRIVE get signature') do ( set /a sig+=1 if !sig!==2 set pcid=%%i ) set sig=0 for /f %%i in ('wmic cpu get ProcessorId') do ( set /a sig+=1 if !sig!==2 set pcid=!pcid!%%i ) echo cpu的id和硬盘序列号的组合为: %pcid% pause

user: user-0
content: 试了一下，有个错误啊 'std' : is not a class or namespace name 怎么改

user: user-6
content: linux下面就读取/proc/version和/proc/cpuinfo的信息就行了吧。

user: user-7
content: http://songxiaoyu8.blog.163.com/blog/static/20818128201071912939490/

user: user-7
content: #include <windows.h> #include <stdio.h> int main() {   SYSTEM_INFO  sysInfo;   OSVERSIONINFOEX osvi;    GetSystemInfo(&sysInfo);    printf("OemId : %u\n", sysInfo.dwOemId);   printf("处理器架构 : %u\n", sysInfo.wProcessorArchitecture);   printf("页面大小 : %u\n", sysInfo.dwPageSize);   printf("应用程序最小地址 : %u\n", sysInfo.lpMinimumApplicationAddress);   printf("应用程序最大地址 : %u\n", sysInfo.lpMaximumApplicationAddress);   printf("处理器掩码 : %u\n", sysInfo.dwActiveProcessorMask);   printf("处理器数量 : %u\n", sysInfo.dwNumberOfProcessors);   printf("处理器类型 : %u\n", sysInfo.dwProcessorType);   printf("虚拟内存分配粒度 : %u\n", sysInfo.dwAllocationGranularity);   printf("处理器级别 : %u\n", sysInfo.wProcessorLevel);   printf("处理器版本 : %u\n", sysInfo.wProcessorRevision);    osvi.dwOSVersionInfoSize=sizeof(osvi);   if (GetVersionEx((LPOSVERSIONINFOW)&osvi))   {     printf("Version     : %u.%u\n", osvi.dwMajorVersion, osvi.dwMinorVersion);     printf("Build       : %u\n", osvi.dwBuildNumber);     printf("Service Pack: %u.%u\n", osvi.wServicePackMajor, osvi.wServicePackMinor);   }   return 0;	 }

user: user-8
content: cat /proc/version cat /proc/cpuinfo           when /darwin9/       `hwprefs cpu_count`.to_i     when /darwin/       ((`which hwprefs` != '') ? `hwprefs thread_count` : `sysctl -n hw.ncpu`).to_i     when /linux/       `cat /proc/cpuinfo | grep processor | wc -l`.to_i     when /freebsd/       `sysctl -n hw.ncpu`.to_i     when /mswin|mingw/       require 'win32ole'       wmi = WIN32OLE.connect("winmgmts://")       cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # TODO count hyper-threaded in this       cpu.to_enum.first.NumberOfCores
user-0 提问: scanf循环输入的问题

回复:
user: user-1
content: 27行后面加一句rewind(stdin);

user: user-2
content: 请问这程序是完成什么事情的？我跑了下，不知道为什么要我一直输入。一直是死循环。

user: user-3
content: scanf("%d %d", &m, &n); 把两个%d直接加个空格试试~

user: user-4
content: 一串数字，1234567890...谁知道是几个？

user: user-5
content: int main(void) {  int m,n; while(scanf("%d%d",&m,&n)==2) { 	int p1,p2; 	p1=m; 	p2=n; 	while(p1>1&&p2>1) 	{ 		if(p1>p2) 		{ 			p1/=2; 		} 		else if(p1<p2) 		{ 			p2/=2; 		} 		else 		{ 			printf("共同祖先是%d",p1);  			break; 		} 	} 	 	puts("perfect\n");  } return 0;  }  我跑了一下，木事问题噻！就是一个死循环，只能强制退出，其他没啥大病！估计是你的输入有问题，  你可以 12 空格 4 回车 也可以： 12 回车 4 回车

user: user-6
content: 楼主“  1.输入第一个数后输入一个空格，再输入第二个数，再输入回车。这样每输入两个数就按一下回车。 以两个数为一组。  数1 空格 数2 回车 数3 空格 数4 回车 。。。  而且在while循环中刷新一下输入缓冲区。把回车的副作用消除

user: user-7
content: 在你的while循环里加上getchar()会取回车， 然后输出的的时候fflush(stdout)或者printf("\n") 刷新下缓冲区
user-0 提问: S3C2440中断的编写问题

回复:
user: user-0
content: 我在linux用的gcc，void __irq IRQ_Eint0(void);  void IRQ_Eint0(void) __irq; 都试过了都不行

user: user-1
content: ADS编译器中 ： void __irq IRQ_Eint0(void);  Keil编译器中 ： void IRQ_Eint0(void) __irq;

user: user-0
content: 能不能详细说下，我是裸板开发，TQ2440的板子。看其他代码都是那样写的难道gcc不支持？

user: user-2
content: 理解compiler,向前找找
user-0 提问: 新人求 救  删除字符串中的数字和符号，只留下英文字符，然后输出

回复:
user: user-1
content: 如果在原缓冲上难以掌控移动指针出错的话， 可以重新定义一个缓存，判断是字母则就拷贝赋值过来就好！

user: user-2
content: 逐个判断是否是字母就好了啊 int isalpha( int ch ); 功能：如果参数是字母字符，函数返回非零值，否则返回零值。
user-0 提问: while(scanf("%d",&a)!=EOP) 求犀利哥 急求 犀利哥

回复:
user: user-1
content: for(i=length-1;i>=0;i--)    {     nus[i]=(a/((int)(pow(10,i))))%10;    }

user: user-2
content: 输出结束是不是想用EOF啊？  //取各个位的数字  int num =13579,tmp =0; while(num != 0) {    tmp = num%10;    num = num/10;    printf("%d \n", tmp); //tmp就是取位的数字，从个位开始  }
user-0 提问: strcat函数

回复:
user: user-1
content: 其实我的也正常输出了，但是随后 exe终止了，可见还是有问题了。vc6飘过。

user: user-1
content: 引用 6 楼 zpxly 的回复:[quote=引用 5 楼 handoudouhao 的回复:] s[4]是5没有问题，但是没有是s[4]这个元素，换句话说结果是123456\0,前4个元素是使用数组s的存储空间后三个用的是s[3]后面紧挨着的三个存储单元，可是这三个并没有分配给数组s，这是有风险的，c不检查不提示，这是一缺陷，但是使用者必须注意，可能产生未知错误。 这个解释可以接受,这就把问题留给我们自己了[/quote]受用了

user: user-2
content: 引用 2 楼 zpxly 的回复:[quote=引用 1 楼 handoudouhao 的回复:] C是不做越界检查的，所以还是运行，但不是正常运行，有可能出错，因为使用了未分配的内存。另外，你的函数返回值没有意义了，请lz仔细看一下。 是标准c不做越界检查吗?这里是数组越界了也不检查?例如:我putchar(s[4])是5,这也不检查? 返回值只是附带的,没有用它[/quote]  putchar需要一个int型，你给他一个整形，你真好，正好满足我的要求，我可不管你存的啥玩意，也不管是不是你的！我照样输出，无非是个乱码，仅此而已！ 测试代码很简单  int main(void) { 	int s[1] = {0}; 	putchar(s[1]); 	return 0; }

user: user-3
content: c哲学：程序员为自己的行为负责

user: user-2
content: C语言数组越界，这是程序员的责任，不是语言本身责任，你也不要转移责任到编译器等等其他身上！ 无数漏洞都发生在越界上，也是黑客攻击最喜欢的方式之一！

user: user-0
content: 引用 7 楼 handoudouhao 的回复:“返回值只是附带的,没有用它 ”这句我不是很明白，返回值没有用可以设置void类型，或者不写也行 我的意思是这个返回值其实应该要,但是我的测试程序没有用它,您是个严谨的人

user: user-4
content: “返回值只是附带的,没有用它 ”这句我不是很明白，返回值没有用可以设置void类型，或者不写也行

user: user-0
content: 引用 5 楼 handoudouhao 的回复:s[4]是5没有问题，但是没有是s[4]这个元素，换句话说结果是123456\0,前4个元素是使用数组s的存储空间后三个用的是s[3]后面紧挨着的三个存储单元，可是这三个并没有分配给数组s，这是有风险的，c不检查不提示，这是一缺陷，但是使用者必须注意，可能产生未知错误。 这个解释可以接受,这就把问题留给我们自己了

user: user-4
content: s[4]是5没有问题，但是没有是s[4]这个元素，换句话说结果是123456\0,前4个元素是使用数组s的存储空间后三个用的是s[3]后面紧挨着的三个存储单元，可是这三个并没有分配给数组s，这是有风险的，c不检查不提示，这是一缺陷，但是使用者必须注意，可能产生未知错误。

user: user-0
content: 引用 3 楼 user-5 的回复:我这用vc 6.0最后会内存报错啊  如果我改成分配在堆上就没问题  分配在栈上（楼主）为什么我的就会报错呢。是编译器或电脑原因么。 我用的是gcc,等待大神来指点

user: user-5
content: 我这用vc 6.0最后会内存报错啊  如果我改成分配在堆上就没问题 void main() {     char s[4] = "123"; 	char t[4] = "456"; 	char *s1=(char *)malloc(sizeof(char)); 	char *t1=(char *)malloc(sizeof(char)); 	strcpy(s1,s); 	strcpy(t1,t);          Strcat(s1, t1);      printf("%s\n", s1);   }  分配在栈上（楼主）为什么我的就会报错呢。是编译器或电脑原因么。

user: user-0
content: 引用 1 楼 handoudouhao 的回复:C是不做越界检查的，所以还是运行，但不是正常运行，有可能出错，因为使用了未分配的内存。另外，你的函数返回值没有意义了，请lz仔细看一下。 是标准c不做越界检查吗?这里是数组越界了也不检查?例如:我putchar(s[4])是5,这也不检查? 返回值只是附带的,没有用它

user: user-4
content: C是不做越界检查的，所以还是运行，但不是正常运行，有可能出错，因为使用了未分配的内存。另外，你的函数返回值没有意义了，请lz仔细看一下。
user-0 提问: 指向结构体数组元素的指针

回复:
user: user-0
content: 引用 1 楼 user-1 的回复: //是这样的吧？ Stu st[4]={{"raul",22,'M'}, 	{"joe",23,'W'}, 	{"philip",21,'M'}, 	{"alan",20,'M'} 	}; 	Stu *p = st;  	while(p < st + 4) 		printf("%s\n",(p++)->name); 	printf("为什么单独一种可以全部输出。" 		"一起就不可以了？\n");  	for(p = st;p < st + 4;p++) 	{ 		printf("%s\t",(p)->name); 		printf("%d\t",(p)->age); 		printf("%c\n",(p)->gender); 		 	}    多谢我懂了！！谢谢！

user: user-1
content: //是这样的吧？ Stu st[4]={{"raul",22,'M'}, 	{"joe",23,'W'}, 	{"philip",21,'M'}, 	{"alan",20,'M'} 	}; 	Stu *p = st;  	while(p < st + 4) 		printf("%s\n",(p++)->name); 	printf("为什么单独一种可以全部输出。" 		"一起就不可以了？\n");  	for(p = st;p < st + 4;p++) 	{ 		printf("%s\t",(p)->name); 		printf("%d\t",(p)->age); 		printf("%c\n",(p)->gender); 		 	}
user-0 提问: 为什么在两个文件中分别定义了两个相同的变量，却没有冲突，而有时候却有重复定义的冲突呢？

回复:
user: user-1
content: 编译时各文件单独编译，跟其他文件无关，除非你用include把另一个文件的内容复制了过来 C语言规定变量定义时未赋值则为弱定义，如果和其它定义冲突可以视为声明

user: user-2
content: 因为你用了C语言的一个垃圾特性。多用C++编译器来编译C代码吧。

user: user-3
content: 编译的时候不做链接的事情，不知道有两个定义

user: user-4
content: 没有赋初值的被当成变量声明处理了。
user-0 提问: 怎么用vc实现生产者和消费者演示程序

回复:
user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h 正解！

user: user-1
content: 参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h

user: user-2
content: Windows 一般是，线程调度。 Unix ,linux 进程，线程调度都可以，因为他们是真正的多用户多任务系统。 Windows进程调度，要编写几个程序，在进程之间同步和通讯，不如线程同步好用。 多线程调试也比多进程简单。 多线程，只要编写一个程序，编译通过就可以测试了。

user: user-3
content: 只有多核CPU才有实质上的并行，如果是单核的，那么宏观上是并行，微观上串行，是通过进程或者线程间不断的切换实现的！  创建线程，及其操作控制有相关函数供使用，自己查阅多线程技术文档

user: user-4
content: 线程从创建 调度 到结束 不是一两个函数的事儿 你还是下载份源码参考吧

user: user-0
content: 那用vc实现多线程并行执行需要什么函数呢

user: user-4
content: 都是用线程的 进程并行执行。。。我是没见过的啦
user-0 提问: VC++6.0win32控制台程序PlaySound不能播放，跪求高手赐教！！！

回复:
user: user-1
content: 19.wav文件是不是放在E:盘根目录？

user: user-2
content: 经验证，是有声音输出。检查下自己电脑是不是 声音输出有问题

user: user-3
content: 有喇叭吗？没静音吧。没音量调为接近0吧。听力正常吧。……

user: user-4
content: SND_LOOP | SND_FILENAME

user: user-0
content: 引用 4 楼 vrace 的回复:因为你的程序已经退出了，声音自动关闭了 在 return 0; 之前加上 system("pause"); 试试还是不行

user: user-5
content: 因为你的程序已经退出了，声音自动关闭了 在 return 0; 之前加上 system("pause"); 试试

user: user-6
content: 引用 2 楼 u010233287 的回复:引用  [quote=引用 1 楼 u011097438 的回复:] SND_LOOP | SND_FILENAME  还是不行[/quote] SND_LOOP 重复播放声音，必须与SND_ASYNC标志一块使用。

user: user-0
content: 引用 引用 1 楼 u011097438 的回复:SND_LOOP | SND_FILENAME  还是不行
user-0 提问: C + windos socket 什么地方导致程序无法发送 ？？

回复:
user: user-0
content: 问题解决了。。我启用了双线程、、一个线程专门接收数据

user: user-1
content: 调试下确认代码哪里开始出错的，socket是否建立成功，监听端口是否有效并处于监听状态

user: user-2
content: 建立通信的Setp  //1、Server : socket()、bind()、listen() //2、Client : socket()、connect() //3、Server : accept()

user: user-3
content: Windows网络编程
user-0 提问: c语言类型长度由什么决定

回复:
user: user-1
content: 类型长度的定义也可以说是编译器做的，因为编译器将遵循C标准将我们的程序翻译成汇编语言，然会将汇编翻译成计算机可以直接识别的二进制指令，汇编指令与二进制又是一一对应的，用汇编来分析比较容易理解。 在32位系统中：     至于int是32位，1字，CPU在单位时间能处理的长度；要知道CPU和寄存器打交道最广泛，而我们存储在内存中的数如 int a=5;我们把5这个数存在变量a所在的内存单元，那个CPU要获取这个5数据，则要将a这个内存单元的数据传送(赋值)给数据寄存器，CPU也就得到了这个变量，而这个数据寄存器就是32位的，所以1字也就32位，它能一次性保存这个数。     至于double是64位，CPU将用两个寄存器(32位)来分高低字来存储这个数，对应着汇编中的单位双字。

user: user-1
content: 在汇编中有字节、字、双字。 字节（Byte）：铁定的是8位； 字（WORD）：如8086CPU是16位的，故1字为16位，而像Windows下32位系统1字为32位（即4字节)，同理 64位系统则一字为64位，即8字节； 双字(Double Word)：顾名思义即两个字（WORD），如8086CPU是16位，即1字*2=16(Bit)*2=32(Bit)，即4字节。  int 在C语言规范中定义为有符号的整数（有正负之分），一个整数占用一个字。对于不同的系统而言，一个字的所占的字节数也不同，如32位系统1字=4字节，所以我们说在32位系统中 int占4字节。同理：64位系统，int即占8字节。 （以上属自己结合汇编总结的，不正确的地方希望大家指点！）

user: user-2
content: 编译器不同，或者系统上安装的编译器来确定的吧。

user: user-3
content: 编译器

user: user-4
content: 有标准长度，但一般会因编译器、系统不同而不同。

user: user-5
content: 应该是编译器吧     还有其他的因素

user: user-6
content: int 一般就是CPU寄存器长度，当然也是由实现时决定。  16 Bits int 2字节 32 Bits int 4字节 64 Bits int 8字节  其他就是个不等式。 由编译器，实现时决定。  通常和操作系统有些关联，但是关系不大。

user: user-0
content: 谢谢，学到不少！感谢大神！

user: user-7
content: C标准的规定是个“不等式”，个人觉得是为了跨平台。不会规定死类型多大。  The rank oflong long int shall be greater than the rank oflong int , which shall be greater than the rank of int , which shall be greater than the rank of short int , which shall be greater than the rank of signed char

user: user-8
content: 对于数据类型的长度是有规范的，是被预先制定好的。CPU在对存储器进行读写的时候发现特定的数据类型那么就会根据这些预先制定好的规范（数据长度）来读写数据。楼主可以看看计算机组成原理。或者看8086汇编 里面介绍的很详细

user: user-9
content: 可以依赖stdint.h中的可移植类型编程。

user: user-10
content: 根据当时主流平台的架构，并具有前瞻性

user: user-11
content: 类型长度的最小值由标准协会指定，如果硬件遵守标准的话那么实现的类型长度就不能小于规定值。

user: user-12
content: 由类型的取值范围决定

user: user-13
content: 可以多尝试几种语言，总结体会一下。 基本定义主要是基于经验总结。
user-0 提问: ACM 滴盐水问题

回复:
user: user-1
content: 感觉用整数计算，用循环，比较准确。 效率并不低。

user: user-2
content: #include<stdio.h> #include<math.h> int main(){     int VUL,D,index,n;      scanf("%d%d",&VUL,&D)          if(VUL%D==0)             index=VUL/D;         else             index=VUL/D+1;          n=(sqrt((double)8*index)-1)/2;           printf("%d\n",index+n);       return 0; }

user: user-3
content: Output Limit Exceeded不是超时。。 还有，这题VUL和D应该用double吧

user: user-0
content: 没人了吗？.....

user: user-4
content: scanf写在while里，真奇怪。。。
user-0 提问: B树建立代码调试问题

回复:
user: user-1
content: 问题自己都知道了！单步调试，一个一个错误的改，慢慢来！ 调试程序也是基本技能！

user: user-0
content: 引用 1 楼 user-1 的回复:问题自己都知道了！单步调试，一个一个错误的改，慢慢来！ 调试程序也是基本技能！  -------------------------------------------------------------------------------------------------- 求教一下遇到这些问题，该如何解决。。 就是VS有的时候定位在这里，错不一定出在这里，一行一行的看，总觉得没什么问题。。
user-0 提问: 我做了个游戏辅助以前键盘钩子可以用，现在不能用了求解啊！

回复:
user: user-1
content: 这就是外挂与反外挂的对抗.  键盘钩子被禁用, 那是被检查看了撒, 你原理就是检查这个钩子有没有被安装,有没有加载非自己的dll.  你需要做更底层的技术.  如果你对外挂技术, 破解技术很有兴趣, 那么去"看雪" 多学习下吧. 上面也有很多大牛.
user-0 提问: 一个小白问题，关于补码

回复:
user: user-1
content: 先按位取反，再末位加一。

user: user-2
content: 补码本身的定义，就是取反（反码）+1 不过负数用补码表示，正数，0用原码表示，称作补码数，有时也简称补码。  带符号整型数据就是补码数。  原码就是2进制表示本身，无符号数就是原码表示的原码数。  反码就是对源码每位取反的结果，原码 |反码 =~0 ,即全1 ~~a =a  反码的反码是原码 C 语言的 ~ 就是求反码，-a 就是 a的补码， 不过对于补码整数，正数和0 就是它本身，即原码。 负数才是补码。 原码是相对反码，和补码来说的。  所以，补码，到底是什么意思，要看上下文的。 如果是编码的概念，补码就是反码加1.  如果是补码数的概念，就是正数，0 原码表示，负数补码表示的补码数。 PS： 这一般不是教材的问题，而是这个词汇本身就有两重含义。 如果只看到其中一个说法，或者问题很含糊，那么补码的的意义，很容易就把人弄糊涂了。

user: user-3
content: 概念很重要

user: user-4
content: 你要理解为什么会创造补码。 操作系统的书上应该有解释的。  网易公开课的 《编程范式》第2课有推导这个问题

user: user-5
content: 引用 3 楼 u011636587 的回复:[quote=引用 2 楼 user-6 的回复:] 正数的补码是自己。 负数的补码是取反+1。  有了上述理论基础，那么正补码的原码还是补码，负补码可以取反+1获得原码。 有点明白了，我被教材坑了，教材给的例子是： （-43）原=1000000000101011 （-43）反=1111111111010100 （-43）补=1111111111010101 害的我还以为所有的补码都是反码+1呢！！！ 刚又看了一下教材，在哪一页最低部发现一句：对于正整数而言，其原码、反码、补码均相同。 原本不理解，现在明白了。 谢了版主。[/quote]  补码只是相对于负数存储来说的，可以google网上多搜点相关理论知识看看，自己再编码练习下 不要太相信教材！当然选一本好的教材也是很重要的！

user: user-0
content: 引用 2 楼 user-6 的回复:正数的补码是自己。 负数的补码是取反+1。  有了上述理论基础，那么正补码的原码还是补码，负补码可以取反+1获得原码。 有点明白了，我被教材坑了，教材给的例子是： （-43）原=1000000000101011 （-43）反=1111111111010100 （-43）补=1111111111010101 害的我还以为所有的补码都是反码+1呢！！！ 刚又看了一下教材，在哪一页最低部发现一句：对于正整数而言，其原码、反码、补码均相同。 原本不理解，现在明白了。 谢了版主。

user: user-6
content: 正数的补码是自己。 负数的补码是取反+1。  有了上述理论基础，那么正补码的原码还是补码，负补码可以取反+1获得原码。

user: user-0
content: 额，先占个沙发。坐等答案
user-0 提问: 【新手求助】c编译的相关问题

回复:
user: user-0
content: 明白了，谢谢大家。

user: user-1
content: 编译和运行 两个完全不同的动作！楼主好好理解下！

user: user-2
content: 引用 2 楼 youaretwob 的回复:[quote=引用 1 楼 u012331924 的回复:] 1. 预编译好的那是库文件，不是头文件，头文件不参与编译，只是在被包含的地方展开。 2. 需不需要库那看你的程序了，如果用的是标准库的话一般是不需要的，但是要注意平台是否兼容(32bit和64bit，windows和unix)。如果是用的自己的库或者是特定平台才有的库，那当然要一起打包，但是也要考虑兼容性，或者说是可移植性。 那头文件里用到的函数是库文件的是吗？[/quote]   标准库的头文件里声明的函数的定义在库文件中

user: user-0
content: 引用 1 楼 u012331924 的回复:1. 预编译好的那是库文件，不是头文件，头文件不参与编译，只是在被包含的地方展开。 2. 需不需要库那看你的程序了，如果用的是标准库的话一般是不需要的，但是要注意平台是否兼容(32bit和64bit，windows和unix)。如果是用的自己的库或者是特定平台才有的库，那当然要一起打包，但是也要考虑兼容性，或者说是可移植性。 那头文件里用到的函数是库文件的是吗？

user: user-3
content: 1. 预编译好的那是库文件，不是头文件，头文件不参与编译，只是在被包含的地方展开。 2. 需不需要库那看你的程序了，如果用的是标准库的话一般是不需要的，但是要注意平台是否兼容(32bit和64bit，windows和unix)。如果是用的自己的库或者是特定平台才有的库，那当然要一起打包，但是也要考虑兼容性，或者说是可移植性。
user-0 提问: 大神帮帮忙！！！

回复:
user: user-1
content: 引用 2 楼 u012339623 的回复:[quote=引用 1 楼 u012331924 的回复:] puchar()打印了一个'a'和一个'\n'，所以后面输出的"212"才显示在下一行，而不是跟在'a'后面。 可结果是212跟在a后面 结果 121 a 212 而不是我想的那样： 121 a  212[/quote]  putchar()不会自动换行

user: user-2
content: 引用 6 楼 u012339623 的回复:[quote=引用 5 楼 u011636587 的回复:] 求，楼主能把各句的含义解释一下嘛。小白一只求各种知识，好多看不懂啊。char c1,c2   c1=getchar();   putchar(c1);  都不明白 getchar（）、putchar（）是单个输入输出函数[/quote] 恩，明白了。谢谢LZ指点

user: user-3
content: 引用 5 楼 u011636587 的回复:求，楼主能把各句的含义解释一下嘛。小白一只求各种知识，好多看不懂啊。char c1,c2   c1=getchar();   putchar(c1);  都不明白 getchar（）、putchar（）是单个输入输出函数

user: user-2
content: 求，楼主能把各句的含义解释一下嘛。小白一只求各种知识，好多看不懂啊。char c1,c2   c1=getchar();   putchar(c1);  都不明白

user: user-3
content: 引用 3 楼 user-4 的回复:lz 何不设断点 断点还没学

user: user-4
content: lz 何不设断点

user: user-3
content: 引用 1 楼 u012331924 的回复:puchar()打印了一个'a'和一个'\n'，所以后面输出的"212"才显示在下一行，而不是跟在'a'后面。 可结果是212跟在a后面 结果 121 a 212 而不是我想的那样： 121 a  212

user: user-1
content: puchar()打印了一个'a'和一个'\n'，所以后面输出的"212"才显示在下一行，而不是跟在'a'后面。
user-0 提问: 多项式乘法的链表实现，求优化。

回复:
user: user-1
content: 超时的话，估计有成千上百的项次，每次插入都是从头搜寻位置效率就不行了，既然数据是升序的，第二层循环时指数都是越来愈大，所以pre = head3;这句挪动到第一层循环里，类似归并算法。还有<0,0>的节点就不要了吧，分支代码就精简一些，只要打印的时候判断一下做适当输出即可...

user: user-2
content: 1 = 1 x^0 ==>1,0    x =1x     ==> 1,1  + a x = a x => a,1 - a x = -a x ==> -a,1 x2 = 1x2     ==> 1,2 -x2 =-1 x2   ===> -1,2 解析字符串表示的多项式 这里有几个问题要考虑好 1）无系数只有未知数，系数为1 2）系数的符号      2.1）不带符号为正号    2.2）带+， 为正号，    2.3) 带-，为负号  3）无指数      指数为1 4）无未知数==>常量， 值为常量，指数为 0 其他都很简单。

user: user-3
content: 可以借用多项式乘法电路实现，复杂度会降低一些 其中a，b序列串分别是两个多项式的系数。  你可以在采集两个多项式系数的时候生成对应的系数序列（比如初始化为0000，输入<3,2>即0300）

user: user-4
content: 建议:  1 减小不必要的循环判断(考虑三目运算符)  2 减小嵌套循环(无法避免的话，次数少的嵌套循环次多的)  3 避免循环调用malloc函数，能分配完尽量一次分配完！
user-0 提问: 数三退一 报错 请各位指点 不胜感激

回复:
user: user-0
content: 引用 5 楼 worldy 的回复:for(index=0;len>=1;index++) 估计是一个死循环，除非在循环体中，能 在for循环里： count++; if(count==3){count=0;a[index]=false;len--;} 这里每逢数到3，len就从最初的500递减一次，最后总会达到len=1的时候 那个。。让len小于1是为什么呢~

user: user-1

user: user-2
content: 传说中的java，楼主还好没有发在C++版，否则被认为砸场地的。  》for(index=0;len>=1;index++)可以么？ 显示不能这样写啊，你这个循环永远不会结束。

user: user-3
content: for(index=0;len>=1;index++) 估计是一个死循环，除非在循环体中，能让len小于1

user: user-0
content: 嗯 ~是啊 txt复制的 过来我看着也乱，， 下回换个方式复制

user: user-4
content: 引用 2 楼 u012328381 的回复:菜鸟一只 多谢指点啦~其实我也是想多发几个地方能多点交流 嘿嘿  下次贴代码记得用代码格式，这没缩进看着难受。

user: user-0
content: 菜鸟一只 多谢指点啦~其实我也是想多发几个地方能多点交流 嘿嘿
user-0 提问: C语言初学者编写一个控制台通讯录程序时关于信息存储的问题

回复:
user: user-1
content: 用结构体把姓名，地址，电话放在一起，再用动态指针，想输入信息就向系统申请空间，存储输入进去的信息要用到文本操作，一般要用到“a+”这个格式，可以向你建立的文本中一直存放输入的信息，不会覆盖前面的，，，

user: user-2
content: 同意楼上，对于小数据量的可以考虑Access数据库。

user: user-3
content: 可以考虑用数据库

user: user-0
content: 引用 1 楼 ylbhz 的回复:作业贴。。。 不是的好吧，要是作业我就直接求代码了

user: user-2
content: 作业贴。。。

user: user-4
content: 用sqlite数据库实现吧，了解些基本数据库操作就行了

user: user-5
content: 使用链表吧。首先判断文件是否存在，第一次启动时(文件不存在)创建文件，以后每次启动程序时都从文件中读取数据到链表，退出程序时，把链表中的数据写入(覆盖)到文件中。 具体如何操作请参考这里：(学生信息管理系统)http://www.cnblogs.com/Anker/archive/2013/05/06/3063436.html

user: user-6
content: 同推荐SQLite

user: user-7
content: 学习使用数据库以及数据库编程，可以从sqlite入手，比较适合你的小应用。
user-0 提问: Ubuntu下运行该程序出现段错误，求解释

回复:
user: user-1
content: a[i+1][j+1] = a[i][j] + a[i][j+1]; 你这程序都越界了，数组a[11][11];     用的时候要到10的

user: user-2
content: 数组越界了！ a[i+1][j+1]这个循环会越界引起地址非法访问的，也就是段错误的！
user-0 提问: 稀疏矩阵的程序求助

回复:
user: user-0
content: 引用 5 楼 user-1 的回复:27行 TMatrix *M = NULL; 改成 TMatrix *M = new TMatrix;明白了...是我又脑抽了  没有给分配空间

user: user-1
content: 27行 TMatrix *M = NULL; 改成 TMatrix *M = new TMatrix;

user: user-0
content: 引用 3 楼 user-1 的回复:意思是，试图取地址0处的数据那我程序应该怎么改才能让他正常运行呢

user: user-1
content: 意思是，试图取地址0处的数据

user: user-0
content: 表示本人菜鸟 不懂汇编  所以那个汇编指令也没有看懂

user: user-0
content: 真心求解...快压垮我的心里防线了
user-0 提问: c-free使用自己安装的mingw 报错

回复:
user: user-1
content: return 0/*或其他任何int类型的表达式*/; 不谢

user: user-0
content: 自己解决了，其实是编译环境没有设置好，主要是还混杂着c-free自己的编译环境。 我是看了http://www.programarts.com/cfree_ch/doc/help/UsingCF/CompilerSupport/MinGW/MinGW2.htm这个文章来的灵感。 我是这样设置的     这个是以前错误的设置，里面夹杂着c-free的编译环境

user: user-2
content: 汗，木有沙发了

user: user-0
content: 自己解决了，其实是编译环境没有设置好，主要是还混杂着c-free自己的编译环境。 我是看了http://www.programarts.com/cfree_ch/doc/help/UsingCF/CompilerSupport/MinGW/MinGW2.htm这个文章来的灵感。 我是这样设置的     这个是以前错误的设置，里面夹杂着c-free的编译环境
user-0 提问: 同样的程序在codeblock  cfree5.0编译结果不同，为什么？

回复:
user: user-0
content: 引用 3 楼 u012331924 的回复:用的什么编译器？ 你把这两句  typedef    struct   vertexnode    VertexNode; typedef   VertexNode   AdjList[MAXVEX];  放到结构体定义后面试试，前置声明去掉。  嗯，用codeblock 12.11编译一直报错，用cfree5.0编译就没问题，所以问一下！

user: user-0
content: 引用 2 楼 user-2 的回复:文件名  creatadjlist.c 改 creatadjlist.cpp让mingw用g++编译。  或者手工用g++编译。  好的，我试试！

user: user-1
content: 用的什么编译器？ 你把这两句  typedef    struct   vertexnode    VertexNode; typedef   VertexNode   AdjList[MAXVEX];  放到结构体定义后面试试，前置声明去掉。

user: user-2
content: 文件名  creatadjlist.c 改 creatadjlist.cpp让mingw用g++编译。  或者手工用g++编译。

user: user-0
content: 没人来，只能自顶一个了！
user-0 提问: while的一点小疑问

回复:
user: user-1
content: 有区别。。一个包括等于零，另一个不包括！

user: user-2
content: 有区别，楼上正解！

user: user-0
content: 我如此愚蠢，这是我发的？浪费大家时间，只是有那么一个计算天数的程序，理解了好久，最后转糊涂了，多谢各位

user: user-3
content: 楼上都正解~

user: user-4
content: 楼上都正解~

user: user-5
content: while(sum>=0)在sum=0的时候也能执行循环体的内容 而前者不能

user: user-6
content: sum = 0的时候，一个不进入循环，一个进入。。。
user-0 提问: 安装 ubuntn10.04版本的32位

回复:
user: user-1
content: 我怎么感觉你还是用Ghost XP比较合适

user: user-2
content: 应该是你设置的登陆口令啊

user: user-3
content: 自己的登录密码吧

user: user-4
content: 口令应该是设置的自己账户的密码吧？ 是不是有一个输入，一个确认输入？

user: user-5
content: 应该是自己设置的登陆用户名和密码吧

user: user-6
content: 提醒楼主，这是c语言板块。。。
user-0 提问: 使用list_for_each_entry_safe遍历删除结点时出现segmentation default

回复:
user: user-1
content: user_del使用错误吧 我记得应该是这样用的：list_del(&ctrl_user->list);

user: user-2
content: list_for_each_entry_safe((ctrl_user), (n), &index_tbl[i], list) {                user_del(ctrl_user); 这两个函数怎么定义的，目测是函数传参问题哦，list_for_each_entry_safe 函数内容如果申请和初始化ctrl_user指针，应该传二级指针。

user: user-0
content: 引用 2 楼 user-4 的回复:内存出错了！ 查查是不是哪里非法访问内存空间，例如 越界，可读不可改这些！ 谢谢您的回答，按照您的思路，我在list_for_each_entry的下一个对ctrl_user判空，发现，它果然为空，存在对空指针的使用，但是我 malloc+memset后，再在同样位置对ctrl_user判空，发现他还是为空，问题依然存在，不过还是谢谢您的回答，总算是知道哪里出了问题。

user: user-0
content: 引用 4 楼 dizuo 的回复:list_for_each_entry_safe((ctrl_user), (n), &index_tbl[i], list) {                user_del(ctrl_user); 这两个函数怎么定义的，目测是函数传参问题哦，list_for_each_entry_safe 函数内容如果申请和初始化ctrl_user指针，应该传二级指针。 谢谢您的回答，list_for_each_entry_safe(pos,n,head,list)是linux内核中，是一个宏，用于遍历链表来删除链表上的某个结点。这里的ctrl_user是用来暂存结点，然后进行删除的。其实，这个segmentation fault在进行单元测试打桩时遇到的，现在还没解决，我想可能是因为head指向了一段未知的内存（由于是单元测试，没有实际数据），所以就出现了段错误，不过先照着您给的建议试试去，谢谢您的回答。

user: user-3
content: 此错误一般由非法读写内存导致，例如：   指针初始化 数组越界

user: user-4
content: 内存出错了！ 查查是不是哪里非法访问内存空间，例如 越界，可读不可改这些！

user: user-0
content: 还没大神来指导指导么？自己顶一个！
user-0 提问: 求助：某司的一道笔试题（关于编译时确定哪些变量内存地址）

回复:
user: user-1
content: A，B 存储在，数据区。所以编译链接后，就确定了地址，最多延迟到程序加载的时候。（广义的编译期确定） C 函数局部变量，编译时确定，分配的相对位置，函数调用时，实际分配内存。 D 不确定，因为宏只是会做个替换而已。 E 比较含糊，想坑人还是想蒙人。 大概只有C++ 类(类型)静态变量，才用作用域限定符定义吧！！  函数中带作用域方式声明的变量 ，有谁用过？  感觉还是 A，B

user: user-2
content: 引用 5 楼 zhouchichi203 的回复:引用 3 楼 wangyaninglm 的回复:我猜ab。。。猜的我也是这么猜的，可是到底是什么呢 +1

user: user-3
content: 引用 9 楼 z542858367 的回复:引用 7 楼 zhouchichi203 的回复:引用 6 楼 z542858367 的回复:我会选AB。理由呢AB都是全局变量存放在静态存储区，在程序开始运行时就已经分配了空间，而局部变量在程序运行到声明代码时才分配空间。c选项属于自动变量，存储在动态存储区，D选项：宏，预处理在程序编译之前就不存在了，不占用内存空间，仅仅做一个替换功能。E选项，无论以何种方式申明，只要不是静态局部变量，它就属于动态存储区。

user: user-0
content: 引用 8 楼 shn521 的回复:A.声明时初始化的全局变量 B.声明时未初始化的全局变量 在静态存储区嗯，是的~

user: user-4
content: 引用 7 楼 zhouchichi203 的回复:引用 6 楼 z542858367 的回复:我会选AB。理由呢AB都是全局变量存放在静态存储区，在程序开始运行时就已经分配了空间，而局部变量在程序运行到声明代码时才分配空间。

user: user-5
content: A.声明时初始化的全局变量 B.声明时未初始化的全局变量 在静态存储区

user: user-0
content: 引用 6 楼 z542858367 的回复:我会选AB。理由呢

user: user-4
content: 我会选AB。

user: user-0
content: 引用 3 楼 wangyaninglm 的回复:我猜ab。。。猜的我也是这么猜的，可是到底是什么呢

user: user-6
content: 我猜AB。。。

user: user-7
content: 我猜ab。。。猜的

user: user-8
content: 难道是ADE

user: user-5
content: ABE吧
user-0 提问: 下面的i--着实不懂。。

回复:
user: user-0
content: 多谢各位了。。。恩，我懂了，就是多加了一，减去一得到原来值吧。谢谢啦

user: user-1
content: 引用 1 楼 user-3 的回复:a[i++]表示a数组付完值之后i加1，故每次循环一次i作为a数组的角标都会往后移一位，所以最后一次执行循环的时候，a数组的角标是多一位的，也就是数组的最后一位并未赋值，所以要i--吧……说实话程序未看懂……  ++

user: user-2
content: 楼上正解，不过程序很简单啊、。。。

user: user-3
content: a[i++]表示a数组付完值之后i加1，故每次循环一次i作为a数组的角标都会往后移一位，所以最后一次执行循环的时候，a数组的角标是多一位的，也就是数组的最后一位并未赋值，所以要i--吧……说实话程序未看懂……
user-0 提问: 解方程组

回复:
user: user-1
content: 对于这种方程，迭代法是最简单的方法。 运气好指的不是随便猜个初值就正好收敛，而是指能存在一个或多个能收敛的初值。先把方程改写成 xi4= f(xi1,xi2,xi3),根据abcmk的值分析方程是否存在稳定点,如果没有，还需改写成别的形式，然后再选初值。 当然之前还应有一步，把公共部分提出来换元

user: user-0
content: 引用 4 楼 lpcads 的回复:运气好的话，迭代法能解出来  四个未知数的迭代，是不是偶然性太大了呢。

user: user-0
content: 引用 2 楼 user-2 的回复:用数值解法吧，需要知道极值点，和单调区域 需要求导数。  用数值解法里面的哪种算法呢？  其实就是求导数比较麻烦。  所以就想问问说，有没有不求导数可以把方程给解出来的。

user: user-1
content: 运气好的话，迭代法能解出来

user: user-0
content: 用数值解法里面的哪种算法呢？  其实就是求导数比较麻烦。  所以就想问问说，有没有不求导数可以把方程给解出来的。

user: user-2
content: 用数值解法吧，需要知道极值点，和单调区域 需要求导数。
user-0 提问: 我的发问：函数返回局部指针的问题

回复:
user: user-0
content: 明白了，就是说该函数的指针变量ret是局部的，被分配在栈内存中， 而其指向的内存地址却非该函数局部的，因为是外面传递过来 O(∩_∩)O谢谢

user: user-1
content: 指针变量定义在栈上，但是指针指向的内存就不一定咯。

user: user-2
content: 引用 楼主 AILOONG 的回复: void * __cdecl memcpy (          void * dst,          const void * src,          size_t count          )  {          void * ret = dst; //ret这个指针变量是局部变量，但是指向的内容不是局部变量。         while (count--) {                  *(char *)dst = *(char *)src;                  dst = (char *)dst + 1;                  src = (char *)src + 1;          }          return(ret);  } 上面是memcpy库函数，一时间找不到其他的，暂且拿来做分析吧 指针ret是函数的局部指针，不是说不鼓励返回函数的局部指针吗？ 为何该库函数这样子写？          void * ret = dst; //ret这个指针变量是局部变量，但是指向的内容不是局部变量。

user: user-3
content: 此函数的目的从src拷贝count字节到des中去，然后返回目的buf首地址。 函数体中直接操作的是局部变量des指针，如果不用局部变量ret事先保留副本，那么执行完毕后（des不断后偏移），返回des就不是首地址了，这就错了。  这里返回地址只是一个外部已经存在的地址，所以不会出现问题。 相反，如果外部不存在，而只在局部与函数内部，那么返回出去，就麻烦大了！这才是返回指针真正要害

user: user-4
content: 你这个返回的可以说不是局部的吧！ void * ret = dst; 是传进来字符串地址的！ 返回的是传进来的参数地址的！

user: user-5
content: 不能返回的是指向栈上的对象的指针，因为该对象的生命周期在返回后结束了。 你这里指向的对象是外部传入的，这样可以把memcpy的结果当参数传给其它函数。
user-0 提问: POJ1007 为什么我的有问题 wa

回复:
user: user-0
content: 引用 4 楼 FancyMouse 的回复:char只能存到127。长度50的字符串逆序数可以上千。 3Q

user: user-1
content: char只能存到127。长度50的字符串逆序数可以上千。

user: user-0
content: 要沉.......

user: user-2
content: 看看这个博客，POJ1007的题目！有源代码

user: user-0
content: 顶一记！
user-0 提问: 为一个指针分配了空间，然后再赋值为NULL，是不是等同于没有分配空间？

回复:
user: user-0
content: 谢谢大家，我知道了。

user: user-1
content: 一楼正解呀，回答的很好

user: user-2
content: 一楼的回答很好  楼主该加强哈自己指针等基础知识

user: user-3
content: 看看指针方面的资料，体会会深些。

user: user-0
content: 是这样呀，谢谢！

user: user-4
content: >为一个指针分配了空间，然后再赋值为NULL，是不是等同于没有分配空间？  等同于内存泄露。 >如果注释掉p = NULL;，加上free(p)，依然能得到10。 说明那部分内存空间还没有被留作他用，里面暂时还是原来的值。未定义行为不保证正确但也不保证一定出错。
user-0 提问: 同一行代码 devC++正常编译运行 c-free报错

回复:
user: user-0
content: 自己解决了，其实是编译环境没有设置好，主要是还混杂着c-free自己的编译环境。 我是看了http://www.programarts.com/cfree_ch/doc/help/UsingCF/CompilerSupport/MinGW/MinGW2.htm这个文章来的灵感。 我是这样设置的     这个是以前错误的设置，里面夹杂着c-free的编译环境

user: user-1
content: 引用 9 楼 pcxys 的回复:#include <stdio.h> int main (void)  { 	int dogs; 	 	printf ("how many dogs do you have?\n"); 	scanf ("%d", &dogs); 	printf ("so you have %d dog(s) !\n", dogs); 	 	return 0; }   也是同样的代码，在devC++里面执行编译，没问题。 在c-free里面就不行，还是报错。   我的用cfree5.0可以通过呀！

user: user-2
content: 不会只有报错信息吧，拉动一下滑块，看看整个信息，应该先调用gcc，链接的时候才ld...

user: user-0
content: #include <stdio.h> int main (void)  { 	int dogs; 	 	printf ("how many dogs do you have?\n"); 	scanf ("%d", &dogs); 	printf ("so you have %d dog(s) !\n", dogs); 	 	return 0; }   也是同样的代码，在devC++里面执行编译，没问题。 在c-free里面就不行，还是报错。

user: user-0
content: #include "stdio.h" #include "conio.h"  int main(void) {     printf("Hello, world\n");     getch(); } 代码修改成这样，貌似还是不可以。

user: user-0
content: 引用 3 楼 max_min_ 的回复:[quote=引用 2 楼 pcxys 的回复:] [quote=引用 1 楼 user-6 的回复:] 楼主能写出这样的main函数，足见用了一本垃圾到家的教材啊。  我买的是经典教材，刚开始学习，教材是C Primer Plus（第五版） 这个代码是从网上当的，为了测试软件是不是可以正常的编译，结果就出来问题了。[/quote]  好点的教材main函数应该是有返回值int类型的！你再看看书，是不是哪里漏掉了的？[/quote] 这个代码是从网上当下来的，不是书里面写的。为了测试软件的。

user: user-2
content: 你上的图里，下方本框有个滑块，表示有很多信息被遮掩，认真看一下里面所有的内容...

user: user-3
content: 引用 4 楼 qq120848369 的回复:建议楼主使用VS。 DEV C++有个对学习来说的大优点：不用建工程~~ 另外VS有点不标准吧，DEV C++倒是可以在编译器选项中选择“支持所有ANSI C标准”，这时候连//都会报错，哈哈 这是在DEV C++ 5.4.2上的，国内下载不知道为什么不更新了~~

user: user-4
content: 建议楼主使用VS。

user: user-5
content: 引用 2 楼 pcxys 的回复:[quote=引用 1 楼 user-6 的回复:] 楼主能写出这样的main函数，足见用了一本垃圾到家的教材啊。  我买的是经典教材，刚开始学习，教材是C Primer Plus（第五版） 这个代码是从网上当的，为了测试软件是不是可以正常的编译，结果就出来问题了。[/quote]  好点的教材main函数应该是有返回值int类型的！你再看看书，是不是哪里漏掉了的？

user: user-0
content: 引用 1 楼 user-6 的回复:楼主能写出这样的main函数，足见用了一本垃圾到家的教材啊。  我买的是经典教材，刚开始学习，教材是C Primer Plus（第五版） 这个代码是从网上当的，为了测试软件是不是可以正常的编译，结果就出来问题了。

user: user-6
content: 楼主能写出这样的main函数，足见用了一本垃圾到家的教材啊。
user-0 提问: 新手做题，求点拨。

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  typedef struct person{ 	int id; 	struct person * next; }Person;   int main(){ 	Person * head=NULL,* tail=NULL; 	Person * p; 	int pcount;//队列人数 	int i,j; 	int flag;//入队方向标志 	int rid; 	 	printf("输入人数："); 	scanf("%d",&pcount); 	printf("入队方式：\n"); 	/*读取入队*/ 	for(i=0;i<pcount;i++){ 		scanf("%d",&flag); 		 		p=(Person *)malloc(sizeof(Person));//动态分配 		p->id=i+1; 		p->next=NULL; 		 		if(head==NULL){ 			head=p; 			tail=p; 		}		 		else{ 			switch(flag){ 				 				case 1: 					tail->next=p; 					tail=tail->next; 					break; 				 				case 0: 					p->next=head; 					head=p; 					break; 				default: 					//非法输入处理 					break;			 			} 		}				 	} 	printf("结果\n"); 	/*打印结果*/ 	for(j=1;j<=pcount;j++){ 		//查找id,打印next 		rid=getNextId(head,j); 		printf("%d\n",rid); 	}  }  /*在队列中查找，返回后边人的id*/ int getNextId(Person * head,int id){ 	Person * p; 	p=head; 	do{ 		if(id==p->id){ 			if(p->next==NULL)return -1; 			return p->next->id;  //? 		} 		p=p->next; 	}while(p!=NULL); }

user: user-2
content: 搜“种子填充算法”

user: user-0
content: 跟那个不一样啊

user: user-0
content: 数据结构与算法实验题 简单的走迷宫 实验任务 NC 一天要去走一个迷宫，迷宫是由一个 R*C 的网格表示。迷宫只有一个出口和一个入 口，这个大家都知道。迷宫的出口在第一行，出口在最底行。他想知道走出迷宫的最短时间。 这是一个很简单的问题，至于你信不信，反正我是信了。 数据输入 输入第一行包括四个正整数 R，C，ENT,EXIT（2<=R<=200，2<=C<=200），表示 R 行,C 列,入口在第 ENT 列,出口在 EXIT 列。接下 2*R-1 行，第 2*i 行有 C-1 个数，第 j 个数表示 网格 g[i][j]与 g[i][j+1]之间有墙壁。第 2*i+1 行有 C 个数，第 j 个数表示网格 g[i][j] 和 g[i+1][j]之间有墙壁。‘0＇表示没有墙壁，‘1’表示两个位置之间有墙壁。 数据输出 如有有路径走出，则输出最短的步数，否则输出“No Way”(引号去掉)。 输入示例 输出示例 3 4 2 3 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 5   上一题一完成，能不能帮忙看下这题。

user: user-0
content: 对哦，双向链表好像比较简单。我们现在在教队列，我一直都想着用队列解决。

user: user-0
content: 如果用队列，创建两个队列，如果是1直接入第一个队列，如果是0就把第一个队列读出到第二个队列，然后把数读入第一个队列，再把第二个队列的重新读入第一个。我想到这样，不知这个想法对不对。

user: user-3
content: 双向链表也很方便，表头表尾两个节点，表示头尾指针。

user: user-3
content: 这是双端队列 队头队尾，都可以插入 搞个数组，和头尾两个指针（游标）就可以了

user: user-4
content: 做个for循环，假定是m,代表第m个新生，读取i[m-1]的值。如果是1那么n[m-1]位置放入编号，如果是0那么从n[m-2]开始到n[0]每个数据后退一格，退完后在n[0]位置放入编号m,直到全部完成。 从n[0]开始打印到n[N-1],最后打印下-1；

user: user-5
content: 楼主顺便帮俺看看！ http://bbs.csdn.net/topics/390606094

user: user-5
content: 同为新人帮忙顶！！！大牛们可能去旅游去啦，只有我们这种未来苦逼的程序猿才看数据结构！（楼主别忘了给分^_^）

user: user-0
content: 没人吗，求回复。
user-0 提问: devC++想使用自己安装的mingw，报错

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:所有目录、程序相关的设置都可能要一个个手工改。 我自己刚才搞了一下，跟你说的一样，感谢你的回复！

user: user-0
content: 我自己解决了，需要把所有的devC++的内置mingw版本的地方都换成自己安装的那个地方的路径。

user: user-1
content: 所有目录、程序相关的设置都可能要一个个手工改。
user-0 提问: 关于搜索的问题

回复:
user: user-0
content: #include <iostream> #include <queue> #include <cstdio> #include <string.h> using namespace std; char s[1010][1010]; int map[1010][1010]; //int go[1002][2]; int move[4][2]= {{1,0},{-1,0},{0,-1},{0,1}}; int c,r; int xx,yy,sum; bool inmap(int x,int y) {     if (x>=0 && x<=c && y>=0 && y<=r)         return true;     return false; } void bfs(int x,int y,int step,int c) {     //map[x][y]=c;     if (sum<step)     {         sum=step;         xx=x;         yy=y;     }     for (int i=0; i<4; i++)     {         int x1,y1;         x1=x+move[i][0];         y1=y+move[i][1];         if (inmap(x1,y1) && map[x1][y1]!=c && s[x1][y1]=='.')         {             map[x1][y1]=c;             bfs(x1,y1,step+1,c);             //map[x1][y1]=0;         }     }    return; } int main() {     int t;     scanf("%d",&t);     while (t>0)     {         int f=0;         sum=0;         t--;         scanf("%d%d",&c,&r);         memset(map,0,sizeof(map));         // int k=0;         for (int i=0; i<r; i++)             scanf("%s",s[i]);         for (int i=0; i<r; i++)         {             for (int j=0; j<c; j++)             {                 if (s[i][j]=='.' && map[i][j]==0)                 {                     map[i][j]=1;                     f=1;                     bfs(i,j,0,1);                     i=r+1;                      break;                 }             }         }         if (f){             map[xx][yy]=2;         bfs(xx,yy,0,2);         printf("Maximum rope length is %d.\n",sum);         }         else         printf("Maximum rope length is 0.\n");         //printf("Maximum rope length is %d.\n",ans);     }     return 0; } 我的程序哪里错了，求大神解释。。。。

user: user-0
content: 理解了

user: user-1
content: 引用 4 楼 u012246881 的回复:从任意点开始搜索最长路径不是要把每一个点都搜过嘛，那不是就把最长路径搜出来了吗？ 那样你的复杂度就是平方。每个点都要线性的扫一遍整个棋盘。现在棋盘大小是1k*1k=1m，你觉得平方算法能行？

user: user-1
content: ... .## .##  比如这个例子。你如果从左上角开始搜，你是搜不出长4的路径的。

user: user-1
content: 因为它用了一个结论，你从任意点开始，所达到的最远点，必定可以从那个点开始延伸出一个全局最长路径。 只做一次的话，你从哪个点开始？初始点没选好的话，你只能做出从那个点开始的最长路径，而不是所有路径里的最长。

user: user-0
content: 从任意点开始搜索最长路径不是要把每一个点都搜过嘛，那不是就把最长路径搜出来了吗？
user-0 提问: 我想用C写一个常用的数据结构操作库，有多少人觉得有必要么？

回复:
user: user-1
content: 建议帖主先通读STL源代码。

user: user-2
content: 非常有必要啊

user: user-3
content: 有必要，练就一身过硬的好本领！

user: user-4
content: 我自己写过栈 队列  树 之类的 感觉有收获。

user: user-5
content: 如果各方面都能比现在的主流编译器（gcc, clang, vc++）附带的stl强，我保证会有很多人用 这包括稳定性，运行期效率，可复用性及灵活度 稳定性是基本要求，最难的是如何同时兼顾运行期效率 可复用性及灵活度  首先c在resource management上总是需要用到goto 不使用goto程式反而很难维护   stack_int *intStack = generate_stack_int(); //...... freeResource :     release_int_stack(intStack);     //.....   第二个问题，你要用void*还是macro实现你的资料结构？ 用void*先天上执行速度就较慢 而且一直cast来cast去的，这api也太难用了，不是type safe的，不安全也不方便  假设你使用macro产生stack_int, stack_double, stack_long等type 如果有一天我需要的是stack_image, stack_human, stack_bmp呢？ 难道要我自行用你提供的macro产生stack_image,stack_human, stack_bmp吗？ 这样一来的话不是很容易发生name collision,甚至是重复的代码吗？  而且使用macro还有一个问题，就是所有我不需要的api都会被编译成binary codes 这间接加剧了code bloat的问题，你要如何让这些资料结构和stl一样 跟template一样只把我需要用到的api编译成binary codes?  用c实现通用的data structures,问题还远不只是这些 不过最难的问题我想还是出在两个地方 第一 ： 没有destructor == 不支援RAII 第二 ： 没有template == 不支援generic programming 顶多只能用macro辅以一堆人类很难理解的奇技淫巧来模拟template的功能 这点跟c++本来就不支援metaprogramming，结果我们只能用一堆奇技淫巧来实现的道理一样

user: user-6
content: 这个看人的。。。有的人领的工资很高，有的干了那么久工资还是4000上下！

user: user-7
content: 如果是要学习数据数据结构的话，自己写会收获很大的，如果是要在工作中用的话，我觉得有些库还是比较好的。。。

user: user-0
content: OK，不写了，不是为了练手~

user: user-8
content: 自己的代码库通常只有自己愿意用，别人是没心思看的。  这种开源库你去看glib，或者更多的去oschina里翻一翻外国的C/C++开源项目，它们实现的肯定是很优秀的，很多你不了解的东西。  如果是工作用途或者开源项目，可以考虑C++算法和容器，保证可靠和简单。

user: user-9
content: 对自己很必要：实践出真知  对别人也很重要：能力的提高可以带动一批人提高，东西写得好作用更大。

user: user-10
content: lz 有想法

user: user-11
content: C 基本写不了，因为C没有模板，很难做到通用数据结构。 不过你可以每种都实现一个。 写一个实现，然后用宏定义来处理每种类型

user: user-12
content: 对自己很必要，提升技能与加深理解；对别人没有必要，有开源的代码！如果你数据结构学的不好，也是一个很好锻炼！如果已经相当棒了，那就别浪费那个时间了

user: user-13
content: 好像已经有了好的开源算法项目了吧
user-0 提问: 写一个小小的学生信息管理系统，帮忙看错在哪里？

回复:
user: user-1
content: 在函数Create_List中要增加以下语句：  A.length=n;

user: user-2
content: #include <stdio.h> #include <malloc.h> #define MaxSize 50   typedef struct {     char No[5];     char name[10];     float score;     int age; } Student; typedef struct {     Student data[MaxSize];     int length; } SqList;   void Create_List(SqList &); int Empty_List(SqList L); int Delete_List(SqList *L,int i); void Print_List(SqList L);   int main() {     SqList L;     Create_List(L);     Print_List(L); 	     return 0; }   void Create_List(SqList &A) {     //L=(SqList *)malloc(sizeof(SqList));         int n=0;     printf("请输入要创建的学生个数：\n");     scanf("%d",&n); 	A.length=n;     printf("请依次输入学生的年龄，姓名，学号，分数:\n");     for(int i=0;i<n;i++)     {         scanf("%d%s%s%f",&A.data[i].age,A.data[i].name,A.data[i].No,&A.data[i].score);     } }   int Insert_List(SqList *L,Student &e,int i) {     Student *p,*q;     if(i<1||i>L->length+1)         return 0;     q=&L->data[i-1];     for(p=&L->data[L->length-1];p>=q;--p)         *(p+1)=*p;     *q=e;     ++L->length;     return 1; }   int Delete_List(SqList *L,int i) {     if(Empty_List(*L)==1)     {         return 0;     }     for(int j=i-1;j<=L->length-2;j++)         L->data[j]=L->data[j+1];     return 1; }   int Empty_List(SqList L) {     if(L.length==0)         return 1;     else         return 0; }   void Print_List(SqList L) {     int j=0;     printf("年龄      姓名    学号    分数\n");     for(j=0;j<=L.length-1;j++)     {         printf("%d  %s  %s  %f\n",L.data[j].age,L.data[j].name,L.data[j].No,L.data[j].score);           }   }

user: user-0
content: 错误描述：当输入学生信息时候。输出函数没有输出学生成绩！
user-0 提问: 最小生成树prime算法输出错误，求教！

回复:
user: user-1
content: CreatGraph(Graph  G):      /**< 矩阵初始化 */     for(i=0;i<G->numvertex;i++)     {         for(j=0;j<G->numedge;j++)         {             G->edge[i][j] = INFINITY;         }     }  [/code] void  PrintGraph(Graph  G) {     int  i,j;      for(i=0;i<G->numvertex;i++)     {         for(j=0;j<G->numedge;j++)         {             if(G->edge[i][j] == INFINITY)                 printf("\t**");             else                 printf("\t%d",G->edge[i][j]);         }         printf("\n");     } } [/code] 这是函数CreatGraph、PrintGraph，两者的内循环j的上界有问题吧 应该是顶点个数，即G->numvertex，而你却写成了边数，即G->numedge

user: user-1
content: 引用 6 楼 lelieven 的回复:[quote=引用 5 楼 user-3 的回复:]       /**< 初始化辅助数组 */       for(i=1;i<G->numvertex;i++)       {           lowcost[i] = 0;           adjvertex[i] = 0;       }  你一开始所有的点距离已经是0了，那求出来的距离和当然是0。  原来如此，非常感谢！[/quote] 是的，昨晚回去看了看，辅助数组的初始化有问题

user: user-0
content: 引用 5 楼 user-3 的回复:/**< 初始化辅助数组 */       for(i=1;i<G->numvertex;i++)       {           lowcost[i] = 0;           adjvertex[i] = 0;       }  你一开始所有的点距离已经是0了，那求出来的距离和当然是0。  原来如此，非常感谢！

user: user-0
content: 引用 10 楼 u011636587 的回复:引用 2 楼 lelieven 的回复:[quote=引用 1 楼 u011636587 的回复:] 额，沙发？？？  好孩子呀！ 汗，第一次用错了，谢谢夸奖，额  ，我就一小白，在各个板块混经验，请多多指教[/quote]  我也是小白！

user: user-2
content: 引用 2 楼 lelieven 的回复:引用 1 楼 u011636587 的回复:额，沙发？？？  好孩子呀！ 汗，第一次用错了，谢谢夸奖，额  ，我就一小白，在各个板块混经验，请多多指教

user: user-2
content: 引用 1 楼 u011636587 的回复:额，沙发？？？ 谢谢夸奖，额  ，我就一小白，在各个板块混经验，请多多指教。

user: user-3
content: /**< 初始化辅助数组 */       for(i=1;i<G->numvertex;i++)       {           lowcost[i] = 0;           adjvertex[i] = 0;       }  你一开始所有的点距离已经是0了，那求出来的距离和当然是0。

user: user-0
content: 引用 3 楼 AILOONG 的回复:main函数中的 G=malloc(sizeof(struct graph)); 最好改成 G=(Graph)malloc(sizeof(struct graph)); malloc返回的是void *类型，而G是struct graph *类型 至于你说的主要问题，稍后答复  好的！谢谢！

user: user-1
content: main函数中的 G=malloc(sizeof(struct graph)); 最好改成 G=(Graph)malloc(sizeof(struct graph)); malloc返回的是void *类型，而G是struct graph *类型 至于你说的主要问题，稍后答复

user: user-0
content: 引用 1 楼 u011636587 的回复:额，沙发？？？  好孩子呀！

user: user-2
content: 额，沙发？？？
user-0 提问: Turbo C下编程设置屏幕分辨率为1024*768,24位模式，BMP图片显示有问题

回复:
user: user-1
content: 你是华科自动化的吗？

user: user-2
content: pokeb(0xa0000000,position%65536L,write); /*写到显存位置*/ 改成pokeb(0xa0000000+(position /65536L) *(2048)* 16*16*16 ,position%65536L,write);

user: user-2
content: pokeb(0xa0000000,position%65536L,write); /*写到显存位置*/ 这个会不会有问题 当数据超过65536L应该，修改段的位置，不应该换页吧 64k/16 = 2k     每16字节对应一个段偏移 每增加 64k 段地址增加64k/16 = 2k   段地址是 0xa000 + (position /65536L) *(65536L /16)

user: user-0
content: @lm_whales 谢谢你的回答，还是不可以。我觉得会不会是Dosbox虚拟的DOS环境，显存不够，因为1024*768,24位的需要4M显存。用1024*768,256色的可以成功读出Bmp图。

user: user-3
content: 这个学了有实际意义么。

user: user-0
content: 实际显示

user: user-0
user-0 提问: 求一c语言算法，伪代码也行。

回复:
user: user-1
content: 用堆排序吧，建立最大或者最小堆，把每个单词加进去，如果存在的话就直接把他的计数器++，最后排序下就可以先序输出了

user: user-2
content: 可以用二叉排序树

user: user-3
content: 额，好深奥的感觉
user-0 提问: vc++出现 必需的文件确实，需要重新安装怎么办...

回复:
user: user-1
content: http://zhidao.baidu.com/link?url=LI6gKPC30tiEJpB6Zi-QxnVViHHLLuAtzQL-xOl5yd4R0Wqj5PBmZdc2mLVj173WGjxkaGuDrO8-72YSgsvVQ_

user: user-2
content: 是不是之前卸载过什么软件,再重新装上,也许就能够解决,之前我就是这样解决了一个类似的问题

user: user-3
content: 把杀毒的等，其他软件关掉。。。

user: user-0
content: 重启重装 都试过了....重转都没用 这是比我重转系统额....

user: user-4
content: 重启试试，不行的话就重装吧！

user: user-5
content: 重装吧,要不换个版本

user: user-6
content: EECXX.DLL 你重新安装试试吧。
user-0 提问: linux c下，在终端下画了个文本框，如何控制输入时在碰到边框时自动换行？

回复:
user: user-1
content: 引用 7 楼 liuhongwei110 的回复:[quote=引用 5 楼 liuchao35758600 的回复:] 边框的宽度和当前行输入的字符数，这两个是已知的； 那么，判断光标的位置，或者判断当前输入的字符在文本框里的位置，超出边框后换行。 在键盘输入的过程中也能换行？怎么实现？我的意思是一次大量输入，按回车就结束输入了。如果每次少输入一点倒是可以换行，但这样交互性不好。[/quote] 设置终端为无回显无缓冲模式，就能直接响应每个按键，不用等按了回车后才能获取到输入的内容， 由于设置了无回显模式，你按了键后，终端上不会显示相应字符，这样，就不用担心控制终端上显示的内容被打乱。 你可以通过使用转义序列来控制光标位置，程序输出的字符就会从光标处开始打印出来。  或者，和楼上的说的一样，用ncurses函数库来实现。

user: user-2
content: 使用ncurses库

user: user-0
content: 引用 5 楼 liuchao35758600 的回复:边框的宽度和当前行输入的字符数，这两个是已知的； 那么，判断光标的位置，或者判断当前输入的字符在文本框里的位置，超出边框后换行。 在键盘输入的过程中也能换行？怎么实现？我的意思是一次大量输入，按回车就结束输入了。如果每次少输入一点倒是可以换行，但这样交互性不好。

user: user-3
content: 引用 5 楼 liuchao35758600 的回复:边框的宽度和当前行输入的字符数，这两个是已知的； 那么，判断光标的位置，或者判断当前输入的字符在文本框里的位置，超出边框后换行。 ++

user: user-1
content: 边框的宽度和当前行输入的字符数，这两个是已知的； 那么，判断光标的位置，或者判断当前输入的字符在文本框里的位置，超出边框后换行。

user: user-4
content: 你先把代码搞出来，让人看看。。。

user: user-5
content: 学生来学习。

user: user-0
content: curses库不怎么熟悉，求深入，最好举个例子？

user: user-6
content: 屏幕捕捉 curses库？
user-0 提问: 关于Borland c++

回复:
user: user-1
content: google,看看别人如何写

user: user-2
content: 现在还有人要用c、c++做点菜系统？

user: user-3
content: 使用cpp合适吗？

user: user-0
content: 我怎么导入总菜单啊，可以显示汉字么……

user: user-4
content: 简单的，就是一个字符指针数组，或者二维数组 然后如果菜式少，一个选项，如果比较多，分类一下 根据客户选择，显示菜单页面 根据选择，输出选中的菜名，也可以选好后输入确定，显示所有菜名。 复杂点自己在琢磨琢磨即可。  如果采用窗口界面，或者图形界面，Bc ++也有相应的函数。
user-0 提问: 熟练掌握C、汇编

回复:
user: user-1
content: 引用 3 楼 jingyexiaoyue 的回复:[quote=引用 楼主 return_heiniu 的回复:] 对操作系统算法设计数据结构有一定的理解可以哪方面的工作 当你说这个的时候，我是不是可以理解为你还是不熟练，因为你要是熟练的话，你是不会不知道干什么的！ 要是迷惘就去看看招聘的要求的[/quote]  要是迷惘就去看看招聘的要求的 ++

user: user-2
content: 引用 楼主 return_heiniu 的回复:对操作系统算法设计数据结构有一定的理解可以哪方面的工作 当你说这个的时候，我是不是可以理解为你还是不熟练，因为你要是熟练的话，你是不会不知道干什么的！ 要是迷惘就去看看招聘的要求的

user: user-3
content: 看到底有多“熟练”，“理解”到了什么程度

user: user-4
content: 理论上 啥 工作都可以吧。 要具体到哪个行业，就得看编程语言以外的技术了， 比如图像处理， 网络通信， 或者现在流行的大数据等等。