我在fedora linux 13上使用g ++。 我只是从我的c ++教科书中练习一些练习 并且不能让这一个程序编译。这是代码:
double *MovieData::calcMed() {
double medianValue;
double *medValPtr = &medianValue;
*medValPtr = (sortArray[numStudents-1] / 2);
return medValPtr;
}
这是类声明:
class MovieData
{
private:
int *students; // students points to int, will be dynamically allocated an array of integers.
int **sortArray; // A pointer that is pointing to an array of pointers.
double average; // Average movies seen by students.
double *median; // Median value of movies seen by students.
int *mode; // Mode value, or most frequent number of movies seen by students.
int numStudents; // Number of students in sample.
int totalMovies; // Total number of movies seen by all students in the sample.
double calcAvg(); // Method which calculates the average number of movies seen.
double *calcMed(); // Method that calculates the mean value of data.
int *calcMode(); // Method that calculates the mode of the data.
int calcTotalMovies(); // Method that calculates the total amount of movies seen.
void selectSort(); // Sort the Data using selection sort algorithm.
public:
MovieData(int num, int movies[]); // constructor
~MovieData(); // destructor
double getAvg() { return average; } // returns the average
double *getMed() { return median; } // returns the mean
int *getMode() { return mode; } // returns the mode
int getNumStudents() { return numStudents; } // returns the number of students in sample
};
这是我的构造函数和析构函数以及selectSort():
MovieData::MovieData(int num, int movies[]) {
numStudents = num;
// Now I will allocate memory for student and sortArray:
if(num > 0) {
students = new int[num];
sortArray = new int*[num];
// The arrays will now be initialized:
for(int index = 0;index < numStudents;index++) {
students[index] = movies[index];
sortArray[index] = &students[index];
}
selectSort(); // sort the elements of sortArray[] that point to the elements of students.
totalMovies = calcTotalMovies();
average = calcAvg();
median = calcMed();
mode = calcMode();
}
}
// Destructor:
// Delete the memory allocated in the constructor.
MovieData::~MovieData() {
if(numStudents > 0) {
delete [] students;
students = 0;
delete [] sortArray;
sortArray = 0;
}
}
// selectSort()
// performs selection sort algorithm on sortArray[],
// an array of pointers. Sorted on the values its
// elements point to.
void MovieData::selectSort() {
int scan, minIndex;
int *minElement;
for(scan = 0;scan < (numStudents - 1);scan++) {
minIndex = scan;
minElement = sortArray[scan];
for(int index = 0;index < numStudents;index++) {
if(*(sortArray[index]) < *minElement) {
minElement = sortArray[index];
minIndex = index;
}
}
sortArray[minIndex] = sortArray[scan];
sortArray[scan] = minElement;
}
}
编译器发出此错误:
moviedata.cpp:在memberfunction中 'double * MovieData :: calcMed()':
moviedata.cpp:82:错误:无效 类型'int *'和'double'的操作数 二进制'operator /'
我不知道该怎么做这个错误,我已经尝试过静态转换类型而没有运气,这个错误信息是什么意思?
答案 0 :(得分:3)
你试图将指针除以double,编译器说它不知道怎么回事。
sortArray可能由
定义int ** sortArray;
还值得注意的是,你正在返回一个指向堆栈变量的指针,一旦你退出函数,它的值就会被定义。
答案 1 :(得分:2)
sortArray[numStudents - 1]
是指向int的指针,它不能位于除法的左侧(当你记住指针是地址时,这是有意义的)。如果您发布更多代码,我们可以帮助您更正。
也许你想要这样的东西:
int *MovieData::calcMed() {
return sortArray[(numStudents - 1) / 2];
}
这将返回数组中的中间元素,该元素应该是指向中间学生的指针。我不清楚你为什么要排序指针列表(不是实际值),或者为什么你在这里返回一个指针。返回值+ 1将是指向students
中下一个值的指针,它不数字上的下一个更大值。所以你也可以返回实际的学生(来自students
的int)。如果这样做,您还可以在计数为偶数时平均两个中间元素(此规则是典型中值算法的一部分)。
请注意,我将返回类型更改为int *
,即sortArray元素的类型。此外,您的评论不正确。这是中位数,而不是意思。
此外,您的选择排序错误。内循环应从scan + 1
开始。
答案 2 :(得分:2)
您的代码显示对指针缺乏了解。你需要在更简单的例子上做更多的阅读和练习。
更具体地说:
double medianValue;
创建一个双变量。做什么的?您显然会返回double *
并返回指向本地变量的指针总是错误,因为局部变量在其功能结束时会被“回收”。
double *medValPtr = &medianValue;
创建一个名为medValPtr的指针,并将其设置为medianValue的位置。好。
由于medValPtr的当前内容,*medValPtr = (sortArray[numStudents-1] / 2);
与键入medianValue = (sortArray[numStudents-1] / 2);
具有相同的效果(假设它根本就是编译)。
它没有,因为sortArray[numStudents-1]
在猜测中是数组sortArray
中的最后一项,但碰巧是指向其他项的指针。你不能分割指针(数字上你可以,但C ++不允许它总是错误的)。
最后你return medValPtr;
错误,因为medValPtr
指向一个本地变量。
答案 3 :(得分:1)
您可能需要以下内容:
int *MovieData::calcMed() {
return sortArray[numStudents/2];
}