Глупая синтаксическая ошибка c

#c #syntax

#c #синтаксис

Вопрос:

Я совершенно новичок в 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 .

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

Комментарии:

1. Вы пишете объявления на C #. Это int profit[] или int* profit .

2. Не забудьте добавить int main(), если вы пытаетесь скомпилировать и связать 🙂

3. У вас тоже логическая проблема, я внес правку. Ошибка, @Neil ninja’d меня 🙂

Ответ №1:

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

 int profit[]
  

Или

 int *profit
  

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

 class Foo { 

};  <----
  

Следующая проблема, с которой вы сталкиваетесь, является логической, а не синтаксической. Это не делает того, что вы думаете:

 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; 
  

Комментарии:

1. @Lost_DM: Нет, это не так. Это единственные две синтаксические проблемы.

Ответ №2:

В 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; 
  } 
};
  

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

Комментарии:

1. также помните, что sizeof(array) вернет количество байтов в массиве , фактически, в этом примере, sizeof(profit) == sizeof(decay) т.е. sizeof(int*) . Массивы распались до указателей, размер в функции неизвестен.

2. Да, вы правы, я думал об этом в контексте не аргумента функции. int foo[10]; sizeof(foo)==40 .

Ответ №3:

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

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

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

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

или

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

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

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

 int main() {}
  

затем вы можете скомпилировать свой код — я только что попробовал это с g .

Ответ №4:

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

Комментарии:

1. «Почти похоже», но определенно не то же самое. Он использует sizeof , и sizeof(intptr) == 4 , тогда как sizeof(intarray) == 4 * length .

2. @jli: На самом деле это точно то же самое в данном контексте.

3. Да, я знаю, я ответил на это в вашем предыдущем комментарии ко мне.

4. @jli: Только что увидел это, извините 🙂

Ответ №5:

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

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

Ответ №6:

Руководство по массивам на C может оказаться полезным, особенно в том, что касается передачи параметров массива.

Ответ №7:

 int determineProfit (int[] profit int [] decay 
  

вот ваша ошибка — приведенное выше утверждение неверно; оно должно быть таким

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