Struct Issue в C с использованием одного и того же Struct из нескольких исходных файлов

У меня есть «структура», которую я хотел бы использовать в нескольких исходных файлах. Я объявил структуру в файле заголовка, а затем включил в исходные файлы. Было бы здорово, если бы кто-нибудь помог мне в этой проблеме. Я публикую заголовок, источник и ошибку

#ifndef DATABASE_H
#define DATABASE_H

struct dataBase
{
    char modelName;
    float capacity;
    int mileage;
    char color;
};

extern struct dataBase Inputs;

#endif  /* DATABASE_H */

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "dataBase.h"


struct dataBase Inputs = NULL;

//size_t    Inputs_Size = 0;

int main (void)

#include "hw4_asharma_display.h"
#include <stdio.h>
#include "dataBase.h"


void printLow(int size)
{
    // Declaring Variables
    int i;

    for(i=0; i<size; i++)
    {
        printf("%s %f %d %s\n", 
                Inputs[i].modelName, 
                Inputs[i].capacity, 
                Inputs[i].mileage, 
                Inputs[i].color);
    }

hw4_asharma_display.c:14:23: error: subscripted value is not an array, pointer, or vector
                Inputs[i].modelName, 
                ~~~~~~^~
hw4_asharma_display.c:29:23: error: subscripted value is not an array, pointer, or vector
                Inputs[i].modelName, 

person user3337714    schedule 23.02.2015    source источник
comment
Это не имеет ничего общего с наличием нескольких файлов, и все, что связано с тем фактом, что вы пытаетесь использовать [] в структуре.   -  person user253751    schedule 23.02.2015
comment
Ваша переменная Inputs не является массивом, вы не можете получить доступ к i-му элементу...   -  person Jean-Baptiste Yunès    schedule 23.02.2015
comment
Итак, как лучше всего получить доступ к моему Struct? и как я могу решить проблему?   -  person user3337714    schedule 23.02.2015
comment
если у вас есть только один struct database Input, то Input.mileage получит доступ к соответствующему атрибуту. Если вам нужен массив, вы должны объявить struct database Inputs[NB] и иметь возможность использовать Inputs[i].mileage для любого i›=0 и i‹NB.   -  person Jean-Baptiste Yunès    schedule 23.02.2015
comment
вам нужно сделать Inputs массивом. extern struct dataBase Inputs[];   -  person Jason Hu    schedule 24.02.2015


Ответы (1)


Inputs не является массивом, поэтому вы не можете просто использовать обозначение индекса [i]. Вам придется изменить его объявление с:

struct dataBase Inputs = NULL;

(кстати, часть NULL бессмысленна) для

struct dataBase Inputs[N];

Вместо этого, если вы хотели иметь только один элемент, сохраните объявление:

struct dataBase Inputs;

но удалите часть [i]:

    printf("%c %f %d %c\n", 
            Inputs.modelName, 
            Inputs.capacity, 
            Inputs.mileage, 
            Inputs.color);

Кроме того, вам придется заполнить каждый элемент перед печатью, иначе вы получите все нули и пробелы.

person Stefano Sanfilippo    schedule 23.02.2015
comment
И квалификатор extern тоже должен быть в файле cpp вместо заголовка, нет? - person mstbaum; 24.02.2015
comment
Нет, правильно: квалификатор extern используется для объявления Inputs глобальной переменной, определенной в какой-то другой единице компиляции (в данном случае в main.c). Таким образом, любой файл, включая этот заголовок, может использовать глобальную переменную. - person Stefano Sanfilippo; 24.02.2015