@RandomCraft

Как вернуть массив из структуры?

Есть код, в котором определена структура хранящая массив из 3 ячеек. Определена функция, которая умножает значение ячеек массива переменной моей структуры. Хочу проверить, работает ли всё так, как я хочу, но не могу. Если просто вставлять в cout переменную iv3d или iv3d.array, то ничего не получается (с первым мне в целом понятно почему, а вот от второго я до сих пор в недоумении). Определил в структуре метод get, но он постоянно ругается, что я хочу вернуть int*, а в определении метода int. Если заменить и в методе на int*, то во время работы main возникает ошибка, т.к. я пытаюсь запихнуть в массив типа int тип int*... Я перестал в этот момент понимать что-либо... Что вообще происходит, почему в структуре массив int*, а в основном теле просто Int... Я не понимаю.
Подскажите пожалуйста где у меня ошибка, что нужно сделать? Я сам ответ не могу найти.

#include <iostream>
using namespace std;

struct ivector3d {

	int array[3];
  int get() {
		return array;
	}
};

void scale(ivector3d* v, int k) {
	for (int i = 0; i != 3; ++i)
		v->array[i] *= k;
}


int main() {

	ivector3d iv3d = {1,1,1};
	scale(&iv3d, 2);

	int b[3]={iv3d.get()};

	cout << b << endl;
}
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
В данном случае в вашей программе нет необходимости использовать массив, лучше завести 3 переменные в структуре ivector3d
struct ivector3d {
  int x = 0;
  int y = 0; 
  int z = 0;
};

Затем обращаться к ним из функции scale.
Если вас интересует возвращение массива из функции, то вам нужно вернуть указатель на первый элемент массива
int* get() {
    return array;
  }

Но это плохой способ, т.к. при таком подходе теряется информация о размере массива. Эту проблему можно решить возвращая размер массива в параметрах функции.
int* get(int& size) {
    size = 3;
    return array;
  }

Но, согласитесь, это не очень удобно. В таком случае предлагается изменить код на использование контейнера std::array.
struct ivector3d {

  std::array<int, 3> array;
  std::array<int, 3> get() {
    return array;
  }
};

По итогу, программа будет выглядеть следующим образом
#include <iostream>
#include <array>

using namespace std;

struct ivector3d {

  std::array<int, 3> array;
  std::array<int, 3> get() {
    return array;
  }
};

void scale(ivector3d* v, int k) {
  for (int i = 0; i != 3; ++i)
    v->array[i] *= k;
}


int main() {

  ivector3d iv3d = {1,1,1};
  scale(&iv3d, 2);

  auto b = iv3d.get();
  for(auto i : b)
  {
      cout << i << " ";
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы