gpt4 book ai didi

c - 有没有可以正确重构这段C代码的工具?

转载 作者:太空宇宙 更新时间:2023-11-04 04:00:33 24 4
gpt4 key购买 nike

假设我有以下代码(array* 函数是我们用于可调整大小的数组的函数,它们对初始化为 null 的数组指针进行操作):

typedef struct MyStruct
{
int i;
} MyStruct;

MyStruct* GetNewMyStruct(int i)
{
MyStruct* s = malloc(sizeof(MyStruct));
s->i = i;
return s;
}

int SomeFunction(int number, MyStruct *elem)
{
MyStruct **structs = NULL;
int i;
for (i = 0; i < number; i++)
arrayPush(&structs, GetNewMyStruct(i));
arrayPush(&structs, elem);
return arraySize(&structs);
}

我认为 SomeFunction 太大,我想重构它。目前我工作的地方使用 VisualAssist X,它具有一些重构功能,但是当我在此使用它时,它无法正常工作。如果我尝试使用它来重构循环,这就是我得到的:

void MyMethod( int number, MyStruct ** structs ) 
{
int i;
for (i = 0; i < number; i++)
arrayPush(&structs, GetNewMyStruct(i));
}

int SomeFunction(int number, MyStruct *elem)
{
MyStruct **structs = NULL;
MyMethod(number, structs);
arrrayPush(&structs, elem);
return arraySize(&structs);
}

这是不正确的。 MyMethod 应该采用 MyStruct ***,而不是 MyStruct **。这是因为我正在重构的代码采用了 structs 的地址。结果是重构版本将始终返回 1(因为只有一个对象被插入我的数组)而不是 number+1。是否有其他工具可以正确执行此类重构?

最佳答案

Eclipse CDT 正确地做到了这一点(至少是当前版本的 Juno)。选择 i 和循环的声明并执行 Refactor > Extract Function,并将 structs 设置为输出参数,产生:

void MyMethod(int number, MyStruct*** structs) {
int i;
for (i = 0; i < number; i++)
arrayPush(&*structs, GetNewMyStruct(i));
}

int SomeFunction(int number, MyStruct *elem)
{
MyStruct **structs = NULL;
MyMethod(number, &structs);
arrayPush(&structs, elem);
return arraySize(&structs);
}

关于c - 有没有可以正确重构这段C代码的工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com