Форум программистов, компьютерный форум CyberForum.ru

разбитие программы на файлы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.58
MaxFX
2 / 2 / 0
Регистрация: 22.10.2010
Сообщений: 37
30.01.2012, 20:53     разбитие программы на файлы #1
Здравствуйте.

Подскажите пожалуйста как разбить консольное приложение на два и более файла? Я хочу чтоб у меня был центральный файл который по мере надобности запускал другие файлы. То есть так же как и главная функция которая может запускать другие функции. Так как я никогда ничего подобного не делал то сразу возникает кучка вопросов:

В какой формат сохранять файлы?
Как заставить главный файл запустить другие файлы (специальная функция или команда)?
Что писать в остальных файлах (должна ли у них быть своя функция main)?

Спасибо за внимание.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
31.01.2012, 00:55     разбитие программы на файлы #2
Для Си
Пример - в программе две функции function1(), function2()
Можно описать в одном файле так:

файл main.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
#include <заголовочный файл>
....
 
void function1();     //объявления
void function2();
 
main()
{
....
function1(); //вызов
....
function2();
...
}
 
void function1()     //описание функции
{
 ....
}
 
void function2()
{
   ...
}
тогда можно так

файл function.h
C
1
2
3
4
5
#include <заголовочные файлы.h>  // не всегда нужно
...
 
void function1();   //объявление функций
void fucntion2();
файл function.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <заголовочные файлы.h>
...
#include "function.h"
 
void function1()     //описание функции
{
 ....
}
 
void function2()
{
   ...
}
файл main.c
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <заголовочные файлы.h>
....
#include "function.h"
 
main()
{
   ...
   function1();
   ...
   functiin2();
   ....
}
Добавлено через 10 минут
Суть в том что функции (классы - для С++) распределяются по файлам, в файле .h пишут сигнатуру функций или описывают класс, а в файлах .c или .cpp пишут сам код (не всегда так - можно и в .h писать код, но не советую, так намного логичнее и проще, плюс могут возникнуть проблемы).
В других файлах не должно быть функции main!
Форматы - .h, .c, .cpp (вроде еще где-то видел .hpp - но я точно не скажу, не пользовался).
Чтобы заставить главный файл использовать функции из других файлов, в нем должен быть прописано
C
1
#include "нужный файл.h"
здесь прописывается путь к файлу, если все в одной папке можно только имя файла, либо относительный путь.
И можно использовать функции из тех файлов, как-будто они описаны в главном файле)

Добавлено через 6 минут
Ой чуть не забыл, в .h файле надо написать (в небольших программах не всегда нужно - но лучше использовать всегда)

C
1
2
3
4
5
6
7
8
#ifndef FILE_TAKOY_TO_H  // можно и другое название придумать - главное чтобы оно было уникальным
#define FILE_TAKOY_TO_H
 
.....
// Код написанный в загаловочном файле
.....
 
#endif
MaxFX
2 / 2 / 0
Регистрация: 22.10.2010
Сообщений: 37
01.02.2012, 19:21  [ТС]     разбитие программы на файлы #3
Большое спасибо!!!

Объяснили вы понятно, но только на практике у меня что то не получается. В заголовочном файле functions.h пишу следующие:
C
1
2
3
4
5
6
7
8
9
10
11
#ifndef <functions.h>
#define <functions.h>
 
 
 
void welcome ();
void get_data ();
int calculations ();
void print_data ();
 
#endif
И тут же компилятор сердится мол "expected an identifier" какой ещё идентификатор ему нужен?

Помимо этого центральный файл не хочет открывать заголовочный файл, пишет что "нет такого файла", не смотря на то что оба файла в одной и той же папке.

