私は C++ の使用にかなり慣れていませんが、64 ビット XP プラットフォームで matlab 用のバージョン 2.0.2 のSBML ツールボックスをコンパイルしようとしています。SBML ツールボックスは、 Xerces 2.8 とlibsbml 2.3.5に依存しています。
ツールボックスを 32 ビット マシン上でビルドおよびコンパイルすることができました。テストすると動作します。しかし、64 ビット マシンで再構築した後 (これは非常に残念です!)、長い .xml ファイルを読み込もうとすると、セグメンテーション エラーが発生します。
この問題は、ポインター アドレスの問題が原因であると思われます。
セグメンテーション違反からのスタック トレースは次のように始まります。
[ 0] 000000003CB3856E libsbml.dll+165230 (StringBuffer_append+000030) [ 6] 000000003CB1BFAF libsbml.dll+049071 (EventAssignment_createWith+001631) [ 12] 000000003CB1C1D7 libsbml.dll+049623 (SBML_formulaToString+000039) [ 18] 000000003CB2C154 libsbml.dll+115028 (
だから私は libsbml コードの StringBuffer_append 関数を見ています:
LIBSBML_EXTERN
void
StringBuffer_append (StringBuffer_t *sb, const char *s)
{
unsigned long len = strlen(s);
StringBuffer_ensureCapacity(sb, len);
strncpy(sb->buffer + sb->length, s, len + 1);
sb->length += len;
}
ensureCapacity は次のようになります。
LIBSBML_EXTERN
void
StringBuffer_ensureCapacity (StringBuffer_t *sb, unsigned long n)
{
unsigned long wanted = sb->length + n;
unsigned long c;
if (wanted > sb->capacity)
{
/**
* Double the total new capacity (c) until it is greater-than wanted.
* Grow StringBuffer by this amount minus the current capacity.
*/
for (c = 2 * sb->capacity; c < wanted; c *= 2) ;
StringBuffer_grow(sb, c - sb->capacity);
}
}
StringBuffer_grow は次のようになります。
LIBSBML_EXTERN
void
StringBuffer_grow (StringBuffer_t *sb, unsigned long n)
{
sb->capacity += n;
sb->buffer = (char *) safe_realloc(sb->buffer, sb->capacity + 1);
}
それは可能性が高いですか?
strncpy(sb->buffer + sb->length, s, len + 1);
StringBuffer_append は私のセグメンテーション違反の原因ですか?
もしそうなら、誰かが修正を提案できますか?私は本当に C++ を知りません。ポインタとメモリのアドレス指定に特に戸惑っています。そのため、あなたが何について話しているのかわからない可能性があります。手を握る必要があります。
また、他の誰かが Microsoft Visual C++ Express Edition を使用して 64 ビット システム用に C++ をコンパイルしようとしている場合に備えて、ビルド プロセスの詳細をここにオンラインで公開します。
前もって感謝します!
-ベン