42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
1

Разделение программы на файлы

29.01.2013, 16:00. Показов 4727. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Изучаю алгоритмы сортировки. Вот что уже написал:

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
//sort.cpp
 
#include "sort.h"
 
template <class T>
void SelectSort(T list[], int size)
{
    int minPtr;
 
    for(int i = 0; i < size - 1; i++)
    {
        //ищем минимимальный элемент в списке list[i + 1, ... , size - 1]
        minPtr = i + 1;
        for(int j = minPtr + 1; j < size; j++)
            if(list[j] < list[minPtr])
                minPtr = j;
 
        //меняем местами найденный элемент и list[i] (если требуется)
        if(list[minPtr] < list[i])
            swap(list[minPtr], list[i]);
    }
}
 
template <class T>
void InsertSort(T list[], int size)
{
    int location;
    T newElement;
 
    for(int i = 1; i < size; i++){
        newElement = list[i];
        location = i - 1;
 
        //поиск места для вставки нового элемента
        while((location >= 0) && (list[location] > newElement)){
            list[location + 1] = list[location];
            location--;
        }
 
        //место найдено, вставляем новый элемент
        list[location + 1] = newElement;
    }
}
 
template <class T>
void BubbleSort(T list[], int size)
{
    for(int pass = 1; pass <= size - 1; pass++)
        for(int elem = 0; elem < size - pass ; elem++)
            if(list[elem] > list[elem + 1])
                swap(list[elem], list[elem + 1]);
}
 
template <class T>
void BubbleSortFast(T list[], int size)
{
    bool swapped = true;
 
    for(int i = 1; swapped && (i <= size-1); i++){
        swapped = false;
 
        for(int j = 0; j < size - i; j++)
            if(list[j] > list[j + 1]){
                swap(list[j], list[j + 1]);
                swapped = true;
            }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   //sort.h
#include <iostream>
using namespace std;
 
//сортировка выбором
template <class T>
void SelectSort(T list[], int size);
 
//сортировка вставками
template <class T>
void InsertSort(T list[], int size);
 
//сортировка пузырьком
template <class T>
void BubbleSort(T list[], int size);
 
//модифицированная сортировка пузырьком
template <class T>
void BubbleSortFast(T list[], int size);

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  //main.cpp
#include "sort.h"
 
int main(void){
    const int SIZE = 11;
    int list[SIZE] = {1,45,123,5,2,034,6,23,4,56,2};
 
    ::BubbleSortFast(list, SIZE);
    for(int i = 0; i < SIZE; i++)
        cout << list[i] << ' ';
    cout << endl;
 
    return 0;
}
Выскакивает ошибка, которая на фото. Если весь код засовываю в один файл main.cpp, тогда всё работает. Как вы считаете в чём может быть дело???
Миниатюры
Разделение программы на файлы  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2013, 16:00
Ответы с готовыми решениями:

Разделение программы на файлы
Начал повторять благополучно забытые основы С++ и возник вопрос. Для начала, есть три файла:...

Разделение программы на .h .cpp файлы
Требуется разделить текст программы на независимые модули. проблема в том, что они не &quot;видят' друг...

Классы в С++. Разделение программы на файлы. Объясните пожалуйста на пальцах
Доброго всем времени суток. Столкнулся с проблемой не переваривания интернет информации...

Разделение на файлы
Здравствуйте, друзья! не подскажите почему у меня ругается, когда прогу делю на файлы. Вот куски: ...

21
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
29.01.2013, 16:13  [ТС] 2
Кажется я обнаружил, как ошибку исправить. Я попробовал переписать весь код убрав шаблоны и используя вместо класса T везде тип int. Программа заработала. Но в чём тогда ошибка? И как использовать шаблоны при разделение программа на файлы?

Добавлено через 39 секунд
Чего я незнаю?
0
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
29.01.2013, 16:15 3
В чем причина не знаю, но скорее всего связано с тем щи вы используемой шаблоны. Там есть свои причуды связанные с файлами. Но если в main включить sort.cpp то все работает.

Вот так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//sort.h
#include <iostream>
using namespace std;
 
//сортировка выбором
template <class T>
void SelectSort(T list[], int size);
 
//сортировка вставками
template <class T>
void InsertSort(T list[], int size);
 
//сортировка пузырьком
template <class T>
void BubbleSort(T list[], int size);
 
//модифицированная сортировка пузырьком
template <class T>
void BubbleSortFast(T list[], int size);
 
#include "sort.cpp"
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
//sort.cpp
 
template <class T>
void SelectSort(T list[], int size)
{
    int minPtr;
 
    for(int i = 0; i < size - 1; i++)
    {
        //ищем минимимальный элемент в списке list[i + 1, ... , size - 1]
        minPtr = i + 1;
        for(int j = minPtr + 1; j < size; j++)
            if(list[j] < list[minPtr])
                minPtr = j;
 
        //меняем местами найденный элемент и list[i] (если требуется)
        if(list[minPtr] < list[i])
            swap(list[minPtr], list[i]);
    }
}
 
template <class T>
void InsertSort(T list[], int size)
{
    int location;
    T newElement;
 
    for(int i = 1; i < size; i++){
        newElement = list[i];
        location = i - 1;
 
        //поиск места для вставки нового элемента
        while((location >= 0) && (list[location] > newElement)){
            list[location + 1] = list[location];
            location--;
        }
 
        //место найдено, вставляем новый элемент
        list[location + 1] = newElement;
    }
}
 
template <class T>
void BubbleSort(T list[], int size)
{
    for(int pass = 1; pass <= size - 1; pass++)
        for(int elem = 0; elem < size - pass ; elem++)
            if(list[elem] > list[elem + 1])
                swap(list[elem], list[elem + 1]);
}
 
template <class T>
void BubbleSortFast(T list[], int size)
{
    bool swapped = true;
 
    for(int i = 1; swapped && (i <= size-1); i++){
        swapped = false;
 
        for(int j = 0; j < size - i; j++)
            if(list[j] > list[j + 1]){
                swap(list[j], list[j + 1]);
                swapped = true;
            }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "sort.h"
 
 
int main(){
    const int SIZE = 11;
    int list[SIZE] = {1,45,123,5,2,034,6,23,4,56,2};
 
    ::BubbleSortFast(list, SIZE);
    for(int i = 0; i < SIZE; i++)
        cout << list[i] << ' ';
    cout << endl;
    system("pause>0");
    return 0;
}
1
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
29.01.2013, 16:20  [ТС] 4
Цитата Сообщение от The_bolT Посмотреть сообщение
Но если в main включить sort.cpp то все работает
Что вы имеет ввиду?

Добавлено через 43 секунды
Как же тогда использовать шаблоны при раздельной компиляции?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.01.2013, 16:21 5
И объявления и реализация шаблонов должны быть в одном .h файле, только если это не специализация.

Цитата Сообщение от bgm123 Посмотреть сообщение
Как же тогда использовать шаблоны при раздельной компиляции?
Никак. Все в один .h файл.
2
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 16:21 6
Шаблоны нельзя использовать при раздельной компиляции, потому что значения в шаблоны подставляются на момент компиляции основной программы
1
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
29.01.2013, 16:27  [ТС] 7
Цитата Сообщение от Toshkarik Посмотреть сообщение
И объявления и реализация шаблонов должны быть в одном .h файле, только если это не специализация
Это какая-то недоработка разработчиков? Или так и должно быть?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.01.2013, 16:29 8
bgm123, это специфика механизма работы шаблонов.
0
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:08 9
Цитата Сообщение от Toshkarik Посмотреть сообщение
Никак. Все в один .h файл.
а как же стр.327 "С++ для професионалов" А.Скотлер, Скотт Дж.Клепер?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.01.2013, 18:11 10
Alexxx7, К шаблонам данное не относится. Даже boost, использует включение .ipp файлов довольно нечасто.
0
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:24 11
ForEveR, Тогда подскажите у меня частный случай и так лучше впреть не делать?
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "arry.h"
#include "arry.cpp"
void main(){
    arry<int> first;
    first.pushEnd(10);
    first.pushEnd(1);
    first.pushEnd(2);
    first.pushEnd(3);
    first.pushEnd(34);
    first.pushEnd(56);
    first.pushEnd(1);
    first.show();
}
arry.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include<iostream>
 
using namespace std;
template <class T>
class arry
{
    T *ptr;
    size_t size;
    bool chekSize( size_t size);
    
public:
    arry();
    arry(size_t size);
    void pushEnd( int volue);
    void EraseEnd( size_t size);
    void show(void);
    ~arry(void);
};
arry.cpp реализация методов класса
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
#include "arry.h"
template <class T>
arry<T>::arry(){
    ptr = NULL;
    size = 0;
}
template <class T>
arry<T>::arry(size_t size){
    ptr = new T[size] = {0};
    this->size = size;
}
template <class T>
bool arry<T>::chekSize( size_t size){
    this->size < size? return false: return true;
}
template <class T>
void arry<T>::pushEnd( int volue){
    if(ptr == NULL){
        ptr = new T;
        *ptr = volue;
    }
    else{
        T *temp = new T[size+1];
        for(int i = 0; i<size; i++)
            temp[i] = ptr[i];
        temp[size] = volue;
        delete []ptr;
        ptr = temp;
    }
    size++;
}
template <class T>
void arry<T>:: EraseEnd( size_t size){
}
template <class T>
void arry<T>::show(void){
    cout<<"Show:\n";
    for(int i = 0; i<size; i++)
            cout<<ptr[i]<<" ";
    cout<<endl;
}
template <class T>
arry<T>::~arry(void){
    delete []ptr;
}
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
31.01.2013, 18:33 12
Alexxx7, неудобно в клиентском коде подключать два файла, относящиеся по факту к одной сущности. Если так тянет разделить код по файлам, то в конце заголовочного файла можете подключить файл с реализацией.
0
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:41 13
0x10, Да но тогда его нужно делать тоже .h, я подставлял с разширением .cpp выдаёт ошибку что функции уже объявлены. О ещё вариант, можно подключить в клиентский код super.h а в него включить
#include "arry.h"
#include "arry.cpp"
тоже работает, как говорится и "рыбку съесть - и бутылку сдать".
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
31.01.2013, 18:48 14
Alexxx7, нельзя делать вот так:

Цитата Сообщение от Alexxx7 Посмотреть сообщение
#include "arry.cpp"
0
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
31.01.2013, 18:52 15
Можно просто подключить в конец объявления класса, и не нужно будет это делать
Цитата Сообщение от Toshkarik Посмотреть сообщение
Alexxx7, нельзя делать вот так:
Сообщение от Alexxx7
#include "arry.cpp"
И все счастливы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include<iostream>
 
using namespace std;
template <class T>
class arry
{
    T *ptr;
    size_t size;
    bool chekSize( size_t size);
    
public:
    arry();
    arry(size_t size);
    void pushEnd( int volue);
    void EraseEnd( size_t size);
    void show(void);
    ~arry(void);
};
#include "arry.cpp"
0
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:52 16
Toshkarik, если нельзя, значит не будем, только почему в книге пишут что можно, или это просто выворот такой, который в последствии может стать минингитом?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
31.01.2013, 18:54 17
The_bolT, так тоже нельзя делать.

Добавлено через 48 секунд
Alexxx7, где это пишут?
0
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:54 18
стр.327 "С++ для професионалов" А.Скотлер, Скотт Дж.Клепер?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
31.01.2013, 19:28 19
Alexxx7, я эту книгу не читал. Но думаю авторы имели ввиду, что можно так инклудить хоть .txt файл, главное чтоб он не являлся отдельной единицей трансляции, содержащей определение нешаблонных функций/классов. Все дело в удобстве.
0
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 19:33 20
Toshkarik, Значит можно?
0
31.01.2013, 19:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2013, 19:33
Помогаю со студенческими работами здесь

Разделение на файлы
Может кто-то объяснить как разделять код на файлы? (я так понял нужно создать заглавный файл ****.h...

Разделение кода на cpp и h файлы
Добрый день. Расскажите, пожалуйста, как разделить код на два файла cpp и файл h. #include...

Разделение чередующихся строчек в разные файлы
Условие: Файл с исходными данными содержит 2 стихотворения разных авторов (строки чередуются)....

Поясните ошибку (разделение класса на файлы)
выношу реализацию в отдельный файл, но как только пытаюсь создать в функции объект класса, получаю...


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

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

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