C ++ помещает 2d массив с плавающей точкой в ​​символ * - PullRequest
2 голосов
/ 08 июня 2010

Я пытаюсь взять двумерный вектор чисел с плавающей точкой (входные) и поместить их в символ * (выходной) в c ++.

void foo(const std::vector<std::vector<float> > &input, char* &output )
{  
   char charBuf[sizeof(output)];
   int counter = 0;
   for(unsigned int i=0; i<input.size(); i++)
   {
      for(unsigned int p=0; p<input.at(i).size(); p++)
      {
         //what the heck goes here
      }
   }

Ответы [ 6 ]

2 голосов
/ 08 июня 2010

Вы можете использовать std::stringstream на каждой итерации, чтобы поместить число с плавающей точкой в ​​std::string, а затем получить массив char* из этого. Если вам нужен один большой массив char*, просто используйте один поток строк, определенный вне циклов.

1 голос
/ 08 июня 2010

Если вы хотите, чтобы результат был удобочитаемым, то вы набираете snprintf() - который преобразует число 3.1415 в строку «3.1415» Если вы просто выводите данные для повторного чтения другой программой, вы можете просто вывести двоичные данные в свой выходной поток.

Помните, что когда вы выводите двоичное представление числа с плавающей запятой, вы должны знать, как оно кодируется. Если вы читаете и пишете на одной и той же платформе, кодировка будет одинаковой. На самом деле большинство настольных платформ используют спецификацию IEEE-754 для чисел с плавающей запятой, но проверьте это на всякий случай.

Кроме того, убедитесь, что ваш выходной поток допускает какое-то управление версиями или другой механизм для изменения формата позже, когда вы решите сделать что-то другое с ним. Обычно достаточно номера версии в начале.

1 голос
/ 08 июня 2010

Это в значительной степени зависит от того, что вы подразумеваете под "положить их в символ *".

0 голосов
/ 08 июня 2010

Не пытайтесь помещать данные в необработанные символьные массивы, особенно если вы не знаете их размер, чего у вас нет. Вместо этого используйте std::string и std::stringstream для записи в него.

Что бы вы ни делали, избавьтесь от этой charBuf вещи; все, что вы сделаете с этим, будет неверным, поскольку sizeof(output) не является размером выходного массива.

Предполагая, что вам нужна читаемая человеком строка, вы можете захотеть что-то вроде

std::string foo(const std::vector<std::vector<float> > &input)
{
    std::ostringstream stream;
    for (std::size_t i = 0; i < input.size(); ++i)
    {
        if (i != 0) stream << "\n";
        for (std::size_t j = 0; j < input[i].size(); ++j)
        {
            if (j != 0) stream << ",";
            stream << input[i][j];
        }
    }

    return stream.str();
}
0 голосов
/ 08 июня 2010

Следующий код даст вам char* представление всех float s в параметре input.

Тем не менее, я бы очень осторожен, что это действительно то, что вы хотите. Массив char * не является устойчивым к порядку байтов, и я всегда стараюсь не передавать выделенные указатели пользователям. Любой, кто использует эту функцию, должен освободить output с delete[], но это никоим образом не очевидно из названия функции или сигнатуры, рецепта хрупкого кода.

void foo(const std::vector<std::vector<float> > &input, char* &output )
{  
   //this was likely an error, it is always an array of size 4
   //char charBuf[sizeof(output)];

   std::vector<float> tmp_output;

   int counter = 0;  // Why was this here?

   for(unsigned int i=0; i<input.size(); i++)
   {
      // This is slightly more efficient than the hand rolled loop below.
      // std::copy( input[i].begin(), input[i].end(),
      //            std::back_inserter<float>(tmp_output) );

      for(unsigned int p=0; p<input.at(i).size(); p++)
      {
         tmp_output.push_back(input.at(i).at(p));
      }
   }
   output = new char[tmp_output.size()*sizeof(float)];
   std::copy( reinterpret_cast<const char*>(&(*tmp_output.begin())),
              reinterpret_cast<const char*>(&(*tmp_output.end())),
              output );
}
0 голосов
/ 08 июня 2010

То, что вы пытаетесь сделать, называется сериализацией. В C ++ faq есть раздел, посвященный этому: http://www.parashift.com/c++-faq-lite/serialization.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...