gpt4 book ai didi

c - 如何制作动态int数组

转载 作者:太空宇宙 更新时间:2023-11-04 07:47:28 25 4
gpt4 key购买 nike

我无法让我的动态 int 数组正常工作。我已经尝试了一些示例,但仍然无法正常工作。我想我正在做一个小指针问题,但我不知道是什么。我想要一个动态 int 数组,然后从另一个函数向这个数组添加数字。我已经让柜台开始工作了。

我试过将 * 放在不同的地方并尝试我的方式,但我目前缺乏知识来真正知道 * 应该在哪里。我知道一些关于 &* 的基础知识,但显然还不够

static void counterFunction(int* pointerToArray[], int* count)
{
while (*count < 10) {
*(*pointerToArray + *count) = *count;
*count = *count + 1;
}
}

static int* writeSortedToArray(void)
{
// I need to store 1000 numbers at this point
int* dynamicArray = malloc(1000 * sizeof(int));
int counter = 0;

counterFunction(&dynamicArray, &counter);

return 0;
}

计数器工作正常,动态数组根本不工作。根据我的调试器 (xcode),它只存储一个 0

最佳答案

为了补充其他答案,我建议采用更通用的方法和管理逻辑封装:

#include <assert.h>   // assert()
#include <stddef.h> // size_t
#include <stdbool.h> // bool, true, false
#include <stdlib.h> // malloc(), calloc(), free(), EXIT_FAILURE, EXIT_SUCCESS
#include <stdio.h> // fputs(), printf(), putchar()

typedef int value_type;
char const *conversion_specifier = "%d"
size_t const initial_capacity = 10
size_t growth_factor = 2

typedef struct dynarray_tag {
size_t size;
size_t capacity;
value_type *data;
} dynarray_t;

dynarray_t dynarray_create(void)
{
dynarray_t new_dynarray = { 0, 0, NULL };
return new_dynarray;
}

dynarray_t dynarray_create_reserve(size_t capacity)
{
dynarray_t new_dynarray = { 0, capacity, NULL };
new_dynarray.data = malloc(capacity * sizeof *new_dynarray.data);
return new_dynarray;
}

dynarray_t dynarray_create_size(size_t size)
{
dynarray_t new_dynarray = { size, size, NULL };
new_dynarray.data = calloc(size, sizeof *new_dynarray.data);
return new_dynarray;
}

bool dynarray_is_valid(dynarray_t const *dynarray)
{
if (!dynarray)
return false;

if (!dynarray->size && !dynarray->capacity && !dynarray->data)
return true;

if (dynarray->size > dynarray->capacity)
return false;

if (dynarray->capacity && dynarray->data)
return true;

return false;
}

size_t dynarray_get_size(dynarray_t const *dynarray)
{
assert(dynarray_is_valid(dynarray));
return dynarray->size;
}

size_t dynarray_get_capacity(dynarray_t const *dynarray)
{
assert(dynarray_is_valid(dynarray));
return dynarray->capacity;
}

value_type* dynarray_at(dynarray_t *dynarray, size_t position)
{
assert(dynarray_is_valid(dynarray) && dynarray->size && position < dynarray->size);
return &dynarray->data[position];
}

value_type* dynarray_front(dynarray_t *dynarray)
{
assert(dynarray_is_valid(dynarray));
return dynarray_at(dynarray, 0);
}

value_type* dynarray_back(dynarray_t *dynarray)
{
assert(dynarray_is_valid(dynarray));
return dynarray_at(dynarray, dynarray->size - 1);
}

bool dynarray_reserve(dynarray_t *dynarray, size_t new_capacity)
{
assert(dynarray_is_valid(dynarray));

if (new_capacity <= dynarray->capacity)
return true;

if (new_capacity < dynarray->size)
return false;

value_type *new_data = realloc(dynarray->data, new_capacity * sizeof *new_data);
if (!new_data)
return false;

dynarray->data = new_data;
dynarray->capacity = new_capacity;

return true;
}

bool dynarray_resize(dynarray_t *dynarray, size_t new_size)
{
assert(dynarray_is_valid(dynarray));

if (new_size <= dynarray->capacity)
return true;

value_type *new_data = realloc(dynarray->data, new_size * sizeof *new_data);
if (!new_data)
return false;

dynarray->data = new_data;
dynarray->size = new_size;
dynarray->capacity = new_size;

return true;
}

bool dynarray_insert(dynarray_t *dynarray, size_t position, value_type value)
{
assert(dynarray_is_valid(dynarray));

if (dynarray->size + 1 > dynarray->capacity) {
size_t new_capacity = dynarray->capacity ? dynarray->capacity * growth_factor : initial_capacity;
if (!dynarray_reserve(dynarray, new_capacity))
return false;
}

for (size_t i = dynarray->size; i > position; --i)
dynarray->data[i] = dynarray->data[i - 1];

dynarray->data[position] = value;
dynarray->size++;

return true;
}

bool dynarray_push_front(dynarray_t *dynarray, value_type value)
{
assert(dynarray_is_valid(dynarray));
return dynarray_insert(dynarray, 0, value);
}

bool dynarray_push_back(dynarray_t *dynarray, value_type value)
{
assert(dynarray_is_valid(dynarray));
return dynarray_insert(dynarray, dynarray->size, value);
}

bool dynarray_insert_sorted(dynarray_t *dynarray, value_type value)
{
assert(dynarray_is_valid(dynarray));

if (!dynarray_get_size(dynarray) || value < *dynarray_front(dynarray))
return dynarray_push_front(dynarray, value);

if (value > *dynarray_back(dynarray))
return dynarray_push_back(dynarray, value);

size_t insert_pos = 0;
for (; insert_pos < dynarray->size && value > dynarray->data[insert_pos]; ++insert_pos);
return dynarray_insert(dynarray, insert_pos, value);
}

void dynarray_print(dynarray_t const *dynarray)
{
assert(dynarray_is_valid(dynarray));

for (size_t i = 0; i < dynarray->size; ++i) {
printf(conversion_specifier, dynarray->data[i]);
if (i + 1 < dynarray->size)
printf(", ");
}
}

void dynarray_sort(dynarray_t *dynarray) // insertion sort
{
assert(dynarray_is_valid(dynarray));

for (size_t i = 1; i < dynarray->size; i++) {
value_type key = dynarray->data[i];

size_t k = i - 1;
for (; k >= 0 && dynarray->data[k] > key; --k)
dynarray->data[k + 1] = dynarray->data[k];

dynarray->data[k + 1] = key;
}
}

void dynarray_free(dynarray_t *dynarray)
{
assert(dynarray_is_valid(dynarray));

free(dynarray->data);
dynarray->size = dynarray->capacity = 0;
dynarray->data = NULL;
}

int main(void)
{
dynarray_t arr = dynarray_create();

if (!dynarray_is_valid(&arr)) {
fputs("Not enough memory. :(\n\n", stderr);
return EXIT_FAILURE;
}

int result = EXIT_FAILURE;

for (value_type i = 2; i < 15; i += 2) {
if (!dynarray_push_back(&arr, i))
goto error_exit;
}
dynarray_print(&arr);
putchar('\n');

for (value_type i = 1; i < 14; i += 2) {
if (i != 7) {
if (!dynarray_push_front(&arr, i))
goto error_exit;
}
}
dynarray_print(&arr);
putchar('\n');

dynarray_sort(&arr);
dynarray_print(&arr);
putchar('\n');

if (!dynarray_insert_sorted(&arr, 0))
goto error_exit;
dynarray_print(&arr);
putchar('\n');

if (!dynarray_insert_sorted(&arr, 15))
goto error_exit;
dynarray_print(&arr);
putchar('\n');

if (!dynarray_insert_sorted(&arr, 7))
goto error_exit;
dynarray_print(&arr);
putchar('\n');

result = EXIT_SUCCESS;

error_exit:
result == EXIT_FAILURE && fputs("Not enough memory. :(\n\n", stderr);
dynarray_free(&arr);
return result;
}

输出:

2, 4, 6, 8, 10, 12, 14
13, 11, 9, 5, 3, 1, 2, 4, 6, 8, 10, 12, 14
1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14
0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14
0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

待办事项:

  • dynarray_insert_range()
  • dynarray_create_init() 来自迭代器对
  • dynarray_from_file()
  • dynarray_copy()
  • dynarray_begin()
  • dynarray_end()
  • ...

关于c - 如何制作动态int数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56001633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com