duff 设备不工作
duff device not working
我已经尝试实现 Duff 设备,但它不起作用。它不复制任何东西。我已经实现了原始版本和更清晰的版本:
void duff_function(int *a, int *b, int length)
{
int n = (length + 7) / 8;
switch(length % 8)
{
case 0: *a++ = *b++; // I dereference, copy, and then increment the pointer, * > ++
case 7: *a++ = *b++;
case 6: *a++ = *b++;
case 5: *a++ = *b++;
case 4: *a++ = *b++;
case 3: *a++ = *b++;
case 2: *a++ = *b++;
case 1: *a++ = *b++;
}
while ( --n > 0)
{
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
}
}
void send(int *to, int *from, int count)
{
int n=(count+7)/8;
switch(count%8){
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while( --n>0);
}
}
int main()
{
int a[10] = {21, 34, 12, 64, 13, 9, 56, 54, 90, 1};
int b[10] = {22};
for (int i = 0; i < 10; ++i)
{
printf("%d, ", a[i]);
}
printf("\n");
duff_function(a, b, 10);
//send(a, b, 10);
for(int i = 0; i < 10; ++i)
printf("%d, ", b[i]);
printf("\n");
return 0;
}
输出为:
21, 34, 12, 64, 13, 9, 56, 54, 90, 1,
22, 0, 0, 0, 0, 0, 0, 0, 0, 0,
它不复制任何东西。
在原始版本中,由于某种原因它没有增加指向的指针,但我认为我应该增加它(我在我的函数中这样做)。
编辑
据报道,我的代码中存在错误:
我已经更改了它:
send(b, a, 10);
但现在输出是:
1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
编辑 2
使代码工作的最后编辑:
duff_function(b, a);
您正在从 b
复制到 a
,但您想从 a
复制到 b
。
将每个 *a++ = *b++;
更改为 *b++ = *a++;
你也可以只做memcpy(b, a, length * sizeof *a);
这个函数:
void send(int *to, int *from, int count)
{
int n=(count+7)/8;
switch(count%8)
{
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while( --n>0);
}
}
包含几个问题。
1) the while statement
places the majority of the switch case statements
at a different scope level from the first case statement.
2) stepping through the code
int n = (10+7)%8 = 2
switch(2)
(jumping into the center of a do/while loop is
a very poor program practice)
do{
case 2: *to = *from++;
case 1: *to = *from++; // which overlays the prior line
} while( --n >0 ) // on first pass decrement 'n' to 1
case 7: overlays prior *to with from[2]
case 6: overlays prior *t0 with from[3]
case 5: ... from[4]
case 4: ... from[5]
case 3: ... from[6]
case 2: ... from[7]
case 1" ... from[8]
while( --n >0 ) fails, exiting loop
final result, *to = from[8]
这可能不是您想做的
我已经尝试实现 Duff 设备,但它不起作用。它不复制任何东西。我已经实现了原始版本和更清晰的版本:
void duff_function(int *a, int *b, int length)
{
int n = (length + 7) / 8;
switch(length % 8)
{
case 0: *a++ = *b++; // I dereference, copy, and then increment the pointer, * > ++
case 7: *a++ = *b++;
case 6: *a++ = *b++;
case 5: *a++ = *b++;
case 4: *a++ = *b++;
case 3: *a++ = *b++;
case 2: *a++ = *b++;
case 1: *a++ = *b++;
}
while ( --n > 0)
{
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
*a++ = *b++;
}
}
void send(int *to, int *from, int count)
{
int n=(count+7)/8;
switch(count%8){
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while( --n>0);
}
}
int main()
{
int a[10] = {21, 34, 12, 64, 13, 9, 56, 54, 90, 1};
int b[10] = {22};
for (int i = 0; i < 10; ++i)
{
printf("%d, ", a[i]);
}
printf("\n");
duff_function(a, b, 10);
//send(a, b, 10);
for(int i = 0; i < 10; ++i)
printf("%d, ", b[i]);
printf("\n");
return 0;
}
输出为:
21, 34, 12, 64, 13, 9, 56, 54, 90, 1,
22, 0, 0, 0, 0, 0, 0, 0, 0, 0,
它不复制任何东西。 在原始版本中,由于某种原因它没有增加指向的指针,但我认为我应该增加它(我在我的函数中这样做)。
编辑 据报道,我的代码中存在错误: 我已经更改了它:
send(b, a, 10);
但现在输出是:
1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
编辑 2 使代码工作的最后编辑:
duff_function(b, a);
您正在从 b
复制到 a
,但您想从 a
复制到 b
。
将每个 *a++ = *b++;
更改为 *b++ = *a++;
你也可以只做memcpy(b, a, length * sizeof *a);
这个函数:
void send(int *to, int *from, int count)
{
int n=(count+7)/8;
switch(count%8)
{
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while( --n>0);
}
}
包含几个问题。
1) the while statement
places the majority of the switch case statements
at a different scope level from the first case statement.
2) stepping through the code
int n = (10+7)%8 = 2
switch(2)
(jumping into the center of a do/while loop is
a very poor program practice)
do{
case 2: *to = *from++;
case 1: *to = *from++; // which overlays the prior line
} while( --n >0 ) // on first pass decrement 'n' to 1
case 7: overlays prior *to with from[2]
case 6: overlays prior *t0 with from[3]
case 5: ... from[4]
case 4: ... from[5]
case 3: ... from[6]
case 2: ... from[7]
case 1" ... from[8]
while( --n >0 ) fails, exiting loop
final result, *to = from[8]
这可能不是您想做的