0

編集:ありがとう、興味のある人のための修正コード: ert_main.cpp:

#include <stdio.h>                     /* This ert_main.c example uses printf/fflush */
#include "Rx.h"                        /* Model's header file */
#include "rtwtypes.h"                  /* MathWorks types */
#include <stdlib.h>
#include <iostream>
#include <istream>
#include <sstream> 
#include <fstream>
#include <string> 
//#include <ofstream>//for writing results to file
//#include <ifstream> //doesn't work
#include <vector>
#define lengthOFSignal 5000 

主な機能で:

 using namespace std;
        std::vector<std::string> words;
         std::string word;
        ifstream  iFile;
        string path = __FILE__; //gets source code path, include file name
        path = path.substr(0,1+path.find_last_of('\\')); //removes file name
        string testFileName = "LEGACY_R12_800BITS_40MHz.dat";
        path+= testFileName; //adds input file to path
        int signal_length=0;

    std::vector<real_T> real_part_VEC, imag_part_VEC;
    std::istringstream ss;
    real_T real_temp, imag_temp;

    iFile.open(path,ios::binary );
     //iFile.open(path.c_str(), ios::binary);
    if (iFile.is_open()) {
         while (std::getline(iFile, word)) {
            words.push_back(word);
        }
        iFile.close();
    }

    signal_length=words.size();
 for(int i=0; i< signal_length;i++)
  {
      ss.str(words[i]);
      ss >> real_temp >> imag_temp;
      real_part_VEC.push_back(real_temp);
      imag_part_VEC.push_back(imag_temp);
  }

    real_T real_part[lengthOFSignal];
    real_T imag_part[lengthOFSignal];

    for (int i=0; i < signal_length; i++) {

        real_part[i]=real_part_VEC[i];
        imag_part[i]=imag_part_VEC[i];
    }

     /* Initialize model */
    Rx_initialize(real_part,imag_part,signal_length);

古いコードと問題:

ここに画像の説明を入力 .dat ファイルは、数字が並んだ 2 つの直線の列のように見えます (間隔が空いています)。

実部と虚部

読み取ったデータのループに関するエラーが発生します (strtok -> atof (Null pointer) )

編集された ert_main.cpp メイン関数:

#include <stdio.h>                     /* This ert_main.c example uses printf/fflush */
#include "Rx.h"                        /* Model's header file */
#include "rtwtypes.h"                  /* MathWorks types */
#include <stdlib.h>
#include "mat.h"
#define lengthOFSignal 5000
#define SizeOfLine 35

int_T main(int_T argc, const char *argv[])
{
  /* Unused arguments */
  (void)(argc);
  (void)(argv);


  int i=0;
    char bFileName[] = "QPSK_SISO_802_11_packet_awgn_fr_shft.dat";
    char chr[SizeOfLine*lengthOFSignal];
    char *token;
    real_T real_part[lengthOFSignal];
    real_T image_part[lengthOFSignal];
    int signal_length=0;

    std::ifstream  iFile(bFileName, std::ios::binary);
    iFile.getline(chr,100);
    for(int i=0; i<lengthOFSignal; i++) {
        if (chr== NULL)  break;
                token= strtok(chr," ");
            real_part[i]=atof(token); // real part.---problem occurs here!!!!
            token= strtok(NULL," ");
            image_part[i]=atof(token);// imaginary part.
            iFile.getline(chr,100);
            signal_length++;

    }
    iFile.close();

     /* Initialize model */
    Rx_initialize(real_part,image_part,signal_length);

  /* Attach rt_OneStep to a timer or interrupt service routine with
   * period 40.0 seconds (the model's base sample time) here.  The
   * call syntax for rt_OneStep is
   *
   *  rt_OneStep();
   */
  printf("Warning: The simulation will run forever. "
         "Generated ERT main won't simulate model step behavior. "
         "To change this behavior select the 'MAT-file logging' option.\n");
  fflush((NULL));
  while (rtmGetErrorStatus(Rx_M) == (NULL)) {
    /*  Perform other application tasks here */
      rt_OneStep();
      if(Rx_Y.EVM!=0) break;
  }

  /* Disable rt_OneStep() here */

  /* Terminate model */
  Rx_terminate();
  return 0;
}

ソリューションへのリンク (VS 2012) プロジェクト/ソリューションへのリンク

4

1 に答える 1

1

入力長を超えて変換しようとしています。これにより、デバッグ アサーション エラーが発生します。提案として、データを数値として読み取ってみてください。生活がずっと楽になります。


編集:前のステートメントに追加しています。文字列を数値に解析するためにistringstreamを使用しました。これで番号を確認しましたが、これは簡単に展開できます。

std::string str("2.1506668e-03");
std::istringstream ss;
ss.str(str);
double x;
ss >> x;
std::cout << x << std::endl;

答え: 0.0021567


新しい編集:ああ!このコードははるかに優れています。しかし、いくつかの非常に基本的なエラーを修正する必要があります。

1> file.is_open の失敗は、ファイルが見つからないことが原因である可能性があります。ファイルが検索パスにあるかどうかを確認してください。これを行う最も簡単な方法は、ファイルをプロジェクト ファイル フォルダーにコピーすることです。

2> ベクトルの使用は、サイズが不明な場合は常に意味があります。ところで、fseek と ftell を使用して、ファイルのサイズ、つまり配列のサイズを決定できます。

3> ざっと見ただけで、このステートメントを次のstd::string real_str("words[i]");ように変更する必要があることがわかります。std::string real_str(words[i]);前のステートメントは、文字列words[i]を入力として受け取ります。

4> for ループでは、 for をループしてsignal_lengthいますが、 and を使用しwords[i]ていますwords[i+1]。したがって、そのような場合、ベクトルの半分だけが読み取られます。

行全体を単語ベクトルに読み取り、それを実部と虚部に解析します

 std::vector<std::string> words;
 std::string word;
 if (fin.is_open()) {
    while (std::getline(fin, word)) {
        words.push_back(word);
    }
    fin.close();
 }


// I would declare two vectors 
std::vector<real_T> real_part, imag_part;
std::istringstream ss;
real_T real_temp, imag_temp;

// for loop
for(int i=0;i<words.size();i++)
{
      ss.str(words[i]);
      ss >> real_temp >> imag_temp;
      real_part.push_back(real_temp);
      imag_part.push_back(imag_temp);
}
于 2013-09-26T18:58:37.007 に答える