【问题标题】:How to make a function that modifies a struct如何制作修改结构的函数
【发布时间】:2019-04-19 00:12:22
【问题描述】:

我正在制作一个程序,将学生的成绩放入数组中,使用结构体作为期末练习。我需要创建一个函数来检查数组中是否有任何位置,如果没有,则数组需要加倍大小,然后需要将等级添加到下一个可用位置。如果数组有空缺职位,则应将等级值添加到下一个可用职位。每当数组发生更改时,都必须使用正确的值更新grades_array_pos 和grades_array_size。我对 C 很陌生,我很难弄清楚如何做到这一点。所有这些都必须仅使用基本变量、for 和 while 循环,并以非常基本的方式完成。

struct student_grades
{
    int student_id; 
    int *grades_array[10];
    int grades_array_pos;
    int grades_array_size;
};
void add_grade(struct student_grades * student, int assignment_grade){

}

【问题讨论】:

  • 他们给你初始化代码了吗?例如必须创建一个 student_grades 结构并对其进行初始化。
  • 教授们在 vocarium 浏览器中有执行此操作的代码。它还包含测试用例。我们实际上只是编写函数,并在我们点击发送按钮时对其进行测试。我们可以无限次发送。
  • 它向我们展示了上面的结构,并为我们提供了您所看到的函数的开头。我们填写函数内部。有一个word文档告诉我们我上面所说的函数应该做什么。
  • 好吧,我的意思是你需要自己做一些测试。这意味着制作一个 student_grades 结构(在您的 add_grade() 函数之外)。嗯...稍后我会在另一个答案中添加一些内容以帮助您入门。
  • 嗯...我被困在“grades_array”上,它似乎是一个十项整数指针数组。抱歉,我想我可以帮忙 - 如果它只是“int *grades_array;”,我可以处理它说,vocarium 的东西会显示 printf 的结果吗?或者只是“通过了 25 个测试中的 8 个。”

标签: c


【解决方案1】:

这是每个人都需要掌握的关键但简单的技能。基本方法是保持变量保持当前分配的元素数量和使用的数量的计数器。然后循环填充你的数组。在循环的开始,检查是否if (used == allocated) 以确定是否需要重新分配。

如果需要重新分配,则使用 TEMPORARY 指针,调用 realloc 并将分配的元素数量加倍。验证 realloc 是否成功,否则,中断填充数组的循环(不要退出程序),因为指向数组的原始指针仍指向 realloc 尝试之前的有效数据。

如果realloc 成功将新大小的内存块分配给您的原始指针,则使用新分配元素的计数更新变量 - 继续前进,必要时重复。示例:

#define NSTRUCT 8    /* initial number of struct to allocate for array */
...
size_t  allocated = NSTRUCT,   /* holds current number of elements allocated */
        used = 0;              /* holds current number used/filled */
struct student_grades *grades = malloc (allocated * sizeof *grades);

if (!grades) {
    perror ("malloc-grades");
    return 1;
}

while (/* loop to fill struct array */) {

    if (used == allocated) {    /* check if realloc needed */
        /* always realloc using a TEMPORARY pointer */
        void *tmp = realloc (grades, 2 * allocated * sizeof *grades);
        if (!tmp) { /* validate reallocation */
            perror ("realloc-grades");
            break;  /* don't exit, original pointer still good */
        }
        grades = tmp;       /* assign reallocated block to grades */
        allocated *= 2;     /* update allocated size */
    }

    /* fill next element -- keep going.... */
    used++;
}

检查一下,如果您还有问题,请告诉我。

【讨论】:

  • 嗯...好的,哪一个?他有grades 到数组,然后tmp 重新分配——他还需要什么?
  • 遗憾的是,我必须以更基本的方式来做这件事。我不能使用 perror 或 void *tmp 或 realloc。我们只能使用课堂上教授的语言的最基本部分。我知道这没有多大帮助,但我对语言的了解还不足以解释我的意思。我们必须使用基本的 for 或 while 循环。我不能像之前所说的那样使用 realloc 。我不能使用 NSTRUCT 8。老实说,我不知道那是什么。感谢您的帮助。
  • 没问题将void *tmp 更改为struct student_grades *tmpperror 更改为fputs ("error: malloc-grades.\n", stderr);。您可以使用NSTRUCT 它只是一个整数常量。你可以把size_t allocated = 8,(同样的事情)只是草率地使用一个幻数而不是一个“定义的常数”。以上所有内容都是基本的plain-jane vanilla C。唯一涉及的标头是stdio.hstdlib.h——你无法获得更基本的。
  • 我们还没有学过 fputs 或 stderr,所以我认为这样的东西在测试中不会被接受。我试图找到一种能让教授满意的方法。遗憾的是,我认为我无法使用其中任何一个,但感谢您提供帮助。
  • 基本上我们编写函数,他有测试用例,在一个名为 vocarium 的基于浏览器的程序上进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2020-05-23
  • 2012-12-09
相关资源
最近更新 更多