2017-04-06 133 views
-1

大家好我有一个解决这个练习的问题。我从结构创建了一个实例,并用随机值初始化了属性。n个初始化实例的数组

现在我需要编写一个函数来创建一个数组,并完全初始化该结构的实例。

struct FluxCapacitor* createFluxCapacitor(){ // Instance of my struct 
    struct FluxCapacitor *capi = malloc(sizeof(*capi)); 
    capi->value = rand(); 
    capi->c_string = randomString(); 
} 

我猜它说起来容易,当我解释是这样的:

当n是10例如,我想打印的阵列我应该有10个随机数字和10个随机字符串。

这就是现在的样子

struct FluxCapacitor** createFluxCapacitorArray(unsigned int n) { 

struct capi **array = malloc(n * sizeof *array); 

for (int i = 0 ; i < n ; ++i) 
{ 
    array[i] = createFluxCapacitor(); 
} 

}; 

,我总是得到这个错误的main.c | 46 |错误:“for”循环初始声明只在C99或C11模式允许|

+0

'struct FluxCapacitor','Flux'和'struct capi'有什么区别? – mch

+0

我的错我昨天改了我的代码中的名字,并忘记了一个。看起来现在正确 Capi是struct FluxCapacitor的实例 – Timm

+0

对于您提到的特定错误,这意味着您的编译器目标的版本不允许在'for()'中声明值。 I.E.在'for'前声明'i'而不是作为它的一部分 – Toby

回答

0

你通过调用createFluxCapacitor();

创建的这一个实例,你在一个循环for(int i = 0; i < n; i++)

,并在每次创建一个实例的时间做到这一点,必须将其存储在一个数组struct FluxCapacitor* my_array[n];这样for(int i = 0; i < n; i++) my_array[i] = createFluxCapacitor();

0

编辑

问题已经改变了一点,你的代码几乎是完全正确的我在原来的回答中提出的建议,我将在这里回答下面的新答案。

您遇到的错误消息是由for循环的初始化部分中您声明i引起的。

for (int i = 0 ; ... 
// ^^^ here 

这是因为你的编译器默认为C的过时的版本,您可以通过以下两种方式之一来解决它:

  1. 声明变量外的for循环

    int i; 
    for (i = 0 ; i < n ; ++i) 
    
  2. (更好的选择)编译到现代C11标准。你不说的编译器是什么,但你可以通过添加-std=c11作为一个编译器标记敌人例如迫使它

    cc -std=c11 main.c -o myprogram 
    

你只需通过数组初始化的每个磁通电容元素循环。

struct FluxCapacitor** createFluxCapacitorArray(unsigned int n) 
{ //Function for the Array I want to initialize with n instance of the struct 

    struct FluxCapacitor **array = malloc(n * sizeof *array); 
    for (int i = 0 ; i < n ; ++i) 
    { 
     array[i] = createFluxCapacitor(); 
    } 
} 

当你摆脱了数组,你做反向:

void freeArray(struct FluxCapacitor** array) 
{ 
    for (int i = 0 ; i < n ; ++i) 
    { 
     free(array[i]); 
    } 
    free(array); 
} 

您还需要修复createFluxCapacitor()错误(没有return语句)。

+0

OP只是想要一个普通的数组。为什么指针指针? – Lundin

+0

@Lundin不,O​​P想要一个指向'FluxCapacitor'的指针数组。该函数的签名是'struct FluxCapacitor ** createFluxCapacitorArray(unsigned int n)' – JeremyP

+0

您假定函数参数/返回值是有意义的。 – Lundin

1

从你的问题,你没有理由建立一个一个指向结构的指针数组,但你可以直接建立结构数组:

struct FluxCapacitor* createFluxCapacitorArray(int n){ // Instance of my struct 
    int i; 
    struct FluxCapacitor *capi = malloc(sizeof(*capi) * n); 
    for (i=0; i<n; i++) { 
     capi[i].value = rand(); 
     capi[i].c_string = randomString(); 
    } 
    return capi; 
} 

然后,您可以使用它的方式:

struct FluxCapacitor *capi = createFluxCapacitorArray(n); 
... 
free(capi); 

只有一个单一的自由阵列完成后。

如果你真的需要一个指针数组来FluxCapacitor结构,您需要单独的Alloc结构的数组和指针数组:

struct FluxCapacitor** createFluxCapacitorArray(int n){ // Instance of my struct 
    int i; 
    struct FluxCapacitor *capi = malloc(sizeof(*capi) * n); 
    struct FluxCapacitor **cp = malloc(sizeof(capi) * n); 
    for (i=0; i<n; i++) { 
     capi[i].value = rand(); 
     capi[i].c_string = randomString(); 
     cp[i] = capi + i; 
    } 
    return cp; 
} 

这样的话,你仍然有一个真正的数组,可以做指针算法。另外,你只需要在完成时释放2个元素:

struct FluxCapacitor **cp = createFluxCapacitorArray(n); 
... 
free(cp[0]); 
free(cp); 
+0

该问题要求指向FluxCapacitor的指针数组,而不是FluxCapacitor数组。你的退货类型是错误的。 – JeremyP

+0

@JeremyP这是一个数组。返回一个数组指针似乎不必要的复杂。返回指针指针是不正确的。简单地返回一个指向第一个元素的指针听起来像是一个相当理智的想法,与这些选择相比。 – Lundin

+0

@JeremyP:我对这个目标的理解是*现在我需要编写一个函数,它创建一个数组,其中包含n个完全初始化的struct *的实例**。以上代码完全回答了这个问题。 –