马尔可夫链。实现添加方法
Markov chain. Implementation add method
我对实施中的下一个陈述有点困惑:
void add(char *prefix[NPREF], char *suffix) {
State *sp;
sp = lookup(prefix, 1);
//addsuffix(sp, suffix);
printf("size of prefix %d",&prefix);
printf("size of prefix %s", prefix + 1);
printf("size of prefix %d \n", &prefix+1);
for (int i = 0; i < NPREF; i++)
printf("%s \n" , prefix[i]);
printf("memmove \n");
memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
prefix[NPREF - 1] = suffix;
for (int i = 0; i < NPREF; i++)
printf("%s \n", prefix[i]);
}
mmemove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
所以prefix是一个char类型的指针。在这个术语中,前缀 + 1 是数组中下一个字符的 link,不是吗?
它是如何以正确的方式工作的?我已经阅读了有关 memmove 和有关指针的信息,但无法为自己探索此添加功能行为。
So prefix is a pointer of type char
. In this terms prefix + 1
is
the link to the next char
in the array, isn't it?
不,是的。 prefix
不是指向 char
的指针,它是指向 char
的 NPREF
指针的数组。这个数组的大小是
assert(sizeof(prefix) == NPREF * sizeof(char*)
是的 prefix + 1
是 &prefix[0]
之后的下一个元素的地址,因为 prefix
(数组)衰减到指向数组第一个元素的指针。
所以
memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
将 mommove
NPREF - 1
个元素放在一个位置。考虑到什么是马尔可夫链,这听起来很合理,但我们看不到您的实现。如果改为
memmove(&prefix, &prefix + 1, sizeof(prefix)/sizeof(prefix[0]);
然后它将 memmove
整个数组。
示例:
[0][1][2][3][4][5]...[n] /* prefix was */
[A][B][C][D][E][F]...[N]
memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
[0][1][2][3][4][5]...[n] /* prefix is */
[A][A][B][C][D][E]...[M]
memmove
将 n-1 个指针向后移动一步。
暂时将其视为 memcpy
,它在 2 个不同的数组上运行:
prefix
V
[ ][ ][ ][ ][ ][ ]
^ ^ ^ ^ ^
\ \ \ \ \
\ \ \ \ \
\ \ \ \ \
\ \ \ \ \
[ ][ ][ ][ ][ ][ ]
^
prefix+1
我对实施中的下一个陈述有点困惑:
void add(char *prefix[NPREF], char *suffix) {
State *sp;
sp = lookup(prefix, 1);
//addsuffix(sp, suffix);
printf("size of prefix %d",&prefix);
printf("size of prefix %s", prefix + 1);
printf("size of prefix %d \n", &prefix+1);
for (int i = 0; i < NPREF; i++)
printf("%s \n" , prefix[i]);
printf("memmove \n");
memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
prefix[NPREF - 1] = suffix;
for (int i = 0; i < NPREF; i++)
printf("%s \n", prefix[i]);
}
mmemove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
所以prefix是一个char类型的指针。在这个术语中,前缀 + 1 是数组中下一个字符的 link,不是吗?
它是如何以正确的方式工作的?我已经阅读了有关 memmove 和有关指针的信息,但无法为自己探索此添加功能行为。
So prefix is a pointer of type
char
. In this termsprefix + 1
is the link to the nextchar
in the array, isn't it?
不,是的。 prefix
不是指向 char
的指针,它是指向 char
的 NPREF
指针的数组。这个数组的大小是
assert(sizeof(prefix) == NPREF * sizeof(char*)
是的 prefix + 1
是 &prefix[0]
之后的下一个元素的地址,因为 prefix
(数组)衰减到指向数组第一个元素的指针。
所以
memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
将 mommove
NPREF - 1
个元素放在一个位置。考虑到什么是马尔可夫链,这听起来很合理,但我们看不到您的实现。如果改为
memmove(&prefix, &prefix + 1, sizeof(prefix)/sizeof(prefix[0]);
然后它将 memmove
整个数组。
示例:
[0][1][2][3][4][5]...[n] /* prefix was */
[A][B][C][D][E][F]...[N]
memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
[0][1][2][3][4][5]...[n] /* prefix is */
[A][A][B][C][D][E]...[M]
memmove
将 n-1 个指针向后移动一步。
暂时将其视为 memcpy
,它在 2 个不同的数组上运行:
prefix
V
[ ][ ][ ][ ][ ][ ]
^ ^ ^ ^ ^
\ \ \ \ \
\ \ \ \ \
\ \ \ \ \
\ \ \ \ \
[ ][ ][ ][ ][ ][ ]
^
prefix+1