user-0 提问: 没分了，分给得少！！！！请教排序函数sort_arr为何调用后无效果

回复:
user: user-0
content: 惭愧，感谢3楼，我还以为是地址发送失败，特地在排序函数中调用输出函数。

user: user-1
content: 外层for循环多了个分号，编译器竟然都没检测出来，看了我近两个小时，楼主把分号去掉就行了

user: user-0
content: 你那个范围有点错误，是pArr.cnt而不是pArr.cnt-1,下面的也一样，改一下就可以 我是这样写的啊，没有写pArr.cnt-1，因为复制得比较急没注意格式，VC上缩进了的 int i, j, t;  	for (i = 0; i <pArr->cnt; ++i); 	{ 		for(j = i+1; j <pArr->cnt; ++j) 		{ 			if (pArr->pBase[i] > pArr->pBase[j]) 			{ 				t = pArr->pBase[i]; 				pArr->pBase[i] = pArr->pBase[j]; 				pArr->pBase[j] = t;//排序 			} 		 		} 	 	} 我看你引用了其他函数，我目前还没学，暂时不考虑那样实现，因为我是自学所以没有老师，麻烦你看下我的排序是不是有问题，谢谢啦

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

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

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

user: user-4
content: 楼主，帮你调试了一下确实是排序的问题，你那个范围有点错误，是pArr.cnt而不是pArr.cnt-1,下面的也一样，改一下就可以 还有楼主写程序的时候注意缩进，哈哈！ #include <stdio.h>//标准函数的头文件 #include <malloc.h>//使用malloc动态分配函数的头文件 #include<stdlib.h>//exit函数头文件 #include<iostream> using namespace std; #include <algorithm> //这是算法的头文件，可以用sort函数，可以百度一下 //定义数据类型struct Arr struct Arr { 	int * pBase;//存储的是数组第一个元素的地址 	int len;//数组最多所能容纳的的元素的个数 	int cnt;//当前数组有效元素的个数 }; void init_arr(struct Arr *pArr, int length);//函数声明，初始化函数。 bool append_arr(struct Arr *pArr, int val);//追加，bool函数表示返回的值为false(真)(1)或者true(假)(0) bool insert_arr(struct Arr *pArr, int pos, int val);//pos的值从1开始,函数功能为在第pos个元素前插入val bool delete_arr(struct Arr *pArr, int pos, int *pVal);//pos表示第几个元素个数，val表示要删除元素的值，pVal表示Val的地址 int get(); bool iss_empty(struct Arr * pArr);//判断数组是否有有效的元素 bool is_full(struct Arr * pArr);//判断数组是否满(即有效元素个数是否等于数组长度) //void sort_arr(struct Arr *pArr);//排序 void show_arr(struct Arr * pArr);//输出数组的所有元素 void inversion_arr(struct Arr *pArr);//函数声明，倒置 bool cmp(int a, int b) { 	if (a < b)  return true; 	else return false; }   //////////////////////////////////////////////////////主函数   int main(void) { 	struct Arr arr;//定义	struct Arr型变量arr 	int val;  	init_arr(&arr, 7);//调用函数	init_arr并发送arr的地址，和长度 	show_arr(&arr);//输出 	append_arr(&arr, 1);//追加 	append_arr(&arr, 2);//追加 	append_arr(&arr, 77);//追加 	append_arr(&arr, 4);//追加 	append_arr(&arr, 66);//追加 	append_arr(&arr, 6);//追加 	delete_arr(&arr, 3, &val);//3表示删除第3个元素  	/*if (append_arr(&arr,7)) 	{ 	printf("追加成功!\n"); 	} 	else 	{ 	printf("追加失败!\n"); 	}*/ //判断是否最近成功 	//insert_arr(&arr, 6, 55); 	inversion_arr(&arr);//倒置元素 	sort(arr.pBase, (arr.pBase) + arr.cnt, cmp); 	//sort_arr(&arr);//排序 	show_arr(&arr);//输出 	system("pause"); 	return 0; }  //////////////////////////////////////////////////主函数   void init_arr(struct Arr *pArr, int length)//定义函数，且接收类型为struct Arr *型和int型 { 	pArr->pBase = (int *)malloc(sizeof(int) * length);//分配动态内存，变量pArr得以跨函数使用 	if (NULL == pArr->pBase)//如果pBase为空则内存分配失败 	{ 		printf("动态内存分配失败!\n"); 		exit(-1);//终止整个程序 	} 	else 	{ 		pArr->len = length;//长度为length 		pArr->cnt = 0;//有效元素个数为0 	} 	return; 	//(*pArr).len = 99;//PArr指针变量所指向的结构体变量pBase这个成员 }  bool iss_empty(struct Arr *pArr) { 	if (0 == pArr->cnt)//有效元素个数为0 		return true; 	else 		return false; }  bool is_full(struct Arr * pArr) { 	if (pArr->cnt == pArr->len) 		return true; 	else 		return false; }  void show_arr(struct Arr * pArr) { 	if (iss_empty(pArr))//调用函数is_empty 	{ 		printf("数组为空!\n"); 	} 	else 	{ 		for (int i = 0; i<pArr->cnt; ++i)//输出有效个数以内的值 			printf("%d ", pArr->pBase[i]); 		printf("\n"); 	} } bool append_arr(struct Arr *pArr, int val) { 	if (is_full(pArr))//满是返回false错误 		return false;  	//不满时追加 	pArr->pBase[pArr->cnt] = val; 	(pArr->cnt)++; 	return true; } bool insert_arr(struct Arr *pArr, int pos, int val) { 	int i; 	if (is_full(pArr))//如果数组满了，则不插入值 		return false; 	if (pos<1 || pos> pArr->cnt + 1)//如果pos（表示元素的位置）为负或者pos的值大于有效个数的值加一 		return false; 	for (i = pArr->cnt - 1; i >= pos - 1; --i)   //通过将前一个数的值赋给另一个数再给需要插入的位置的数赋值 	{	// 		pArr->pBase[i + 1] = pArr->pBase[i];// 	}	// 	pArr->pBase[pos - 1] = val; 	pArr->cnt++;//元素插入成功后增加有效元素个数，在show_arr函数中定义了只能输出有效元素个数以内的值 	return true; } bool delete_arr(struct Arr *pArr, int pos, int *pVal) { 	int i; 	if (iss_empty(pArr))//数组有效元素个数为0返回false 		return false; 	if (pos<1 || pos>pArr->cnt)//pos表示要删除的第pos个元素 		return false;// 	*pVal = pArr->pBase[pos - 1];//这里相当于把要删除的值赋给*pVal相当于主函数的val，然后下面从3后面开始向前移以为，虽然val值还在但是val被排在了末尾且有效个数减一，故val不会输出 	for (i = pos; i<pArr->cnt; ++i) 	{ 		pArr->pBase[i - 1] = pArr->pBase[i]; 	} 	pArr->cnt--; 	return true; } void inversion_arr(struct Arr *pArr) { 	int i = 0; 	int j = pArr->cnt - 1;//j为有效元素个数减一 	int t;  	while (i < j) 	{ 		t = pArr->pBase[i];//将第一个元素的值赋给t 		pArr->pBase[i] = pArr->pBase[j];//将第j个元素赋值给第一个元素 		pArr->pBase[j] = t;//将t的值赋给第j个元素 		++i;//i加j减 达到倒置元素的目的 		--j; 	} 	return; }  /*void sort_arr(struct Arr *pArr) { int i, j, t;  for (i = 0; i < pArr->cnt; ++i); { for(j = i+1; j < pArr->cnt; ++j) { if (pArr->pBase [i] > pArr->pBase [j]) { t = pArr->pBase [i]; pArr->pBase [i] = pArr->pBase [j]; pArr->pBase [j] = t;//a[0]分别于其他四位比保留最小数为a[0],第二轮保留最小为a[2] }  }  } printf("排序完成!\n");  }*/ /*void sort_arr(struct Arr *pArr) { int i, j, t;  for (i = 0; i < pArr->cnt -1; ++i); { for(j = 0; j < pArr->cnt -1-i; ++j) { if(pArr->pBase [j] > pArr->pBase [j+1]) { t = pArr->pBase [j]; pArr->pBase [j] = pArr->pBase [j+1]; pArr->pBase [j+1] = t;//冒泡排序 }  }  } printf("排序完成!\n");  }*/