【问题标题】:Can't convert int pointer array to double pointer array in a function无法在函数中将 int 指针数组转换为双指针数组
【发布时间】:2021-04-12 12:24:53
【问题描述】:

我有一个函数应该将 int 指针数组转换为双指针数组。它看起来像这样:

double* intToDouble(int len , int*x){

    double* y;
    y =(double*)malloc(len*sizeof(double));
    for (int i=0; i<len ; i++){
        y[i]=(double)x[i];
    }
    return y;
}

但是,当尝试使用它时,我得到一个充满浮点 0 的数组。我也会把我的打印数组函数留在这里,以防它是相关的。

void printDoubleSignal(int len, double* x) {
    printf("%d: [", len);
    if (len > 0) {
        printf("%lf", x[0]);
        for (int i = 1; i < len; i++) printf(",%lf", x[i]);
    }
    printf("]\n");
}

这是我尝试从 int 转换为浮点数组 10 后得到的结果:[1,2,3,4,5,0,0,0,0,0]

10: [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000]

编辑 根据要求,以下是其余代码:

#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
#include <math.h>

int* readSignal(int* len) {
    int* x;
    char c;
    scanf("%d:", len);
    x = calloc(*len, sizeof(int));
    do c = getchar(); while (c != '[');
    if (*len > 0) {
        scanf("%d", &x[0]);
        for (int i = 1; i < *len; i++) scanf(",%d", &x[i]);
    }
    do c = getchar(); while (c != ']');
    return x;
}

void printSignal(int len, int* x) {
    printf("%d: [", len);
    if (len > 0) {
        printf("%d", x[0]);
        for (int i = 1; i < len; i++) printf(",%d", x[i]);
    }
    printf("]\n");
}

void printDoubleSignal(int len, double* x) {
    printf("%d: [", len);
    if (len > 0) {
        printf("%lf", x[0]);
        for (int i = 1; i < len; i++) printf(",%lf", x[i]);
    }
    printf("]\n");
}

int* zeroPad(int len, int* x, int n){

    int i;
    x = (int*)realloc(x, sizeof(int) * n);
    for (i=len; i<n ; i++){
        x[i]=0;
    }
    return x;
}

double* intToDouble(int len , int* x){

    double *y;
    y =(double*)malloc(len*sizeof(double));
    for (int i=0; i<len ; i++){
        printf("x[%d]=%lf\n",i, x[i]);
        y[i]=x[i];
        printf("y[%d]=%lf\n",i, y[i]);
    }
    return y;
}

int main()
{
    int *x , len=5;
    double *y;
    x = readSignal(&len);
    printSignal(len,x);
    x = zeroPad(&len,x,10);
    printSignal(len,x);
    y = intToDouble(len,x);
    printDoubleSignal(len ,y);

    return 0;
}

编辑 2 这是输入/输出的确切文本(第一行是输入,其余是输出):

5:[1,2,3,4,5]
5: [1,2,3,4,5]
10: [1,2,3,4,5,0,0,0,0,0]
x[0]=-0.000000
y[0]=-0.000000
x[1]=-0.000000
y[1]=-0.000000
x[2]=-0.000000
y[2]=-0.000000
x[3]=-0.000000
y[3]=-0.000000
x[4]=-0.000000
y[4]=-0.000000
x[5]=-0.000000
y[5]=-0.000000
x[6]=-0.000000
y[6]=-0.000000
x[7]=-0.000000
y[7]=-0.000000
x[8]=-0.000000
y[8]=-0.000000
x[9]=-0.000000
y[9]=-0.000000
10: [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000]

【问题讨论】:

  • Couldn't reproduce。请发布Minimal, Reproducible Example,包括这些函数的调用者。
  • 问题出在您未显示的代码中。
  • @MikeCAT 我刚刚通过编辑我的整个(短)代码对其进行了更新。
  • 提示:调试浮点问题时,使用"%e""%g""%f" 提供更多信息。
  • Udar,发布使用的输入(精确文本)并看到输出。是"10: [1,2,3,4,5,0,0,0,0,0]\n" 还是类似的东西? printSignal() 的输出缺失。

标签: c pointers casting type-conversion


【解决方案1】:

您忘记接收zeroPad 的结果。该函数使用realloc(),因此传递的指针可能无效。该函数返回新指针,因此您必须将其分配给x

这表示main()函数中的那一行

    zeroPad(5,x,10);

应该是

    x = zeroPad(5,x,10);

【讨论】:

  • 我似乎已经解决了这个问题,但我仍然得到相同的结果。
  • 看起来 x 没有正确传递给 intToDouble 函数。我试图在函数的 for 循环中打印它,并且 x[i] 也是 0.00000 。知道为什么吗?
  • 请参阅上面的评论“我刚刚将 %lf 更改为 %f 并且效果很好。不知道为什么”。看起来 OP 正在使用 pre-c99 编译器。可能想将其添加到这个好的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多