这是我的程序与模板的代码片段。它没有错误,但是当我打印时,它会产生错误的结果。请告诉我哪里错了,我该如何解决这个问题。以下是具有三个函数的C ++代码和一个带有模板T的主函数。
#include<iostream>
using namespace std;
template<typename T>
void input(T* &start, int size){
start = new T[size];
T* beyond = &start[size];
while(start != beyond){
cout<<"\nEnter: ";
cin>>*start;
start++;
}
}
template<typename T>
void sort(T* start, int size){
T hold;
for(int j=0; j<size-1; j++){
for(int i=0; i<size-1; i++){
if(start[i]>start[i+1]){
hold=start[i];
start[i]=start[i+1];
start[i+1]=hold;
}
}
}
}
template<typename T>
void display(T* start, int size){
T* beyond = &start[size];
cout<<"\nAfter Sorting: "<<endl;
while(start != beyond){
cout<<*start<<"\t";
start++;
}
}
int main(){
int* x=NULL;
float* y=NULL;
char* z=NULL;
int size;
cout<<"Enter the number of elements: ";
cin>>size;
cout<<"\nEnter integer values:";
input<int>(x, size);
sort<int>(x, size);
display<int>(x, size);
/**
cout<<"\nEnter floating values:";
input<float, int>(y, size);
sort<float, int>(y, size);
display<float, int>(y, size);
cout<<"\nEnter character values:";
input<char, int>(z, size);
sort<char, int>(z, size);
display<char, int>(z, size);
*/
system("pause");
}
答案 0 :(得分:0)
你可以这样做:
template<typename T>
void input(T* &start, int size){
start = new T[size];
//T* beyond = &start[size-1];
//while(start <= beyond){
for(int i=0;i<size;i++){
cout<<"\nEnter: ";
cin>>start[i];
//start++;
}
//}
}
和
template<typename T>
void display(T* start, int size){
//T* beyond = &start[size-1];
cout<<"\nAfter Sorting: "<<endl;
for(int i=0;i<size;i++){
cout<<start[i]<<"\t";
}
}
这是一个更简单的形式来做你想做的事情并且有效。
答案 1 :(得分:0)
在input
功能中,您可以分配内存并将其存入start
。然后将该指针移动到结尾,该结束值将返回给调用函数。然后你尝试使用它作为其他方法的开始,这将导致未定义的行为。
template<typename T>
void input(T* &start, int size){
start = new T[size]; // points to the start
T* beyond = &start[size];
while(start != beyond){
cout<<"\nEnter: ";
cin>>*start;
start++; // Moving all the time...
}
// In the end start points to beyond and main gets that as a result
}
如果您真的想玩指针,可以轻松修复:
template<typename T>
void input(T* &start, int size){
start = new T[size];
T* beyond = &start[size];
T* curr = start;
while(curr != beyond){
cout<<"\nEnter: ";
cin>>*curr;
curr++;
}
}
这样start
指针始终指向开头,并正确返回到调用函数。
在调试器中逐步运行会轻松显示此问题。另外,请始终描述问题,我们不知道&#34;产生错误的结果&#34;意味着,如果你没有解释什么是正确的结果,或者你得到了什么,而不是某些输入。