Необъявленная функция в структуре в C - PullRequest
0 голосов
/ 28 октября 2018

У меня есть следующее code:

#include <stdio.h>
#include <string.h>

void getData() {

    static int HasDataBeenWritten;

    if (HasDataBeenWritten == 0) {

        enum flags
        {
            Country_NA = 1, 
            CountryUS = 2,
            CountryCN = 4, 
            CountryCA = 8, 
            Business_NA = 16,
            BusinessYes = 32,
            BusinessNo = 64,
            TypeOfEntityNonCommericial = 128,
            EntityPersonal = 256,
            EntityAll = 512,
        };

        struct TopDomain
        { 
            char *DomainName;
            unsigned int DataFlags:9;
        };          

        static struct TopDomain DomainData[8];

        static char DomainNameArray1[3] = {"EDU"};
        DomainData[0].DomainName = DomainNameArray1;    
        DomainData[0].DataFlags = 145;
        HasDataBeenWritten = 1;
    }

    printf("DomainData[0] : %i", (DomainData[0].DomainName));
    printf("DomainData[0] : %d", DomainData[0].DataFlags);
}

Я хочу напечатать массив, на который указывает *DomainName или даже просто указатель.Тем не менее, я получаю это сообщение об ошибке

getData.c:48:32 error: 'DomainData' undeclared (first use in this function) (printf("DomainData[0] : %i", (DomainData[0].DomainName));

Нужно ли объявлять структуру в массиве или как?

1 Ответ

0 голосов
/ 29 октября 2018

Вам нужно объявить DomainData (который представляет собой массив struct TopDomain структур) в месте, которое видно в точке вызова printf.

Вы объявили его внутри наборафигурных скобок.Область действия имени простирается от объявления до ближайшего }, то есть непосредственно перед вызовами printf.(Поскольку он static, его время жизни является полным выполнением программы, поэтому объект все еще существует в этой точке. Проблема в том, что его имя не отображается.)

Так какDomainData зависит от объявлений struct TopDomain и enum flags, вам также необходимо их переместить.

(редко имеет смысл объявлять тип внутри составного оператора.)

Кстати, строки вашего формата неверны.В вашем первом printf вы используете %i для аргумента типа char*;Вы хотите %s (при условии, что указатель не NULL).В свою секунду вы используете %d для аргумента типа unsigned int;вы хотите %u (или 0x%x может быть более понятным в этом случае).

...