Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Структура


Автор: Belous 6.2.2017, 20:09
Есть переменные, которые определены глобально и видны из всех функций. Все работает.
При попытке создать таким же образом структуру возникает ошибка, что она не видна

error C2501: 'data' : missing storage-class or type specifiers

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

Код

// Project.h

#include <windows.h>
#include "Data.h"

struct DATA
{
    int index;
    char name[256];
    POINT point;
};

namespace e
{
    HINSTANCE hinst;
    char appname[256];
    //...
    DATA data[10];
}


Код

// Data.h

#include <windows.h>

namespace e
{
    extern char appname[256];
    //...
    extern DATA data[10];
}


Код

// Data.cpp

#include "Data.h"

void DataApplication()
{
    strcpy(e::appname, "Application");
    e::data[0].index = 0;
}


Как создать массив глобальных переменных типа структура?

Автор: ss 6.2.2017, 21:15
в Data.h надо подключить Project.h. Файл в котором описана структура не подключен. Структуру нужно вынести в другой файл иначе будет кольцевое подключение.

Автор: Belous 6.2.2017, 21:24
Цитата

Структуру нужно вынести в другой файл иначе будет кольцевое подключение

Вот именно. Поэтому и не подключен. А иначе никак ? А то и так этих файлов очень много получается, и это только начало программы...

Спасибо, попробую.


Автор: ss 6.2.2017, 22:11
в Data.h опиши структуру, заведи массив а в других файлах (Project.h) подключай этот Data.h и определяй ссылку extern DATA data[10];

Автор: Belous 6.2.2017, 23:07
В общем смысл я понял.

У меня было в Project.h описаны все глобальные переменные
в Project.cpp - WinMain() и WndProc()

В остальных файлах-модулях, по смыслу File.h + File.cpp - работа с файлами,
В Data.h + Data.cpp - работа с данными, инициализация, проверки, undo, redo и т.д.
Естественно все так или иначе вызывается с WndProc()

Так просто перенести переменные из Project.h в Data.h не получится,
поскольку функции модуля Data.cpp вызываются из Project.cpp. и все равно получается

error C2011: 'DATA' : 'struct' type redefinition

немного спасает #pragma once

но получил
Project.obj : error LNK2005: "struct DATA * e::data" (?data@e@@3PAUDATA@@A) already defined in Data.obj

...

Наверное без дополнительного файла под структуру не обойтись.

Автор: xvr 7.2.2017, 11:29
У вас в принципе неправильная структура файлов. Должно быть так:
Код

// Data.h
#pragma once

#include <windows.h>

struct DATA
{
    int index;
    char name[256];
    POINT point;
};

namespace e
{
    extern DATA data[10];
}


Код

// Project.h
#pragma once

#include <windows.h>
#include "Data.h"

namespace e
{
    extern HINSTANCE hinst;
    extern char appname[256];
}


Код

// Data.cpp
#include "Data.h"

namespace e
{
    DATA data[10];
}

void DataApplication()
{
    strcpy(e::appname, "Application");
    e::data[0].index = 0;
}


Код

// Project.cpp
#include "project.h"
namespace e
{
    HINSTANCE hinst;
    char appname[256];
}
...

Автор: Belous 7.2.2017, 21:04
Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)