как автоматический рефакторинг C для циклов - PullRequest
0 голосов
/ 10 октября 2018

У меня очень большая база старого кода, которую я медленно обновляю.

Во всех больших частях кода есть 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);

Есть ли что-нибудь, что сканирует ваш исходный код и конвертирует стандартные математические операциик процедурам обратного вызова?

более конкретно, изменили бы ваш код, чтобы автоматически выполнять обратные вызовы blass в вашем коде?

Я предполагаю, что я мог бы использовать libclang для этого.

1 Ответ

0 голосов
/ 10 октября 2018

Я не верю, что это можно сделать полностью автоматически без возможности появления ошибок.

Однако вы можете использовать скрипт на 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
...