1

I´m developing a C-MEX SFunction to integrate with simulink. The objective here is to convert an array of ascii codes do double. Before opening matlab, I implemented a test code using Visual Studio and it works just fine. (see below)

#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;
}

After everything was tested in VisualStudio, I copied to SFunction Builder in matlab. It do not crashes, but looks like malloc is not working as expected. The expected output is 6.3 (double), but I get only the last digit 3 (double)

Does anyone know whats happening? Any advices?

enter image description here

4

2 回答 2

2

您正在使用sprintf一个字节的缓冲区,而您的缓冲区的大小应该至少为 2。而且您没有为malloc. 这会导致未定义的行为。

改变 :

char buffer2[1];
char buffer1[1];
char buffer0[1];
...
concatenation = (char*)malloc(len+len+len);

char buffer2[2];
char buffer1[2];
char buffer0[2];
...
concatenation = (char*)malloc(len+len+len+1);

对于如此简单的任务,您的代码非常奇怪和复杂。你到底想达到什么目的?

于 2015-08-07T14:48:42.590 回答
1

您的问题在于您没有区分单个字符 ( char) 和字符串 ( char[])。从上到下:

1) 您可以使用单引号指定 ASCII 值:

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

2)字符串以空字符结尾,这意味着容纳n个字符的字符串所需的字节数是n+1。因此,您至少需要两个字节才能将单个字符存储为字符串。

3)sprintf存储一个字符串,这意味着它在最后一个字符之后存储一个终止空字符:

sprintf(buffer2,"%c",character2_int);character2_int从to 复制单个字节buffer2,然后将终止空字符(十进制 0)写入 RAM 地址&buffer2 + 1

4)strcpy()strcat()在字符串上工作,而不是在 single 上工作chars。他们将继续复制/连接,chars直到找到终止的空字符。同样,不要忘记分配足够的空间来包含终止空字符。

于 2015-11-30T13:52:38.453 回答