2016-07-06 64 views
0

我有这样的结构:警告与结构初始化

struct ChangeIntItem 
{ 
    char *unit; 
    const char **parser; 
    int *changevalue; 
    uint16_t *change_eeprom_value; 
    int maximum; 
    int minimum; 
}; 

我想和初始化其他变量这个结构体变量:

struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = {"off", "on"}}; 

它工作正常,但我得到一些警告:

Severity Code Description Project File Line 
Warning  braces around scalar initializer Handsteuerung C:\Users\... 11 

Severity Code Description Project File Line 
Warning  (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11 

Severity Code Description Project File Line 
Warning  initialization from incompatible pointer type Handsteuerung C:\Users\... 11 

Severity Code Description Project File Line 
Warning  (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11 

Severity Code Description Project File Line 
Warning  excess elements in scalar initializer Handsteuerung C:\Users\... 11 

Severity Code Description Project File Line 
Warning  (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11 

在另一种情况下,我写了一个函数,它将结构的变量设置为默认值,但我更喜欢th是方法,因为它更短。

所有的过错,在那里所造成“.parser = {‘开’‘关’,}”,但我没有得到我的错......

回答

5

您可以使用compound literals,所以更改初始化到

struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = (const char *[]){"off", "on"}}; 

测试

#include <stdio.h> 
#include <stdint.h> 

struct ChangeIntItem 
{ 
    char *unit; 
    const char **parser; 
    int *changevalue; 
    uint16_t *change_eeprom_value; 
    int maximum; 
    int minimum; 
}; 

int main() 
{ 
    struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = (const char *[]){"off", "on"}}; 

    printf ("%s - %s\n", ChangeIntItemTypeBoolean.parser[0], ChangeIntItemTypeBoolean.parser[1]); 
} 

输出

off - on 
+0

另外'parser'可能是类型为const char * parser []'的灵活数组成员。很少有指针指针变量声明有意义的情况。 – Lundin

+0

@Lundin是的,用VLA'parser'应该是struct的最后一个成员,不是吗? – LPs

+0

谢谢!有时它比你想象的要容易;) – GURKE

4

会员parser是一个指针。

它更改为一个指针数组,所以初始化可保持相同的:

const char *parser[2]; 

或者使用文字的化合物或另一个变量:

.parser = (const char*[]){"off", "on"} 

const char* array[2] = {"off", "on"}; 
.parser = array 
+1

_Member解析器是指针的指针_... – LPs

+0

@LPs不,它是一个指针。短语*指针的指针*没有任何意义。 – 2501