#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[])