Передача массива в функцию, а затем изменение значений? - PullRequest
0 голосов
/ 25 сентября 2011

По сути, скажем, я объявляю массив в int main (), а затем передаю его другой функции. Могу ли я затем изменить значения, которые содержит массив?Примерно так:

int main()
{
  myarray[3] = {4, 5, 6};

  myfunc(myarray);

 return 0;
}

int myfunc(int myarray[])
{
  int x
  cout << "Choose a number";
  cin >> x

  if (x == 1)
   {
     myarray[] = {0, 1, 3}
   } 
  else
   {
     some code
   }

return 6;
}

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

Ответы [ 4 ]

3 голосов
/ 25 сентября 2011

Вы можете изменять элементы в массиве, однако списки инициализаторов выглядят так:

myarray[] = {0, 1, 3}

может использоваться только при объявлении массива. Чтобы присвоить массиву вам нужно будет назначить каждый элемент индивидуально:

myarray[0] = 0;
myarray[1] = 1;
myarray[2] = 3;
1 голос
/ 25 сентября 2011

С существующей сигнатурой функции невозможно безопасно изменить значения. Обычно вы делаете что-то вроде

myarray[0] = 0;
myarray[1] = 1;
//etc

Есть и много других подходов к этому, в зависимости от того, как хранятся значения, которые нужно поместить в массив (может пригодиться std::copy или std::generate Вот). Но сейчас у вас нет способа узнать, где заканчивается массив.

Чтобы исправить это, вам нужно как-то передать длину массива функции. Один из способов - просто передать дополнительный параметр size_t length. Возможно, лучший способ, который работает в духе итераторов C ++, - написать сигнатуру типа

int myfunc(int* begin, int* end);

и назовите что-нибудь вроде

myarray[3] = {4, 5, 6};
myfunc(myarray, myarray + sizeof(myarray) / sizeof(myarray[0]));
0 голосов
/ 25 сентября 2011

Это: myarray[] = {0, 1, 3} - неправильно.

Вы должны передать длину массива и запустить цикл, который изменит его значения.

Вы никогда не должны предполагатьразмер массива, который вы получаете в функции.Если размер постоянен - ​​сделайте его myfunc(int myarray[THE_SIZE]), в противном случае оно должно быть myfunc(int myarray[], int size), где size - размер переданного массива.

0 голосов
/ 25 сентября 2011
if (x == 1)
{
  myarray[] = {0, 1, 3}  // {0,1,3} is an initializer list.
} 

Списки инициализаторов допускаются только в точке объявления.Они не разрешены в назначениях.И в операторе if вы выполняете задание.Единственный способ изменить элементы массива - это изменить элемент в каждом индексе в if.

myarray[0] = 0;
myarray[1] = 1;
myarray[2] = 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...