Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как правильно передать несколько данных в программу из функции? (http://forum.oszone.net/showthread.php?t=301867)

tumanovalex 30-06-2015 15:17 2524286

Как правильно передать несколько данных в программу из функции?
 
В функции outArray формирую массив, а затем адрес первого элемента массива вместе с количеством строк и столбцов массива передаю в программу:
Код:

#include <iostream>
#include <string>
#include <tchar.h>

using namespace std;

float** outArray()
{
  float nrow = 3.0;
  float ncol = 5.0;
  float flArray[][5] = { { 1.1, 1.2, 1.3, 1.4, 1.5 },
                        { 2.1, 2.2, 2.3, 2.4, 2.5 },
                        { 3.1, 3.2, 3.3, 3.4, 3.5 } };
  float* out[3];
  out[0] = &nrow;
  out[1] = &ncol;
  out[2] = &flArray[0][0];
  return out;
}


int _tmain(int argc, _TCHAR* argv[])
{
  setlocale(LC_ALL, "Russian");
  float** out2 = outArray();
  int nrow = (int) (*out2[0]);
  int ncol = (int) (*out2[1]);
  float** fla = &out2[2];
  for (int i = 0; i < nrow; i++)
  {
    for (int j = 0; j < ncol; j++)
    {
      cout << fla[i*ncol + j] << '\t'; // Здесь ошибка
    }
    cout << endl;
  }  cin.get();
  return(EXIT_SUCCESS);
}

Возникли следующие вопросы:
- как в моей программе, зная адрес первого элемента массива, количество строк и столбцов, вывести значения массива?
- с помощью каких типов C++ удобно передавать (возвращать) данные различных типов? Например, в моем случае передать массив float и количество строк и столбцов int.

Yuron_477 30-06-2015 17:30 2524329

Цитата:

Цитата tumanovalex
- как в моей программе, зная адрес первого элемента массива, количество строк и столбцов, вывести значения массива? »

Код:

#include <iostream>

auto outArray() -> float(*)[5]
{
  static float flArray[3][5] = { { 1.1, 1.2, 1.3, 1.4, 1.5 },
                                { 2.1, 2.2, 2.3, 2.4, 2.5 },
                                { 3.1, 3.2, 3.3, 3.4, 3.5 } };
  return flArray;
}

int main()
{
  auto array = outArray();

  for (std::size_t i = 0; i < 3; ++i)
  {
      for (std::size_t j = 0; j < 5; ++j) std::cout << array[i][j] << " ";
      std::cout << "\n";
  }
}

Цитата:

Цитата tumanovalex
- с помощью каких типов C++ удобно передавать (возвращать) данные различных типов? Например, в моем случае передать массив float и количество строк и столбцов int. »

Используй вектор или array:
Код:

#include <iostream>
#include <array>

const std::array<std::array<float, 5>, 3>& outArray()
{
  static const std::array<std::array<float, 5>, 3> flArray =
  {  1.1, 1.2, 1.3, 1.4, 1.5 ,
      2.1, 2.2, 2.3, 2.4, 2.5 ,
      3.1, 3.2, 3.3, 3.4, 3.5  };

  return flArray;
}

int main()
{
  auto &array = outArray();

  for (auto &ar : array)
  {
      for (float fl : ar) std::cout << fl << " ";
      std::cout << "\n";
  }
}


tumanovalex 01-07-2015 12:13 2524566

Хотелось бы все-таки разобраться с моим кодом. Переделал программу так, чтобы в основной программе правильно определялись адреса:
Код:

#include <Windows.h>
#include <iostream>
#include <string>
#include <tchar.h>

using namespace std;

float** outArray()
{
  float nrow = 3.0;
  float ncol = 5.0;
  float flArray[][5] = { { 1.1f, 1.2f, 1.3f, 1.4f, 1.5f },
                          { 2.1f, 2.2f, 2.3f, 2.4f, 2.5f },
                          { 3.1f, 3.2f, 3.3f, 3.4f, 3.5f } };
  float* out[3];
  out[0] = &flArray[0][0];
  out[1] = &nrow;
  out[2] = &ncol;
  cout << &flArray << endl;
  cout << out[0] << endl;
  cout << *out[0] << endl;
  cout << &flArray[0][0] << endl;
  cout << &flArray[0][1] << endl;
  cout << &flArray[0][1] - &flArray[0][0] << endl;
  cout <<  *(&flArray[0][0] + 1) << endl;
  cout << "---------------------" << endl;
  return out;
}

int _tmain(int argc, _TCHAR* argv[])
{
  setlocale(LC_ALL, "Russian");
  float** out2 = outArray();
  int nrow = (int)(*out2[1]);
  int ncol = (int)(*out2[2]);
  int delta = 1;
  float* fla = out2[0];
  cout << fla << endl;
  cout << fla + delta << endl;
  cout << *(fla + delta) << endl; // не совпадает с *(&flArray[0][0] + 1)
  for (int i = 0; i < nrow; i++)
  {
    for (int j = 0; j < ncol; j++)
    {
      cout << *(fla + i*ncol + j) << '\t';
    }
    cout << endl;
  }
  cin.get();
  return(EXIT_SUCCESS);
}

Однако несмотря на то, что адрес выражения fla + delta равен адресу &flArray[0][1], выводится неправильное значение второго элемента массива *(fla + delta). Что я делаю неправильно?

Yuron_477 01-07-2015 17:45 2524727

tumanovalex, твоя функция возвращает массив указателей, которые указывают на адреса локальных не статических переменных. После выхода с функции они удаляются. Обращение к этим переменным каким либо образом (через обращения к значению указателя) не определено.

tumanovalex 01-07-2015 22:36 2524853

Понятно. Спасибо за ответы.


Время: 02:50.

Время: 02:50.
© OSzone.net 2001-