来自编译器的c ++类型错误消息,这是什么意思?

时间:2010-06-23 05:30:01

标签: c++ debugging

我在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 /'

我不知道该怎么做这个错误,我已经尝试过静态转换类型而没有运气,这个错误信息是什么意思?

4 个答案:

答案 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];
}