Struct Issue в C, като се използват едни и същи Struct Multiple изходни файлове

Имам „структура“, която бих искал да използвам в множество файлове с източници. Декларирах структурата в заглавния файл и след това я включих в изходните файлове. Ще бъде чудесно, ако някой може да ми помогне с този проблем. Публикувам заглавка, източник и грешка

#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
И така, какво би било най-доброто за достъп до моята структура? и как мога да поправя проблема?   -  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