c - 如何自动重构 C for 循环
问题描述
我有一个非常大的旧代码库,我正在慢慢更新。
在大部分代码中,有一些for loops
基本的数学例程,我想回调一个函数,即改变
for(int i=0;i< NUM_EL; i++)
{
x[i] = a[i] * b[i];
}
至
vector_multiply(a,b,x,NUM_EL);
vector_multiply 的原型在哪里
void vector_multiply(const double *a, const double * b, double *x, int num_el);
是否有任何东西可以扫描您的源代码并将标准数学运算转换为回调例程?
更具体地说,会更改您的代码以自动在您的代码中进行 blas 回调吗?
我猜我可以使用 libclang 来做到这一点。
解决方案
我不相信这可以在没有引入错误的可能性的情况下全自动完成。
但是,您可以使用 perl 脚本并手动查看更改。
perl -0777 -pe 's/for\s*\(\s*int\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*0;\s*\1\s*<\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*;\s*\1\s*\+\+\s*\)\s*\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\[\1\]\s*=\s*([a-zA-Z_][a-zA-Z0-9_]*)\[\1\]\s*\*\s*([a-zA-Z_][a-zA-Z0-9_]*)\[\1\]\s*;\s\}/vector_multiply(\4,\5,\3,\2);/igs' test.c
推荐阅读
- google-cloud-platform - 无法使用 Google Cloud Function 从 Google Pub/Sub 获取数据到 BigQuery
- reactjs - 为什么 shouldComponentUpdate 钩子在 React 中不起作用?
- php - 无法在 Symfony 4 自定义包中声明类错误
- python - 使用 Python argparse 命名参数
- mysql - 在 laravel 6.0 中使用 belongsToMany 方法时,sql 查询是什么样的?
- excel - 如何修复“不将范围复制到新行”
- react-native - 安装用于条码扫描的反应本机相机后无法运行反应本机应用程序
- android - 如何解决安装 APK 文件时出现的错误?
- android - 允许活动显示在 Android 上展开的状态栏/通知面板上方
- javascript - 如何更改颜色:Vue.js 的 AntD 菜单组件中 ant-menu-submenu-arrow 的悬停?