我编译了一个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
值,编译器也会接受这些值,但会引发未定义的行为,因为它们与格式说明符所需的类型不匹配(。