Глупая синтаксическая ошибка c ++ - PullRequest
2 голосов
/ 12 ноября 2011

Я совершенно новичок в C ++.

Ударяю голову об этой ошибке более часа. Вероятно, кто-то с опытом может видеть сквозь это.

Следующий код выдает ошибку:

class TimeTravellingCellar { 

private:

public:
  int determineProfit (int [] profit, int [] decay) { 
    int N = sizeof(profit)/sizeof(decay); 
    int max = 0; 
    for (int i = 0; i < N; i++) { 
      for (int j = 0; j < N; j++) { 
        if (i == j) continue; 
        if (profit [i] - decay [j] > max) 
          max = profit [i] - decay [j]; 
      } 
    } 
    return max; 
  } 
}

Visual Studio Express помещает красную линию под profit в параметрах determineProfit и говорит:

expected a ')' before identifier profit.

Буду признателен за помощь. Спасибо!

Ответы [ 7 ]

12 голосов
/ 12 ноября 2011

Вы объявляете свои массивы, как если бы это был C #. Должно быть

int profit[]

Или

int *profit

Вы попадете в этот следующий. Вы должны завершить свой класс точкой с запятой.

class Foo { 

};  <----

Проблема next у вас логическая, а не синтаксическая. Это не делает то, что вы думаете:

int N = sizeof(profit)/sizeof(decay); 

Вы берете sizeof два указателя, а не размер массивов. На самом деле у вас есть:

int N = 4/4  /* assumes sizeof int == 4 */

Вам также необходимо передать размер вашей функции (или, что еще лучше, прекратить использование массивов и использовать vector<T>.)

Когда вы берете «массив» в качестве аргумента для вашей функции, он фактически превращается в указатель на тип массива (сам массив не может быть передан в функцию). Отсюда следует, что:

void Foo( int array[] ) {
    size_t arrSize = sizeof(array);
    // arrSize == 4 for a 32-bit system, i.e., sizeof(int*)

    int a[100];
    size_t actualSizeInBytes = sizeof(a);
    // actualSizeInBytes == 400, i.e., 4 * 100 as an int occupies 4 bytes
}

Далее, эта строка приводит к тому, что ваша первая итерация всегда пропускается. Не уверен, что это преднамеренно:

if (i == j) continue; 
3 голосов
/ 12 ноября 2011

Вы не объявляете такие массивы в C ++, [] должен идти после имени.Также обратите внимание, что вам нужно использовать точку с запятой после объявления класса.

class TimeTravellingCellar { 

private:

public:
  int determineProfit (int profit[], int decay[]) { 
    int N = sizeof(profit)/sizeof(decay); 
    int max = 0; 
    for (int i = 0; i < N; i++) { 
      for (int j = 0; j < N; j++) { 
        if (i == j) continue; 
        if (profit [i] - decay [j] > max) 
          max = profit [i] - decay [j]; 
      } 
    } 
    return max; 
  } 
};

Edit: также помните, что sizeof (pointer) будет возвращать количество байтов типа указателя, а не количество элементов в массиве,Так что если у вас есть массив int, sizeof(array) == sizeof(int).Ваше значение N всегда будет равно 1.

2 голосов
/ 12 ноября 2011

Эта строка неверна:

 int determineProfit (int [] profit, int [] decay) { 

Измените ее на:

int determineProfit (int profit[], int decay[]) { 

или

int determineProfit (int* profit, int* decay) { 

и добавьте закрывающую ;

Если вы сделаете это и добавите основной, конечно:

int main() {}

, тогда вы можете скомпилировать свой код - я только что попробовал это с g ++.

1 голос
/ 12 ноября 2011

Попробуйте int determineProfit (int* profit, int* decay), поскольку для формальных аргументов массивы и указатели почти одинаковы.

0 голосов
/ 26 июня 2012
int determineProfit (int[] profit int [] decay 

здесь ваша ошибка - вышеприведенное утверждение неверно; так должно быть

int determineProfit (int profit[], int decay[]) 
0 голосов
/ 12 ноября 2011

Учебное пособие по массивам в C может быть полезным, особенно в отношении передачи параметров массива.

0 голосов
/ 12 ноября 2011

Скобки связаны с именем переменной, а не с типом.Первая строка должна быть

int determineProfit (int profit[], int decay[]) { 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...