返回结构

时间:2014-12-29 04:26:47

标签: c struct return

很抱歉,如果这个问题看起来像新手,我几天前就开始学习C.

我有一个函数(get_taken_values),它应该接受一个字符串(char [81]作为输入并返回两个值:int和int [9]。

当我saw here时,不可能返回多个值,所以我不得不使用结构。

这就是我所拥有的:

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

#define max_size 9
#define max_input 81

struct result {
    int position;
    int *taken;  
};

struct result get_result(int pos, int take[]){
    struct result res;

    res.position = pos;
    res.taken = take;

    return res;
}

struct result get_taken_values(char string_arg[max_input]){
    int position = 0;
    int* chosen = calloc(max_size, sizeof(int)); //suggestion from a previous question

    int someotherarray[9] = {1,2,3,4,5,6,7,8,9}; // fictional
    int i;
    for (i = 0; i < max_size; i ++) {
        chosen[i] = someotherarray[i]; 
    }

    struct result res = struct result(position, chosen);
    return res; // I to return int and int[9]: eg: 0,{1,2,3,4,5,6,7,8,9}
}

但我得到了:

ex16.c: In function 'get_taken_values':
ex16.c:127:22: error: expected expression before 'struct'
  struct result res = struct result(position, chosen);
                      ^

我尝试剪切get_result,并在get_taken_values中创建结构:

// inside get_taken_values
struct result res;
res.position = position;
res.taken = chosen;
return res;

但它提出了这个问题:

c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../libmingw32.a(main.o):main.c:(.text.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

我打算将get_taken_values的返回值传递给Python并在那里使用它。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

就这样做

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

#define max_size 9
#define max_input 81

struct result {
    int position;
    int *taken;  
};

struct result get_result(int pos, int take[]){
    struct result res;

    res.position = pos;
    res.taken = take;

    return res;
}

struct result get_taken_values(char string_arg[max_input]){
    struct result res;

    res.position = 0;
    res.taken    = malloc(max_size * sizeof(int)); // you don't need to 
                                                   // initialize the values 
                                                   // you will do it below
    if (res.taken == NULL) // always check the success of malloc
        return res;
    int someotherarray[9] = {1,2,3,4,5,6,7,8,9}; // fictional
    int i;
    for (i = 0; i < max_size; i ++) {
        res.taken[i] = someotherarray[i]; 
    }
    return res; // I to return int and int[9]: eg: 0,{1,2,3,4,5,6,7,8,9}
}

你必须记得在某个时候致电free(res.taken)

答案 1 :(得分:1)

您应该在代码中纠正一些事项:

struct result get_taken_values(char string_arg[max_input]) 不需要&#39; max_input&#39;。你可以声明&#39;(char string_arg [])&#39;意思是你要传递一个指向char类型的函数。

int* chosen = calloc(max_size, sizeof(int));

您稍后将对数组进行初始化,因此无需使用calloc,您可以使用malloc。 始终检查malloc是否不返回NULL。

这是你写它的方式

int* chosen = malloc(max_size * sizeof(int)); 
if (chosen  == NULL) { 
    return res; 
}

最后,您无法使用struct result res = struct result(position, chosen);

复制结构

这是你需要做的:

struct result get_taken_values(char string_arg[max_input])
{
    struct result res;
    int* chosen = malloc(max_size * sizeof(int)); 
    if (chosen  == NULL) {
        return res;
    }

    res.taken = chosen;
    res.position = 0;

    int someotherarray[9] = {1,2,3,4,5,6,7,8,9};

    int i;
    for (i = 0; i < max_size; i ++) {
        res.taken[i] = someotherarray[i]; 
    }
    return res; 
    }