2015-05-23 5 views
0

Мой цикл цикла (для отладки) для симулятора капитализма, который я делаю, не работает, так как он выходит из ix ​​= 0 (он только выполняет тело цикла один раз). Я также считаю, что он синтаксически корректен (из других вопросов).C++ - для цикла не работает

Вот мой код (я ушел из переменных):

void print_things(String2Double b, String2Double up_cost, String2Double tFinish, string* bNames) { 
    // Just for debugging! 
    for (int ix=0;ix<(sizeof(bNames)/sizeof(bNames[0]));ix++) { 
     cout << "Count of business " << bNames[ix] << ": " << b[bNames[ix]] << endl; 
     cout << "Upgrade cost for " << bNames[ix] << ": " << up_cost[bNames[ix]] << endl; 
     cout << "Time to finish for " << bNames[ix] << ": " << tFinish[bNames[ix]] << endl; 
     cout << ix << endl; 
    } 
} 

Я также распечатать размер bNames[], который 9 и только напечатанный IX = 0, и я подозревал, что-то должно быть неправым.

Спасибо!

+0

Добро пожаловать в клуб C/C++, наиболее часто задаваемых вопросов. –

+0

Почему бы не заменить '(sizeof (bNames)/sizeof (bNames [0]))' с '9'? – asimes

+0

Поскольку ни один из приведенных ниже ответов не упомянул об этом, это явление известно как «** массив, распадающийся на указатель **». Возможно, вы захотите найти его в своей любимой поисковой системе (Yahoo, DuckDuckGo, StartPage, IxQuick и т. Д.). –

ответ

1

здесь bNames - указатель, а не массив.

+0

Но если я использую строку вместо строки * в объявлении, она вызывает ошибку, которую он не может преобразовать из строки * в строку. –

+2

передать длину массива в качестве дополнительного параметра. –

+0

Я не могу этого сделать, потому что у меня есть массив переменной длины. –

1

Выражение

(sizeof(bNames)/sizeof(bNames[0])) 

не работает, как вы думаете, что должен.

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

Необходимо указать явно количество элементов при использовании указателя.

Лучшим подходом в C++ будет использование std::vector (но настоятельно рекомендуется сначала понять, как это работает).

Редактировать

Вы можете только передать массивы ссылок (не массивы) в C++, если вы знаете размер во время компиляции, используя в качестве синтаксиса:

void print_i10(int (&a)[10]) { 
    // `a` here is a reference to an array of 10 integers 
} 

Также можно передать массивы шаблоны функций, имеющие шаблон, выводящий размер массива во время компиляции; например:

template<typename T, int N> 
void print(const char *format, const T (&a)[N]) { 
    printf("["); 
    for (int i=0; i<N; i++) { 
     if (i) printf(", "); 
     printf(format, a[i]); 
    } 
    printf("]\n"); 
} 

int main(int argc, const char *argv[]) { 
    int ia[10] = {1,2,3,4,5,6,7,8,9,10}; 
    const char *sa[] = {"this", "that", "hmmm..."}; 

    print("%i", ia); 
    print("'%s'", sa); 

    return 0; 
} 

, но это означает, что для каждого типа элемента и элемента размера вы получите четкую копию функции print в вашей программе (как правило, плохая идея).

+0

I _am_, проходящий в ** массиве **, и я использовал это, чтобы распечатать размер. Также массив _is_ не является указателем, он просто имеет неопределенную длину. –

+2

Вы не можете передать массив регулярной функции в C/C++. При передаче массива аргумент распадается на указатель на первый элемент. – 6502

+0

Тогда как _do_ я предотвращаю разложение массива? Я искал его, но нет простого решения. –

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