0

Cでは、特定の種類の新しいデータ(現在の温度を示すfloat値としましょう)を時々受け取る構造が必要です。ここでの問題は、時間の経過とともに取得するそのようなデータの数がわからないことです (ソフトウェアを開いたままにしておく時間が長いほど、より多くのデータを受け取ることになります)。また、構造体のデータ量を制限したくないことです。受け入れます。

Cでこれを行うにはどうすればよいですか?

リレーションを作成するには、C++ で Vector または List を使用して構造体を宣言し、新しいデータが発生するたびに vector::push_back(T) を継続的に呼び出し、PC のすべてのメモリが解放されるまでこれを行うことができます。消費されます。さて、私の知る限り、Cで利用可能なベクトルやリストなどのコンテナはありません。これを行う方法は?

ありがとう、

モメルギル

4

3 に答える 3

2

これが私が今書いた例です:

main.c

#include "queue.h"

int main() {
    vector_handle v = vector_create();

    int i;
    for (i=0; i<100; ++i)
        vector_push(v, 0.5 * i);

    for (i=0; i<vector_size(v); ++i)
        printf("data: %f\n", vector_data(v)[i]);

    vector_destroy(v);
}

queue.h

#pragma once
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct vector * vector_handle;

vector_handle vector_create();
void vector_destroy(vector_handle vector);
void vector_realloc(vector_handle vector);
size_t vector_size(vector_handle vector);
float * vector_data(vector_handle vector);
void vector_push(vector_handle vector, float data);
float vector_pop(vector_handle vector);

queue.c

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

#include "queue.h"

struct vector {
    float *data;
    size_t size;
    size_t capacity;
};

struct vector * vector_create() {
    struct vector *object = malloc(sizeof(struct vector));
    object->size = 0;
    object->capacity = 16;
    object->data = malloc(sizeof(float) * object->capacity);
    return object;
}

void vector_destroy(struct vector *object) {
    free(object->data);
    free(object);
}

void vector_realloc(struct vector *object) {
    object->capacity *= 2;
    object->data = realloc(object->data, sizeof(float) * object->capacity);
    assert(object->data);
}

size_t vector_size(struct vector *object) {
    return object->size;
}

float * vector_data(struct vector *object) {
    return object->data;
}

void vector_push(struct vector *object, float data) {
    if (object->size == object->capacity)
        vector_realloc(object);
    object->data[object->size] = data;
    object->size++;
}

float vector_pop(struct vector *object) {
    return object->data[object->size--];
}
于 2014-04-14T17:15:54.767 に答える
2

独自の動的配列を実装できます。このようなもの:

typedef struct {
  int *array;
  size_t used;
  size_t size;
} Array;

int initArray(Array *a, size_t initialSize) {
  a->array = (int *)malloc(initialSize * sizeof(int));
  if(!a->array)
    return -1;
  a->used = 0;
  a->size = initialSize;
  return 0;
}

int insertArray(Array *a, int element) {
  if (a->used == a->size) {
    a->size *= 2;
    int *newMemory = (int *)realloc(a->array, a->size * sizeof(int));
    if(!newMemory)
      return -1;
    a->array = newMemory;
  }
  a->array[a->used ++] = element;
  return 0;
}

void freeArray(Array *a) {
  free(a->array);
  a->array = NULL;
  a->used = a->size = 0;
}

詳細については、この投稿を参照してください。

于 2014-04-14T17:14:16.937 に答える
1

これはスタックの可能な実装です。スタックの独自の実装を使用して、push、pop、および number_of_element() を実装できます。

 typedef struct node {
        int value;
        struct node *next;
    } Node;

    typedef struct list {
        ListNode *head;
    } Stack;
于 2014-04-14T17:15:32.570 に答える