И ещё вопросик:
Если я объявляю глобальную переменную в главном файле сможет ли под файл с ней работать?
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
01.02.2012, 19:58     разбитие программы на файлы #4
Цитата Сообщение от MaxFX Посмотреть сообщение
Помимо этого центральный файл не хочет открывать заголовочный файл, пишет что "нет такого файла"
Объявили неправильно. Заголовочные файлы ведь пользовательские.
C++
1
2
3
4
5
6
7
8
9
// так неправильно
#ifndef <functions.h>
#define <functions.h>
 
// так правильно
#ifndef FUNCTIONS
#define FUNCTIONS
#include "functions.h"
#endif
Цитата Сообщение от MaxFX Посмотреть сообщение
...не смотря на то что оба файла в одной и той же папке.
Одно дело, когда они в одной папке и совсем другое, когда они добавлены в проект


Цитата Сообщение от MaxFX Посмотреть сообщение
И ещё вопросик:
Если я объявляю глобальную переменную в главном файле сможет ли под файл с ней работать?
Нет.
В телах функций, лежащих в подфайлах, объявляйте свои переменные, ну а в главном файле вызывайте их, по надобности передавая глобальную переменную.
Либо объявите эту переменную в заголовочном файле и его подключайте к остальным. Тогда уже переменная будет доступна всем.
MaxFX
2 / 2 / 0
Регистрация: 22.10.2010
Сообщений: 37
01.02.2012, 21:22  [ТС]     разбитие программы на файлы #5
Спасибо за разъяснения.

Заголовочный файл объявил как вы сказали - все заработало. Только глобальные переменные объявленные в заголовочном файле капризничают, цитирую:

error LNK2005: "int x1" (?x1@@3HA) already defined in functions.obj

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

Во общем мне нужно добиться одного из двух: либо объявить глобальные переменные чтоб у всех файлов был к ним доступ. Либо заставить функции возвращать больше одного параметра. Посоветуйте пожалуйста как такое реализовать.
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
01.02.2012, 21:49     разбитие программы на файлы #6
Цитата Сообщение от MaxFX Посмотреть сообщение
Во общем мне нужно добиться одного из двух: либо объявить глобальные переменные чтоб у всех файлов был к ним доступ. Либо заставить функции возвращать больше одного параметра. Посоветуйте пожалуйста как такое реализовать.
Передавайте адрес переменной в функцию.
Например, нужно изменить значение a и b:
C++
1
2
3
4
5
6
7
8
// объявление функции
void func(int &a, int &b); // & показывает, что будем работать с переменной "напрямую"
....
//в функции main()
int a=5, b=3;
...
func(a, b);
// В итоге, все изменения переменных "сохранятся".
Добавлено через 11 минут
Цитата Сообщение от MaxFX Посмотреть сообщение
Только глобальные переменные объявленные в заголовочном файле капризничают
Их тоже так просто не объявишь
Если переменная должна быть объявлена во всех подфайлах (давайте уже правильно выражаться - модулях), то нужно снова работать с #ifndef/#endif
Для этого можно было бы создать отдельный модуль global.h
C++
1
2
3
4
5
6
#ifndef GLOBAL
#define GLOBAL
 
extern int x1;
 
#endif
Ну и инициализировать их в отдельном модуле global.cpp
C++
1
2
#include "global.h"
x1 = 0;
Ну и подключать их в нужных модулях.
Все же, не советую так играть с глобальными переменными. Раз такая надобность в изменении переменных, то лучше передавать их по адресу. Так надежнее, да и заморочек меньше.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2012, 22:06     разбитие программы на файлы
Еще ссылки по теме:

C++ Разбитие массива на некое количество подмассивов одинаковой длинны
C++ Разбиение программы на файлы

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

Или воспользуйтесь поиском по форуму:
MaxFX
2 / 2 / 0
Регистрация: 22.10.2010
Сообщений: 37
01.02.2012, 22:06  [ТС]     разбитие программы на файлы #7
Огромное спасибо, теперь все работает!!!
Yandex
Объявления
01.02.2012, 22:06     разбитие программы на файлы
Ответ Создать тему
Опции темы

Текущее время: 21:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru