2

vector_int.h は、自作の動的配列 (ベクター) 構造を持つヘッダーです。

test.c はテスト プログラムです。

すべてのコードは次のとおりです。

vector_int.h:

#include <stdio.h>

typedef struct 
{
    long int len; // Length
    int *array;   // Dynamic Array
} IntVector; 

void ResizeIntVector(IntVector *vector, int size) // Resizing of vector
{
    realloc(vector->array, size * sizeof(int));
    vector->len = size; // Changing of length variable
}

void SetIntVectorCell(IntVector *vector, unsigned int cell_number, int cell_value) // Put cell_value in array[cell_number]
{
    if (cell_number >= vector->len)
        ResizeVectorInt(&vector, cell_number); // Grow size of memory if it's not enough

    vector->array[cell_number] = cell_value;
}

test.c:

#include "vector_int.h"
#include <stdio.h>

int main()
{
    IntVector vector;

    int n;
    scanf("%d", &n);

    int i;
    for (i = 0; i < n; i++) // testing
    {
        SetIntVectorCell(&vector, i, i);
        printf("%d ", vector.array[i]);
    }

    return 0;       
}

ログ:

1   0   D:\Work\Raspberry Pi\test.c In file included from D:\Work\Raspberry Pi\test.c
        D:\Work\Raspberry Pi\vector_int.h   In function 'ResizeIntVector':
11  2   D:\Work\Raspberry Pi\vector_int.h   [Warning] incompatible implicit declaration of built-in function 'realloc' [enabled by default]
            [Linker error] C:\Users\ALEXAN~1\AppData\Local\Temp\cccFKqxs.o:test.c:(.text+0x4a): undefined reference to `ResizeVectorInt'
            collect2: ld returned 1 exit status

realloc関数の使い方に誤りがあると思いますが、大丈夫だと思いました。私を助けて、間違いや間違いを見つけてください。

4

2 に答える 2

9

いくつかの問題があります。

  • 問題は、署名にimplicit declaration/realloc含める必要があるためです。関数シグネチャがないと、コンパイラは関数の引数と戻り値についていくつかの仮定を行い、リンク中に、これらの仮定が実際の関数実装と一致しない場合、リンカーはこれについて不平を言います。stdlib.hrealloc

  • realloc初期化されていないアドレスを渡しています。これはトラブルを求めています。vector変数を使用する前に、初期化を行います。

    vector->array = NULL;
    vector->len = 0;
    
  • さらに、の使用法reallocが正しくありません。指定した実際のポインターは変更されず、指しているメモリブロックのサイズのみが変更されます。ポインターを自分で再割り当てする必要があります。realloc失敗すると戻る可能性があることに注意してNULLください。次のようにします。

    tmp = realloc(vector->array, size * sizeof(int));
    
    if (tmp != NULL)
    {
        vector->array = tmp;
        vector->len = size; // Changing of length variable
    }
    else handleAllocError();
    
  • 最後に、ヘッダーで関数を定義しないでください。これはvector_int.c機能しますが、ヘッダーで宣言された関数を定義する実装ファイルを用意することをお勧めします。

于 2012-08-03T20:22:26.103 に答える
0

ここにが必要+1です:

    ResizeVectorInt(&vector, cell_number + 1); // Grow size of memory if it's not enough
于 2012-08-03T20:23:04.933 に答える