gpt4 book ai didi

c - 如何在传递给函数后撤消对数组的更改

转载 作者:行者123 更新时间:2023-11-30 17:32:14 24 4
gpt4 key购买 nike

在我更改数组后,有什么方法可以撤消操作或获取原始数组,如下所示。

#include <stdio.h>

void function(int array[]){

array[2] = 20;

//do some extra work
return;
}

int main(void){

int array[5] = {1,2,3,4,5};

function(array);

// code which has to use original array

return 0;
}

最佳答案

您可以将两个 32 位整数(旧/新)打包为一个 64 位整数,例如:

#include <stdio.h>
#include <stdint.h>

void function(int64_t array[])
{
array[2] = (array[2] << 32) | 20;
}

void printarr(int64_t array[], size_t n)
{
size_t i;

for (i = 0; i < n; i++) {
printf("%d ", (int32_t)(array[i]));
}
printf("\n");
}

int main(void)
{
int64_t array[] = {1, 2, 3, 4, 5};
size_t i, n = sizeof(array) / sizeof(array[0]);

function(array);
puts("After function:");
printarr(array, n);
for (i = 0; i < n; i++) {
if (array[i] >> 32 != 0) /* Changed */
array[i] = array[i] >> 32; /* Undo */
}
puts("Original values:");
printarr(array, n);
return 0;
}

输出:

After function:
1 2 20 4 5
Original values:
1 2 3 4 5

注意:

当然,如果您使用短值以节省一些空间,则可以将两个 16 位整数打包在一个 32 位整数中。

可移植使用PRId32 <inttyes.h> 的格式(在 printf 中定义)和int32_t :

printf("%"PRId32" ", (int32_t)x);

另一种方法:

如果这些更改是在正整数上连续进行的,您可以更改符号(以标识更改)并使用 realloc 仅存储更改:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int *value;
size_t length;
} t_undo;

void function(t_undo *undo, int array[], int index, int value)
{
undo->value = realloc(undo->value, sizeof(int) * (undo->length + 1));
/* check realloc */
undo->value[undo->length++] = array[index];
array[index] = -value;
}

void printarr(int array[], size_t n)
{
size_t i;

for (i = 0; i < n; i++) {
printf("%d ", abs(array[i]));
}
printf("\n");
}

int main(void)
{
t_undo *undo;
int array[] = {1, 2, 3, 4, 5};
size_t i, j = 0, n = sizeof(array) / sizeof(array[0]);

undo = malloc(sizeof(*undo));
/* check malloc */
undo->value = NULL;
undo->length = 0;
function(undo, array, 2, 20);
puts("After function:");
printarr(array, n);
for (i = 0; i < n; i++) {
if (array[i] < 0) /* Changed */
array[i] = undo->value[j++]; /* Undo */
}
puts("Original values:");
printarr(array, n);
free(undo->value);
free(undo);
return 0;
}

关于c - 如何在传递给函数后撤消对数组的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24301552/

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