2012-02-29 2 views
0

У меня есть массив:Pass массив в качестве аргумента

int *BC_type_vel; 
BC_type_vel = new int [nBou+1]; 

, и функцию:

void BC_update (const int type[], float X[]) { 

for (int i=1; i<=nBou; ++i) { 

    if (type[i] == 1) { 

     std::cout << i << " " << type[i] << " " << BC_type_vel[i] << std:: endl; 

     for (int e=PSiS[i]; e<PSiE[i]; ++e) {    

      X[e] = X[elm[e].neigh[0]]; 
     } 
    } 
} 

}

я называю это так:

BC_update(BC_type_vel,U); 

Это дает выход as:

1 1 0 
2 1 0 
3 1 0 
4 1 1 
5 1 0 

Итак, почему аргумент функции не копирует значения правильно?

+2

Остерегайтесь того, чтобы массив в C начинался с позиции 0 (подвалы + 0). Вы попадаете в фальшивую память при своей функции. – Edu

+0

@Edu: Это очень странный способ петли через массив и должен быть изменен, но он на самом деле не набрасывает его. Если вы посмотрите, как создается массив, он имеет элементы 'nBou + 1', и он перебирается через 1 в' nBou'. Теперь он не показывает нам, как он заполняет массив, поэтому я бы предположил, что это проблема. Я бы рекомендовал пометить это как C, но как на C++, вы должны просто использовать «вектор» и сделать вашу жизнь проще. –

+0

@EdS. Это правда. Он просто растрачивает первый ряд, но не повреждает память. Я согласен, это просто C, а не C++. – Edu

ответ

1

Я попытался следующий код с GCC:

int *BC_type_vel; 
int nBou = 10; 

void BC_update (const int type[]) { 
    for (int i=1; i<=nBou; ++i) { 
     if (type[i] == 1) 
      std::cout << i << " " << type[i] << " " << BC_type_vel[i] << std:: endl; 
    } 
} 

int main() { 
    int i; 

    BC_type_vel = new int [nBou+1]; 
    for (i=1; i<=nBou; ++i) { 
     if (i%2 == 0) 
      BC_type_vel[i] = i; 
     else 
      BC_type_vel[i] = 1; 
    } 
    BC_update(BC_type_vel); 

    return 0; 
} 

и дает ожидаемые результаты:

1 1 1 
3 1 1 
5 1 1 
7 1 1 
9 1 1 

Так что проблема где-то в вашем коде. Вы должны предоставить нам остальную часть.

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