おはようございます。Sun Solaris OS 5.8 の int * キャストに関連するセグメンテーション エラーを gcc バージョン 3.3 で修正できますか? gdb 変数の値を以下に示します。cOrderedList クラスのメンバー変数を以下に示します。uname -a と gcc -v の出力を以下に示します。
このコードは、Windows Visual Studio C++ 9.0 で正常に動作します。ありがとうございます。
【新LWP1】 プログラム受信信号 SIGSEGV、セグメンテーション違反。 cOrderedList::LoadDatabaseRecords(cSQLite*, char const*) の 0xff064b04 ( this=0x68f10、データベース_=0xa4ba8、 Command_=0xffbed468 "SELECT * FROM LeftPattern") ../Source/cOrderedList.cpp:272 で 272 *((int*) (Records+RecordCount*RecordSize+FieldOffsets[i]))=Database_->ColumnInt(i); (gdb) プリント i $3 = 3 (gdb) 印刷レコード $4 = 0xa0800 "" (gdb) レコード数を出力 $5 = 0 (gdb) プリントレコードサイズ $6 = 50 (gdb) フィールドオフセット[i] を印刷 $7 = 46
class cOrderedList {
private:
enum eFieldTypes {
Character,
Integer
};
bool CopyConstructed;
int RecordCount;
int FieldCount;
int RecordSize;
char *Records;
int *FieldSizes,*FieldOffsets;
eFieldTypes *FieldTypes;
char *CurrentPos;
$ ウナメ -a SunOS 5.8 Generic_108528-22 sun4u sparc SUNW、Sun-Fire-V210 $ gcc -v /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/specs から仕様を読み取る 構成: ../configure --disable-nls --with-as=/usr/ccs/bin/as --with-ld= /usr/ccs/bin/ld スレッドモデル: posix
bool cOrderedList::LoadDatabaseRecords(cSQLite *Database_,const char *Command_) {
int retVal;
char str[4096];
RetrySQL:
RecordCount=0;
Database_->Prepare(Command_);
while ((retVal=Database_->Step())!=SQLITE_DONE) {
switch (retVal) {
case SQLITE_ROW:
for (int i=0;i<FieldCount;i++) {
if (FieldTypes[i]==Integer) {
*((int*) (Records+RecordCount*RecordSize+FieldOffsets[i]))=Database_->ColumnInt(i);
} else {
Database_->ColumnText(i,str);
LTrim(str);
RTrim(str);
#if defined(_DEBUG)
if ((int) strlen(str)>=FieldSizes[i])
printf("Field not large enough: %s\n",Command_);
#endif
strncpy(Records+RecordCount*RecordSize+FieldOffsets[i],str,FieldSizes[i]);
Records[RecordCount*RecordSize+FieldOffsets[i]+FieldSizes[i]-1]='\x0';
}
}
RecordCount++;
break;
case SQLITE_BUSY:
continue;
case SQLITE_MISUSE:
goto RetrySQL;
default:
break;
}
}
return true;
}