0

以下のコードは GCC 4.2 では問題なく動作しますが、LLVM GCC 4.2 では EXC_BAD_ACCESS で失敗します。

- (double_t)readDouble  {
    double_t *dt = (double_t *)(buffer+offset);
    double_t ret = *dt; // Program received signal: EXC_BAD_ACCESS
    offset += 8;
    return ret;
}

そう割り振ってます

int dataLength = [data length];
buffer = malloc(dataLength + 1);
buffer[dataLength] = 0; // null terminate to log
[data getBytes:(void *)buffer length:[data length]];
//NSLog(@"%s", buffer);

オフセットとバッファは似ています

@interface PRDataSet : NSObject {

    NSMutableArray *tables;
    NSMutableDictionary *tablesByName;
    NSMutableDictionary *tablesById;

@private
    NSURLConnection *conn;
    int offset;
    char *buffer;

}

はい、オフセットは範囲内です。使用する前にバッファーを解放しません。

何か案は?

4

2 に答える 2

2

これはアライメントの問題である可能性があります。ARM プロセッサ (および他の多くのプロセッサ) には、データ アライメントに関する制限があります。たとえば、4 または 8 の倍数であるアドレスからのみ浮動小数点数を読み書きできます。

コードでのバッファーの割り当て方法から、適切に割り当てられていないか、double_tデータ要素がバッファー内で整列されていない可能性があります。

この問題を回避するには、まずデータをアラインされたバッファにコピーし、そこから読み取るようにしてください。

于 2011-05-20T14:07:52.040 に答える
1

LLVM は float を直接読み取らないだけです。

解決策は次のとおりです。

- (uint32_t)readUInt32  {
    uint32_t ret = *(uint32_t *)(buffer+offset);
    offset += 4;
    return ret;
}

- (uint16_t)readUInt16  {
    uint16_t ret = *(uint16_t *)(buffer+offset);
    offset += 2;
    return ret;
}

- (uint64_t)readUInt64  {
    uint64_t ret = *(uint64_t *)(buffer+offset);
    offset += 8;
    return ret;
}

- (float_t)readSingle  {
    uint32_t t = [self readUInt32];
    float_t ret = *((float_t *)(&t));
    return ret;
}

- (double_t)readDouble  {
    uint64_t t = [self readUInt64];
    double_t ret = *((double_t *)(&t));
    return ret;
}
于 2011-05-21T13:47:50.640 に答える