Войти

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


tumanovalex
30-06-2015, 15:17
В функции 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
- как в моей программе, зная адрес первого элемента массива, количество строк и столбцов, вывести значения массива? »#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";
}
}

- с помощью каких типов 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
Хотелось бы все-таки разобраться с моим кодом. Переделал программу так, чтобы в основной программе правильно определялись адреса:#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
tumanovalex, твоя функция возвращает массив указателей, которые указывают на адреса локальных не статических переменных. После выхода с функции они удаляются. Обращение к этим переменным каким либо образом (через обращения к значению указателя) не определено.

tumanovalex
01-07-2015, 22:36
Понятно. Спасибо за ответы.




© OSzone.net 2001-2012