2010-06-23 2 views
1

Я использую g ++ на fedora linux 13. Я просто занимаюсь некоторыми упражнениями из моего учебника по программированию на C++ и не могу получить эту одну программу для компиляции. Вот код:Сообщение об ошибке типа 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: In memberfunction 'double * MovieData::calcMed()':

moviedata.cpp:82: error: invalid operands of types 'int*' and 'double' to binary 'operator/'

Я не уверен, что делать с этой ошибкой, я пробовал статическую кастинг типов без везения, что означает это сообщение об ошибке?

+1

Из внешнего вида sortArray на самом деле будет динамически выделенным массивом указателей на целые числа. – Artelius

ответ

2

sortArray[numStudents - 1] - это указатель на int, который не может находиться на левой стороне деления (если вы помните, что указатели - это адреса, это имеет смысл). Если вы разместите больше своего кода, мы сможем помочь вам исправить его.

Может быть, вы хотите что-то вроде:

int *MovieData::calcMed() { 
     return sortArray[(numStudents - 1)/2]; 
} 

Это возвращает средний элемент в массиве, который должен быть указателем среднего студента. Я не понимаю, почему вы сортируете списки указателей (а не фактические значения) или почему вы возвращаете указатель здесь. Возвращаемое значение + 1 будет указателем на следующее значение в students, которое равно , а не следующее большее числовое число. Таким образом, вы можете также вернуть фактического ученика (int от students). Если вы это сделаете, вы можете также усреднить два средних элемента, когда число равно (это правило является частью типичного медианного алгоритма).

Обратите внимание, что я изменил тип возвращаемого значения на int *, тип элементов sortArray. Кроме того, ваш комментарий неверен. Это средний, а не средний.

Кроме того, ваш выбор не соответствует действительности. Внутренний контур должен начинаться с scan + 1.

+0

, какая часть кода была бы полезна, объявление класса? – 2010-06-23 05:48:51

+0

Да, и где 'sortArray' определен и инициализирован. –

+0

Я добавил объявление класса, конструктор и деструктор, а также функцию selectSort(). – 2010-06-23 06:04:27

3

Вы пытаетесь разделить указатель на двойник, который компилятор говорит, что он не знает, как делать.

sortArray, вероятно, определяется

междунар ** sortArray;

его также стоит отметить, что вы возвращаете указатель на переменную стека, значение которого будет не определено, как только вы вернетесь из функции.

+0

Что такое переменная стека? простите мое невежество. – 2010-06-24 03:14:32

+0

Стек - это область памяти, используемая языками программирования для отслеживания вызовов функций, аргументов функции, возвращаемых значений и временных переменных, используемых в функциях http://www.masters-of-the-void.com/book5.htm – Akusete

+0

В нем также используется термин «переполнение стека». т.е. когда стопка заканчивается из пространства и «переполняется» на кучу или в другие области памяти – Akusete

1

Вы, вероятно, хотите что-то вроде:

int *MovieData::calcMed() { 
    return sortArray[numStudents/2]; 
} 
+0

примечание: если число студентов нечетное, для простоты – sje397

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 указывает на локальную переменную.

+0

Да, я все еще пытаюсь изучить указатели и динамическое распределение памяти. Я фактически выполняю упражнения из моего учебника в главе указателей.Вы пытаетесь сказать, что я должен просто иметь оператор возврата вместо всего остального мусора? – 2010-06-23 05:53:48

Смежные вопросы