C++ массивы в качестве параметров, EDIT: теперь включает переменную область видимости

Хорошо, я предполагаю, что это простой вопрос, поэтому я постараюсь, но я не могу найти то, что мне нужно, в 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), В результате я получаю одно значение вместо заполнения массива результатов. Что я делаю неправильно?

РЕДАКТИРОВАТЬ О, весело, у меня есть опечатка: это не было void someFunction(double results[]), Это было:

void someFunction(double result[])...

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

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

@gf, в процессе воспроизведения этой проблемы с новым проектом, оригинальный проект "волшебным образом" начал работать.

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

5 ответов

Решение

Просто вопрос о переменной области вопроса - здесь нет вопроса о переменной области. 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.  
     }  
}

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

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

void someFunction(double results[])

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

void someFunction(double *results)

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

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

Я только что попробовал это в 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;  
}
Другие вопросы по тегам