Массивы C ++ в качестве параметров, EDIT: теперь включает переменную область видимости - PullRequest
2 голосов
/ 28 апреля 2010

Хорошо, я предполагаю, что это простой вопрос, поэтому я постараюсь, но я не могу найти то, что мне нужно, в Google или SO. Я хотел бы создать массив в одном месте и заполнить его другой функцией.

Я определяю функцию:

void someFunction(double results[])
{
    for (int i = 0; i<100; ++i)
    {
       for (int n = 0; n<16; ++n) //note this iteration limit
       {
           results[n] += i * n;
       }
    }
}

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

double result[16];
for(int i = 0; i<16; i++)
{
    result[i] = -1;
}

тогда я хочу передать его someFunction

someFunction(result);

Когда я устанавливаю точки останова и пошагово выполняю код, после ввода someFunction, results устанавливается на тот же адрес, что и result, и значение там -1,000000, как и ожидалось. Однако, когда я начинаю итерацию по циклу, results[n], похоже, не разрешается до *(results+n) или *(results+n*sizeof(double)), просто кажется, что оно разрешается до *(results). В результате я получаю одно значение вместо заполнения массива результатов. Что я делаю не так?

EDIT О, весело, у меня есть опечатка: это не было void someFunction(double results[]). Было:

void someFunction(double result[])...

Так что, возможно, это превращается в предметный вопрос. Если мой массив double result[16] определен в файле main.cpp, а someFunction определен в файле Utils.h, который включен в main.cpp, переменная result в someFunction тогда нанесет ущерб result массив в основном?

РЕДАКТИРОВАТЬ 2:

@ gf, при попытке воспроизвести эту проблему с помощью свежего проекта, оригинальный проект «волшебным образом» начал работать.

Я не знаю, как это объяснить, поскольку ничего не изменилось, но я почти уверен в том, что я видел - мое первоначальное описание проблемы было довольно ясным, поэтому я не думаю, что у меня были галлюцинации. Я ценю время и ответы ... извините за тратить ваше время. Я буду обновлять снова, если это произойдет снова, но пока, я думаю, я в чистоте. Еще раз спасибо.

Ответы [ 5 ]

1 голос
/ 28 апреля 2010

Просто вопрос о части переменной области вопроса - здесь нет проблемы переменной области действия.result / results в вашем определении someFunction - это параметр -> он будет принимать переданное значение. Нет связи между переменными в вызываемой функции и ее вызывающей -> переменные в вызывающей функции неизвестныв вызываемую функцию, если не передано. Кроме того, проблемы с областью видимости переменных не возникают между подпрограммами в C ++, потому что нет вложенных подпрограмм.Следующие фрагменты кода демонстрируют проблемы с областями видимости:

int i = 0;  
{  
    int i = 0;  
    i = 5; //changes the second i, not the first. 
    //The first is aliased by the second i defined first.  
}  
i = 5; //now changes the first i; the inner block is gone and so is its local i

, поэтому, если бы в C ++ были вложенные подпрограммы, это привело бы к изменению области видимости

void main()  
{  
    double results[16];  
    double blah[16];  
    doSomething(blah);  
    void doSomething(double * results)  
    {  
         //blah doing something here uses our parameter results, 
         //which refers to blah, but not to the results in the higher scope. 
         //The results in the higher scope is hidden.  
     }  
}
1 голос
/ 28 апреля 2010

Чтобы эта проблема не возникала, вы никогда не должны использовать такие глобальные переменные. Если он вам обязательно нужен, для ясности поместите его в пространство имен.

1 голос
/ 28 апреля 2010

Мне кажется, что ваш код должен просто работать.

Я только что попробовал это в g ++ и работал нормально. Я полагаю, ваша проблема в другом месте? Вы пробовали отсканированный вами пост?

#include <iostream>

void someFunction(double results[])
{
    for (int i = 0; i<100; ++i)
    {
       for (int n = 0; n<16; ++n) //note this iteration limit
       {
           results[n] += i * n;
       }
    }
}

int main() 
{
  double result[16];
  for(int i = 0; i<16; i++)
  {
    result[i] = -1;
  }
  someFunction(result);
  for(int i = 0; i<16; i++)
    std::cerr << result[i] << " ";
  std::cerr << std::endl;  
}
1 голос
/ 28 апреля 2010

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

1 голос
/ 28 апреля 2010
void someFunction(double results[])

должно быть точно эквивалентно

void someFunction(double *results)

Попробуйте использовать альтернативное объявление и посмотрите, сохраняется ли проблема.

...