2

私は楽しみのために配列構造を開発しています。テンプレート パラメーターによって一般化されたこの構造体は、起動時に指定された数のアイテムを事前に割り当てます。次に、「ビジー」なアイテムが使用可能なアイテムよりも多い場合、関数は内部バッファーを再割り当てします。テストコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

template <typename T> struct darray_t {
    size_t items;
    size_t busy;
    T     *data;
};

#define DARRAY_REALLOC_ITEMS_STEP 10

#define da_size(da) (da)->busy

template <typename T>
void da_init( darray_t<T> *da, size_t prealloc ){
    da->items = prealloc;
    da->busy  = 0;
    da->data  = (T *)malloc( sizeof(T) * prealloc );
}

template <typename T> T *da_next( darray_t<T> *da ){
    if( da->busy >= da->items ){
        da->data   = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );
        da->items += DARRAY_REALLOC_ITEMS_STEP;
    }
    return &da->data[ da->busy++ ];
}

int main(){
    darray_t<int> vi;
    int *n;

    da_init( &vi, 100 );

    for( int i = 0; i < 101; ++i ){
        n = da_next(&vi);
        *n = i;
    }

    for( int i = 0; i < da_size(&vi); ++i ){
        if( vi.data[i] != i ){
            printf( "!!! %d != %d\n", i, vi.data[i] );
        }
    }

    return 0;
}

ご覧のとおり、最初に 100 個の整数ポインターを事前に割り当ててから、さらに 10 個のポインターを使用してそれらを再割り当てします。メイン関数では、for ループを実行して項目の整合性をチェックし、配列項目が期待どおりでない場合は、その値を出力して ... わかりますか? 次のメッセージがあります。

!!! 11 != 135121

実際、'11' であるべきインデックス 11 の項目は 135121 です !!!! :S

私のコードが正しくないかどうか教えてもらえますか?

ありがとう

: このように C と C++ を混在させるのは見苦しいことを私は完全に知っています。また、この構造を使用すると台無しになることも知っています。

darray_t<std::string>

これは int ポインタの単なるテストです。

4

2 に答える 2

3

reallocはメモリの一部を自動的に拡張しません-それを行う必要があります。例:

da->data=(T*)realloc(da->data, sizeof(T)*(da->items+DARRAY_REALLOC_ITEMS_STEP));

(そして、NULLを返すreallocを処理する必要があります)

于 2010-05-26T10:35:13.567 に答える
1

ブロックのサイズが正しくありません:

da->data   = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );

ブロック全体は増分と同じ大きさです。試す

da->busy + sizeof(T) * DARRAY_REALLOC_ITEMS_STEP
于 2010-05-26T10:35:12.757 に答える