Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Как правильно передать несколько данных в программу из функции?

Ответить
Настройки темы
C/C++ - Как правильно передать несколько данных в программу из функции?

Старожил


Сообщения: 251
Благодарности: 3

Профиль | Отправить PM | Цитировать


В функции 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.

Отправлено: 15:17, 30-06-2015

 

Новый участник


Сообщения: 19
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата 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";
   }
}

Отправлено: 17:30, 30-06-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 251
Благодарности: 3

Профиль | Отправить PM | Цитировать


Хотелось бы все-таки разобраться с моим кодом. Переделал программу так, чтобы в основной программе правильно определялись адреса:
Код: Выделить весь код
#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). Что я делаю неправильно?

Отправлено: 12:13, 01-07-2015 | #3


Новый участник


Сообщения: 19
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:45, 01-07-2015 | #4


Старожил


Сообщения: 251
Благодарности: 3

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:36, 01-07-2015 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Как правильно передать несколько данных в программу из функции?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - VBScript написать функции считывания таблицы данных из текстового файла evgenmsch@vk Скриптовые языки администрирования Windows 3 18-02-2014 07:20
C/C++ - Как передать функцию в качестве аргумента другой функции? crashtuak Программирование и базы данных 6 17-09-2012 12:51
CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for akrav Скриптовые языки администрирования Windows 4 07-01-2008 17:51
Как передать вызов из адресной строки браузера? zrad Программное обеспечение Windows 6 20-12-2007 15:53
Как переменные из одного скрипта передать ? Kudryavcev Dmitry Вебмастеру 4 04-10-2003 03:10




 
Переход