2016-07-11 7 views
0

追加:マルコフ連鎖。実装は、私は、実装の次なステートメントを有するビット混乱しています方法

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(接頭辞、接頭辞+ 1、(NPREF - 1)*はsizeof(接頭辞[0]));

したがって、接頭辞はchar型のポインタです。この場合、接頭辞+ 1は配列内の次の文字へのリンクです。そうではありませんか?

どのように正常に動作しますか?私はmemmoveについて読んだことがありますが、ポインタについては読んでいますが、この関数を自分自身で追加することはできませんでした。

+0

のprintf( "接頭辞%dの大きさ"、および接頭辞)。間違っている – 4pie0

+0

私はちょうど答えを得ようとしています。私のprintf関数を気にしないでください。質問はそれに関するものではありません。 –

答えて

1

したがって、接頭辞はcharのポインタです。この文脈でprefix + 1は であり、次に配列へのcharへのリンクはありますか?

いいえはい。 prefixcharへのポインタではなく、charへのポインタのNPREFの配列です。この配列のサイズは

assert(sizeof(prefix) == NPREF * sizeof(char*) 

であり、配列の最初の要素へのポインタに減衰する(配列である)prefixためはいprefix + 1&prefix[0]後の次のエレメントのアドレスです。 だから、

memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0])); 

意志一つの場所によってmommoveNPREF - 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] 
+0

ああ、ありがとうございました。あなたは私の一日を作った。 –

0

memmoveがn-1ポインタを後方に一歩を移動します。

は、2つの異なる配列に動作するmemcpyとして第二のためにそれを検討してください:

prefix 
V  
[ ][ ][ ][ ][ ][ ] 
^^^^^ 
\ \ \ \ \ 
    \ \ \ \ \ 
    \ \ \ \ \ 
    \ \ \ \ \ 
[ ][ ][ ][ ][ ][ ] 
    ^
    prefix+1 
関連する問題