在两次铸造之后,函数会自行投射c

时间:2016-01-13 00:56:22

标签: c loops struct

我有一个大学项目,我必须写一个工人数据库。我决定使用动态结构数组:

$http({url: "export/download/" + exportitem.exportId, withCredentials: true})
.then(function(response) {
    function str2bytes(str) {
        var bytes = new Uint8Array(str.length);
        for (var i=0; i<str.length; i++) {
            bytes[i] = str.charCodeAt(i);
        }
        return bytes;
    }
    var blob = new Blob([str2bytes(response.data)], {type: 'application/octet-stream'});
    FileSaver.saveAs(blob, "download.zip");
}, $exceptionHandler);

功能菜单

@RequestMapping(value = "/download/{id}", method = RequestMethod.GET)
public void download(final HttpServletRequest request,
                     final HttpServletResponse response,
                     @PathVariable("id") final int id) throws IOException {
    // Pseudo-code for retrieving file from ID.
    Path zippath = getZipFile(id);

    if (!Files.exists(zippath)) {
        throw new IOException("File not found.");
    }

    response.setContentType("application/zip");
    response.setHeader("Content-Disposition",
                        "attachment; filename=download.zip");

    InputStream inputStream = new FileInputStream(zippath.toFile());
    org.apache.commons.io.IOUtils.copy(inputStream, response.getOutputStream());
    response.flushBuffer();
    inputStream.close();
}

决定我们想做什么,例如写作&#34;添加&#34;将启动我的问题功能,该功能应该添加新记录

struct data
{
    char id[50];
    char name[50];
    char surname[50];
    char account_num[50];
    double net_pension,taxed_pension;

};
int main()
{
    int current_size=0;
    struct data *database;//creating a table
    database=(struct data*)malloc(1*sizeof(struct data));//memory allocation

    menu(database);//running menu

    return 0;
}

函数modify_size reallocs memory,does_exist确保id是唯一的,accgnum,num和word检查给定规则的输入。当你第一次使用功能时,它们都能很好地工作。但是在你尝试添加第二个&#34;记录添加&#34;不显示和功能从一开始添加运行。我不知道为什么。这是主要问题。第二个是菜单,因为当你输入&#34; print&#34;它运行add_element。转换输入的代码是:

void menu(struct data *database)
{
    int current_size=1;
    int input=0;
    char inpt[512];
    do
    {
        printf("Input function or input help for list of avaible commands \n");
        fgets(inpt,511,stdin);
        input=mod_input(inpt);
        if(input==404)
        {
            printf("Function does not exist \n");
        }
        else if(input==1)
        {
            print_result(database,current_size);
        }
        else if(input==2)
        {
            add_element(database,&current_size);
        }
        else if(input==3)
        {
            modify_element(database,current_size);
        }
        else if(input==4)
        {
            sort_table(database, current_size);
        }
        else if(input==5)
        {
            search(database,current_size);
        }
        else if(input==6)
        {
            hilfe();
        }
        else if(input==7)
        {
            search_by_col(database,current_size);
        }
        input=8;
    }
    while(input!=0);
}

提前感谢您的帮助。我也知道有些部分可以做得更好,但就目前而言,我试图强迫它发挥作用。 整个计划 lab3.cheader

1 个答案:

答案 0 :(得分:1)

直观地说,你需要做的是传递指向数组指针的指针,而不只是指向它的指针。这就是BLUEPIXY在评论中试图得到的东西。

问题在于,如果你x = realloc(y, new_size),那么x不能保证x等于y。

特别是,子例程中的database = realloc(database, new_size)可能会使子例程与database的值不同,而是作为参数传入的值。 调用者仍具有数据库的旧值。

结果未定义,可能包括比你得到的更糟糕。

你想要的是

struct data *datap;
struct data **database = &datap;

*database = malloc(sizeof(struct data))

相应的更改一直向下 - 基本上是通过数据库,并在到达那个阶段时设置*database = realloc(...)

另外,请确保同时正确更新*size