1

simulink と統合する C-MEX SFunction を開発しています。ここでの目的は、ASCIIコードの配列を2倍に変換することです。matlab を開く前に、Visual Studio を使用してテスト コードを実装しましたが、問題なく動作しました。 (下記参照)

#include "stdafx.h"
#include "stdlib.h"
#include <stdio.h>
#include <math.h>
#include <string.h>

int _tmain(int argc, _TCHAR* argv[])
{
    double finalDouble;
    size_t len = 1;
    char* concatenation;
    double character2 = 54; // 6 in ascii
    double character1 = 46; // dot in ascii
    double character0 = 51; // 3 in ascii

    int character2_int = (int)(character2);
    int character1_int = (int)(character1);
    int character0_int = (int)(character0);

    char buffer2[1];
    char buffer1[1];
    char buffer0[1];

    sprintf(buffer2,"%c",character2_int);
    sprintf(buffer1,"%c",character1_int);
    sprintf(buffer0,"%c",character0_int);

    concatenation = (char*)malloc(len+len+len);
    strcpy(concatenation, buffer2); /* copy into the new var */
    strcat(concatenation, buffer1); /* concatenate */
    strcat(concatenation, buffer0); /* concatenate */

    finalDouble = atof(concatenation); // final double must be 6.3

    //y0[0] = finalDouble;
}

VisualStudio ですべてをテストした後、matlab の SFunction Builder にコピーしました。クラッシュはしませんが、malloc が期待どおりに動作していないようです。予想される出力は 6.3 (double) ですが、最後の桁の 3 (double) しか得られません。

何が起こっているか知っている人はいますか?何かアドバイスはありますか?

ここに画像の説明を入力

4

2 に答える 2

1

あなたの問題は、単一の文字 ( char) と文字列( ) を区別していないことにありますchar[]。上から下まで:

1) 一重引用符を使用して ASCII 値を割り当てることができます。

double character2 = '6';
double character1 = '.';
double character0 = '3';

2) 文字列は null 文字で終わります。これは、n 文字の文字列を保持するために必要なバイト数が n+1 であることを意味します。したがって、1 つの文字を文字列として格納するには、少なくとも 2 バイトが必要です。

3)sprintf文字列を格納します。つまり、最後の文字の後に終端の null 文字を格納します。

sprintf(buffer2,"%c",character2_int);character2_intからに 1 バイトをコピーしてからbuffer2、終端のヌル文字 (10 進数の 0) を RAM アドレス に書き込みます&buffer2 + 1

4)シングルではなく、文字列strcpy()strcat()作業しますcharschars終端のヌル文字が見つかるまでコピー/連結を続けます。繰り返しますが、終端のヌル文字を含めるのに十分なスペースを割り当てることを忘れないでください。

于 2015-11-30T13:52:38.453 に答える