处理nodeJs服务器中c程序返回的数组



我编译了一个C程序(从linux中的array.c编译的array.out(,该程序返回一个指向doubles数组的指针。

array.c

#include <stdio.h>
#include <stdlib.h>
double* main(int argc, char *argv[]){
double *arr;
arr = (double *)calloc((3), (unsigned)(sizeof(double)));
arr[0] = 10;
arr[1] = 20;
arr[3] = 30;
return arr;
}

我还有一个正在运行的express nodejs服务器:

const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
})

有没有一种方法可以调用c程序(array.out(并在express nodeJs服务器中处理其响应(arr(?

您正在寻找的是具有exec方法的child_process模块

const { exec } = require('child_process');
const res = exec("./array", (error, stdout, stderr) => {
// console.log({ error, stdout, stderr });
const myResult = stdout.split(' ').map(e => parseFloat(e));
console.log(myResult);
});

另一方面,您需要为节点输出值来处理

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
double *arr;
arr = (double *)calloc((3), (unsigned)(sizeof(double)));
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
printf("%f %f %f", arr[0], arr[1], arr[2]);
return 0;
}

不是一个完整的答案,因为野蛮山羊已经给出了解决方案,但关于编写更好的C代码的一些额外提示:

double *arr;
arr = (double *)calloc((3), (unsigned)(sizeof(double)));

请跳过所有不必要的括号,它们只会使代码更难阅读。赋值可以直接与声明一起发生,但这是个人偏好的问题:

double *arr = (double *)calloc(3, (unsigned)sizeof(double));

转换为unsigned int是不必要的,sizeof的计算结果已为无符号类型(size_t(。事实上,强制转换在技术上甚至是错误的,因为你可能会这样截断大小信息:想象一下,16位无符号int和一个超过65k字节的巨大结构——承认这是理论性质的,但强制转换仍然不正确。

此外,您无论如何都要在之后赋值,所以零初始化(calloc所做的(只是不必要的压舱物,所以在这种情况下,更喜欢malloc

double *arr = (double *)malloc(3 * sizeof(double));

现在仍然存在内存泄漏!当然,操作系统会为你清理这些,因为进程无论如何都会终止,但从一开始就要使用,直到考虑在这样做的时候(甚至在…之前(释放任何动态分配的内存。否则,你将在运行时间较长的进程上遇到内存泄漏。

甚至更好:在堆栈上分配数组,如果不是太大;在这种情况下,您甚至可以立即初始化它:

double arr[] = { 10.0, 20.0, 30.0 }; // size is calculated by compiler

最后,在这种情况下,您根本不需要阵列:

printf("%f %f %f

实际上,您甚至根本不需要动态分配的数组:

printf("%f %f %f", 10.0, 20.0, 30.0);

只需确保使用正确的文字(10, 20, 30将提供三个int值,编译器也会接受这些值,但会引发未定义的行为,因为它们与格式说明符所需的类型不匹配(。

相关内容

  • 没有找到相关文章

最新更新