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;
}