0

ここで質問#3367795を解決するために、多くの副問題に対処する必要があります。これらの1つは次のとおりです。上記のアルゴリズム(レーベンシュタイン距離)では、いくつかの配列がメモリに割り当てられ、次の行で初期化されます

cdef char   *m1     = <char *>calloc(   blen + 2,    sizeof( char ) )
cdef char   *m2     = <char *>calloc(   blen + 2,    sizeof( char ) )
cdef char   *m3     = <char *>malloc( ( blen + 2 ) * sizeof( char ) )
#.........................................................................
for i from 0 <= i <= blen:
  m2[ i ] = i
  <...snip...>

blenbytesここでは、Python変数の長さを参照します。今、私がアルゴリズムを理解している限り(完全なコードについては私の元の投稿を参照してください)、初期化のコードがm2明確に示すように、これらの配列は文字ではなく整数を保持することを意図しているため、正しい割り当てはお気に入り

cdef int    *m3     = <int *>malloc( ( blen + 2 ) * sizeof( int ) )

等々。C のバックグラウンドを持つ人は、なぜcharが使用されているのかを説明できますか? また、おそらく Cython に傾倒している人々にとっては、キャストがあるのはなぜ<char *>ですか? char *x = malloc( ... )を定義するのに十分なはずだと思うでしょうx

4

2 に答える 2

8

誤解を招くような名前にもかかわらず、 C言語の型は、、などのようにchar通常の整数型です。すべての整数型の中で、sは最小の範囲を持ち、最小のメモリ量を占有します。したがって、アプリケーションでできるだけ多くのメモリを節約することが重要な場合は、の代わりにを使用するのが理にかなっている場合があります。shortintlongcharcharint

int一部のハードウェアプラットフォームでは、タイプがタイプよりも高速に動作することが判明する場合charがあるため、特定のタイプの選択は速度とメモリのトレードオフになりますが、多くの場合、範囲charが当然十分である場合は、charの代わりに使用する方が理にかなっている場合がありintます。

于 2010-07-31T21:14:51.123 に答える
2

char簡単に言えば、メモリを節約するためですが、これらの配列を として宣言すると、C コンパイラのデフォルトが 127 か 255 かによって、結果の距離が 127 または 255 に制限signed charされることに注意してくださいunsigned char。C では、charは整数型ですord()。整数値を取得するために は必要ありません。

元のコードには、この制限についての言及が含まれていません。オーバーフローした場合、暗黙のうちにオーバーフローが行われ、コードが誤った結果を生成することに注意してくださいchar-- 127 + 1 -> -128 (符号付き)。255 + 1 -> 0 (符号なし)。

あなたは最初の質問に対する私のコメントに応答しませんでした: """あなたの文字列の (a) 最大 (b) 平均サイズは何ですか? 2 つが文字列はお互いに似ていませんか?""" .....今すぐ答えてください(質問を編集してください); もしそうしていたら、その時にこの質問に答えていたでしょう。

更新: 元の投稿をもう一度読んで、問題に気付きました: 読み取るコード

m1, m2 = m2, m1
strcpy( m3, m2 )

3つの理由で間違っています:(1)行を適切にシャッフルしない(strcpy()スワップする前に行う必要がm1ありますm2)、(2)strcpy()最初のヌル(ゼロバイト)を超えて何もコピーしない、(3)何もコピーする必要がない、ポインタをシャッフルするだけ

m3, m2, m1 = m2, m1, m3
于 2010-07-31T21:28:01.830 に答える