1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
1

Разделить проект на несколько библиотек

11.06.2018, 18:16. Показов 974. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть проект эмуляция работы бд. Пытаюсь функции main.cpp вынести на menu.h и menu.cpp
В menu.h записываю все определения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Elem Elem;
 
struct Elem{
    char* proiz;
    char* model;
    char* apert;
    int iso;
    char* razresh;
    char* format;
    struct Elem *next;
};
int CountElem = 0;
int log = 0;
Elem *head = NULL;
const int S_FIELD = 50;
 
void Click(int select);
void showFields(int select);
int getPosField();
void showMenu(int select);
void SetColor(int text, int background);
enum ConsoleColor{
    Black = 0, Blue = 1, Green = 2, Cyan = 3,
    Red = 4, Magenta = 5, Brown = 6, LightGray = 7,
    DarkGray = 8, LightBlue = 9, LightGreen = 10,
    LightCyan = 11, LightRed = 12, LightMagenta = 13,
    Yellow = 14, White = 15};
#endif // MENU_H_INCLUDED
Прописываю в файлах main.cpp и menu.cpp #include "menu.h" и получаю multiple defenition CountElem log head
Не понимаю куда тогда положить эти объявления?
Вложения
Тип файла: rar BD.rar (20.1 Кб, 1 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2018, 18:16
Ответы с готовыми решениями:

Нужно несколько библиотек для Си
Библиотеки для c++ (типа stl) не предлагать :) Только c. 1) Ассоциативные массивы чтоб можно...

Разделить один большой .c файл на несколько
Просьба помочь разделить один большой .c файл на несколько. Цели: 1. Разделить куски кода на...

Не удается отучить QT проект от библиотек
скачал: Добавлено через 8 минут 1. скачал и установил:...

Добавление библиотек в проект MVS2010
Есть проект, в котором используются библиотеки OpenGL, конкретней glaux.h и glut.h. Но эти...

15
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
11.06.2018, 18:25 2
Цитата Сообщение от Pantheonptz Посмотреть сообщение
main.cpp
так Си или все таки С++
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
11.06.2018, 18:30  [ТС] 3
Си. cpp это описка.
main.c menu.h menu.c
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
11.06.2018, 18:59 4
теперь смотри
Цитата Сообщение от Pantheonptz Посмотреть сообщение
C
1
2
int CountElem = 0;
int log = 0;
переменные объявлены в заголовочном файле и если заголовочный файл включен два раза
то переменные тоже будут объявлены два раза
вот и
Цитата Сообщение от Pantheonptz Посмотреть сообщение
multiple defenition
прочитай про ключевое слово extern
Цитата Сообщение от Pantheonptz Посмотреть сообщение
Си.
тогда структуру лучше объявить так
C
1
2
3
4
5
6
7
8
9
typedef struct _Elem{
    char* proiz;
    char* model;
    char* apert;
    int iso;
    char* razresh;
    char* format;
    _Elem *next;
}Elem;
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
11.06.2018, 19:15  [ТС] 5
в main.c
C
1
2
3
4
5
#include "menu.h"
 
int CountElem = 0;
int log = 0;
Elem *head = NULL;
Из menu.h объявления убрал
В menu.c записал объявления
C
1
2
3
extern int CountElem = 0;
extern int log = 0;
extern Elem *head = NULL;
Все равно пишет multiple defenition
причем ошибка показывает на строку кода в stdio.h в функции printf
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
11.06.2018, 19:22 6
Цитата Сообщение от Pantheonptz Посмотреть сообщение
C
1
2
3
extern int CountElem = 0;
extern int log = 0;
extern Elem *head = NULL;
не надо инициализировать
C
1
2
3
extern int CountElem;
extern int log;
extern Elem *head;
Добавлено через 3 минуты
и поменяй имя переменной log ибо это одно из служебных слов (функция которая берет логарифм) возможны косяки
назови например MyLog
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
11.06.2018, 19:22  [ТС] 7
теперь выдает ошибку ld returned 1 exit status
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
11.06.2018, 19:24 8
Цитата Сообщение от Pantheonptz Посмотреть сообщение
ld returned 1 exit status
приведи код который вызывает ошибку
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
11.06.2018, 19:29  [ТС] 9
ld возвратил статус 1. Честно говоря я не знаю что такое ld. В инете пишут может программа осталась работать и посмотреть в диспетчере или есть кириллица в пути к файлам. Но ни того не другого не присутствует. среда codeblocks.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12453 / 7478 / 1752
Регистрация: 25.07.2009
Сообщений: 13,748
11.06.2018, 19:32 10
Цитата Сообщение от Pantheonptz Посмотреть сообщение
Честно говоря я не знаю что такое ld.
Линковщик. Если не отработал, скорее всего не нашёл что-то. Проверяйте имена и сигнатуры функций там, где они объявлены, описаны и вызываются.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
11.06.2018, 19:39 11
Цитата Сообщение от Pantheonptz Посмотреть сообщение
среда codeblocks.
ничем не могу помочь никогда с ней не работал
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
11.06.2018, 19:40  [ТС] 12
Дак ведь я всего лишь откопировал все объявления в header и затем в menu.c . Вы имеете ввиду могут быть ошибки в названиях функций в хедере и в файле?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
11.06.2018, 19:45 13
Цитата Сообщение от Pantheonptz Посмотреть сообщение
Вы имеете ввиду могут быть ошибки в названиях функций
функция может быть объявлена но не реализована
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
11.06.2018, 19:51  [ТС] 14
Дело в том что я сначала реализовал все функции в main.c откомпилировал и проверил, а потом часть из них перенес в menu.h
menu.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#include "menu.h"
 
extern int CountElem;
extern int log;
extern Elem *head;
 
// вывод меню
void showMenu(int select){
    char menu[][80] = {"******************************************************************************\n",
                       "*                                                                            *\n",
                       "*  Добавить новый фотоаппарат                                                *\n",
                       "*  Редактировать                                                             *\n",
                       "*  Удалить                                                                   *\n",
                       "*  Сортировка                                                                *\n",
                       "*  Вывод на экран                                                            *\n",
                       "*  Загрузка из текстового файла                                              *\n",
                       "*  Загрузка из зашифрованного файла                                          *\n",
                       "*  Сохранение в текстовый файл                                               *\n",
                       "*  Сохранение в зашифрованный файл                                           *\n",
                       "*  Поиск                                                                     *\n",
                       "*  Нажмите Esc - для выхода из программы                                     *\n",
                       "*                                                                            *\n",
                       "******************************************************************************"};
    system("CLS");
    for(int i = 0; i < 15; i++){
        SetColor(DarkGray, Black);
        if(i == (select + 1))
            SetColor(Red, Black);
        printf("%s", menu[i]);
    }
SetColor(White, Black);
}
 
void SetColor(int text, int background){
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4)|text));
}
 
 
void showFields(int select){
    system("CLS");
    for(int i = 0; i < CountElem; i++){
     SetColor(White, Black);
     if(i == select)
            SetColor(Red, White);
     Elem* temp = getElem(i);
     printf("Номер %i - %s %s\n", i, temp->proiz, temp->model);
    }
    SetColor(White, Black);
}
 
int getPosField(){
    int menuItem = 0;
 
    showFields(menuItem);
        while(1){
        if(GetAsyncKeyState(VK_UP)){
            keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
            if(menuItem - 1 < 0)
                menuItem = CountElem - 1;
            else
                menuItem--;
            showFields(menuItem);
        }
        if(GetAsyncKeyState(VK_DOWN)){
            keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
            if(menuItem + 1 >= CountElem)
                menuItem = 0;
            else
                menuItem++;
            showFields(menuItem);
        }
        if(GetAsyncKeyState(VK_RETURN)){
            keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
            return menuItem;
        }
        if(GetAsyncKeyState(VK_ESCAPE)){
            keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
            return -1;
        }
    }
}
 
void Click(int select){
    char proiz[S_FIELD];
    char model[S_FIELD];
    char apert[S_FIELD];
    int iso;
    char razresh[S_FIELD];
    char format[S_FIELD];
    int pos;
    int posf;
    char filename[S_FIELD];
    char pass[64];
    char find_str[50];
 
    fflush(stdin);
    switch(select){
    case 1:
        if(elementInput(proiz, model, apert, &iso, razresh, format) == -1){
            printf("ISO неправильно!");
            system("pause");
            return;
        }
        elementAdd(proiz, model, apert, iso, razresh, format);
        if(log == 1)
            toLog("Ввод с консоли\n");
    break;
    case 2:
        pos = getPosField();
        if( pos == -1){
            printf("Возврат в главное меню");
            system("pause");
            return;
        }
        printf("Введите изменяемое поле\n 1 - производитель 2 - модель 3 - аппертура 4 - ISO 5 - разрешение 6 - формат");
        do{
            posf = getch();
        } while ( posf < 49 || posf > 54);
 
        elementChange(pos, posf - 48);
        printf("Данные изменены!\n");
        if(log == 1)
            toLog("Произошло изменения данных\n");
        system("pause");
    break;
    case 3:
        pos = getPosField();
        if( pos == -1){
            printf("Возврат в главное меню");
            system("pause");
            return;
        }
 
        elementDel(pos);
        printf("Запись удалена!\n");
        if(log == 1)
            toLog("Произошло удаление данных\n");
        system("pause");
    break;
    case 4:
        printf("Введите поле по которому сортировать\n 1 - производитель 2 - модель 3 - аппертура 4 - ISO 5 - разрешение 6 - формат");
        do{
            pos = getch();
        } while ( pos < 49 || pos > 54);
        sort(pos - 48);
        if(log == 1)
            toLog("Сортировка данных\n");
    break;
    case 5:
         outToConsole();
         if(log == 1)
            toLog("Вывод данных в консоль\n");
         system("pause");
    break;
    case 6:
        printf("Введите имя файла - ");
        fflush(stdin);
        clearbuff();
        scanf("%s", filename);
        fromFileTxt(filename);
        printf("Данные загружены!\n");
        if(log == 1)
            toLog("Загрузка данных из текстового файла\n");
        system("pause");
    break;
    case 7:
        fflush(stdin);
        clearbuff();
        printf("Введите имя файла - ");
        scanf("%s", filename);
        printf("\nВведите пароль - ");
        scanf("%s", pass);
        fromFileCrypt(pass, filename);
        printf("Данные загружены!\n");
        if(log == 1)
            toLog("Загрузка данных из зашифрованного файла\n");
        system("pause");
    break;
    case 8:
        printf("Введите имя файла - ");
        fflush(stdin);
        clearbuff();
        //fgets(filename, S_FIELD, stdin);
        scanf("%s", filename);
        toFileTxt(filename);
        printf("Данные загружены в %s\n", filename);
        if(log == 1)
            toLog("Сохранение данных в текстовый файл\n");
        system("pause");
    break;
    case 9:
        printf("Введите имя файла - ");
        fflush(stdin);
        clearbuff();
        scanf("%s", filename);
        printf("\nВведите пароль - ");
        scanf("%s", pass);
        toFileCrypt(pass, filename);
        printf("Данные загружены в %s\n", filename);
        if(log == 1)
            toLog("Сохранение данных в зашифрованный файл\n");
        system("pause");
    break;
    case 10:
        printf("Поисковая строка - \n");
        scanf("%s", find_str);
        poisk(find_str);
        system("pause");
        break;
    }
}
menu.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Elem Elem;
 
struct Elem{
    char* proiz;
    char* model;
    char* apert;
    int iso;
    char* razresh;
    char* format;
    struct Elem *next;
};
 
const int S_FIELD = 50;
 
void Click(int select);
void showFields(int select);
int getPosField();
void showMenu(int select);
void SetColor(int text, int background);
enum ConsoleColor{
    Black = 0, Blue = 1, Green = 2, Cyan = 3,
    Red = 4, Magenta = 5, Brown = 6, LightGray = 7,
    DarkGray = 8, LightBlue = 9, LightGreen = 10,
    LightCyan = 11, LightRed = 12, LightMagenta = 13,
    Yellow = 14, White = 15};
#endif // MENU_H_INCLUDED
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
11.06.2018, 20:08 15
Цитата Сообщение от Pantheonptz Посмотреть сообщение
const int S_FIELD = 50;
вот это тоже вынеси из заголовочного файла
а лучше напиши
C
1
#define S_FIELD  50
const в Си работает не совсем так как в плюсах
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
11.06.2018, 20:20  [ТС] 16
сделал как вы написали и все заработало. видимо на это и ругался линковщик.
0
11.06.2018, 20:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2018, 20:20
Помогаю со студенческими работами здесь

Добавление библиотек в проект и maven
Добрый день! Пытаюсь добавить библиотеку H2 в проект. Сначала добавил jar файлик в через IDEA в...

Импорт нестандартных библиотек в проект
Приветствую. В проект нужно добавить следующие библиотеки: import org.semanticweb.yars.nx.Node;...

Проект и использование внешних библиотек
привет) хочу спросить по поводу android stuudio/// для работы с pdf-файлами скачал библиотеку,...

Не подключается несколько библиотек
Доброго времени суток! Мне понадобилось написать несколько dll-библиотек для того чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru