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

Что-то в шаблоне не так - C++

Восстановить пароль Регистрация
 
Андрей0792
 Аватар для Андрей0792
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 16
25.12.2012, 07:49     Что-то в шаблоне не так #1
Сделал несколько шаблонных функций для одномерных массивов. Далее код. Всё работает, всё хорошо. Но...

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
#include <iostream>
#include <conio.h>
#include <numeric>
#include <cstdlib>
 
using namespace std;
 
template <int n, typename T> class MAS{
    private:
        T *mas;
    public:
        MAS(T *mas1){
            mas=new T[n];
            for(int i=0; i<n; i++)
                mas[i]=mas1[i];
        }
        MAS create();
        T max_zna();
        int zero1();
        int zero2();
        T Mul_inter_zer();
        void inversion();
        void print();
};
 
int main(int argc, char *argv[]){
    setlocale(LC_ALL, "Russian");
    int n=15;
    int  mas1[]={-1, 2, 0, -3, 4, 5, -6, 7, 8, -9, 0, -5, 13, 4, -15};
    float mas[]={-1.2, 2.7, 0, -3.4, 0.4, 5.5, -6.1, 7, 8, -9.9, 0, -5.4, 13.2, 4.8, -15.6};
 
    cout << endl << "*** Пример для вещественных значений ***" << endl;
    MAS <15, float> m(mas);
    m.print();
    cout << "Максимальный элемент: "                    << m.max_zna()     << endl;
    cout << "Произведение эл-ов между двумя нулевыми: " << m.Mul_inter_zer() << endl;
    m.inversion();
    m.print();
 
    cout << endl << "*** Пример для целых значений ***"<<endl;
    MAS <15, int> m1(mas1);
    m1.print();
    cout << "Максимальный элемент: "                    << m1.max_zna()     << endl;
    cout << "Произведение эл-ов между двумя нулевыми: " << m1.Mul_inter_zer() << endl;
    m1.inversion();
    m1.print();
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
template <int n, typename T> MAS<n,T> MAS<n,T>::create(){
    int nn;
    T *mas1;
    cout << "Input demention" << endl;
    do{
        cin >> nn;
    }
    while(nn<0);
 
    mas1=new T [nn];
    cout << "Input " << nn << " elements" << endl;
    for(int i=0; i<nn; i++)
        cin >> mas1[i];
    MAS m(mas1, nn);
    *this = m;
    return m;
}
 
template <int n, typename T> T MAS<n,T>::max_zna(){
    T max=0;
    for (int i=0; i<n; i++)
        if (mas[i]>max)
            max=mas[i];
    return max;
}
 
template <int n, typename T> int MAS<n,T>::zero1(){
    int zero1=0;
    for(int i=0; i<n; i++){
        if(mas[i]==0){
            zero1=i;
            break;
        }
    }
    return zero1;
}
 
template <int n, typename T> int MAS<n,T>::zero2(){
    int zero2;
   for(int i=0; i<n; i++){
        if(mas[i]==0){
            zero2=i;
        }
    }
    return zero2;
}
 
template <int n, typename T> T MAS<n,T>::Mul_inter_zer(){
    T p=1;
    for(int i=zero1()+1; i<zero2(); i++)
        p=p*mas[i];
    return p;
}
 
template <int n, typename T> void MAS<n,T>::inversion(){
    T c;
    for (int i=0; i<n/2;i++){
        c=mas[i];
        mas[i]=mas[n-i-1];
        mas[n-i-1]=c;
    }
}
 
template <int n, typename T> void MAS<n,T>::print(){
    int i;
    for(int i=0; i<n; i++)
        cout << "Эл-нт ["<< i << "] = " << mas[i] << endl;
    cout << '\n';
}


...делаю все так же для двумерного массива (матрицы), и Code::Blocks не распознает функцию MATR, говорит нет мол её. А я уже чувствую себя сумасшедшим. В чем ошибка? Далее второй код(неправильный). P.S. До того как я начал зашаблонивать, в лоб и через функции она работала.

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
#include <iostream>
#include <stdlib.h>
#include <numeric>
#include <conio.h>
 
using namespace std;
 
template <int n, typename T> class MATR{
    private:
        T **mat;
    public:
        MATR(T **mat1, int nn){
            mat=new T *[nn];
            for(int i=0; i<nn; i++)
                mat[i]=new T[n];
            for(int i=0; i<nn; i++)
                for(int j=0; j<nn; j++)
                    mat[i][j]=mat1[i][j];
        }
        MATR create();
        void sum_negative();
        T rows_and_colums();
        void print();
};
 
int main(int argc, char **argv[]){
    setlocale(LC_ALL, "Russian");
    int n = 8;
    int mat1[8][8]={{-1 ,  2 ,  3 , -4 ,  5 ,  6 ,  7 ,   8},
                    { 2 ,  3 ,  3 ,  5 ,  9 ,  8 ,  5 ,   9},
                    { 3 ,  4 ,  5 ,  6 ,  6 ,  7 ,  4 ,  10},
                    {-4 ,  5 ,  6 ,  7 ,  8 ,  9 , 10 ,  11},
                    { 5 ,  3 ,  4 ,  8 , 10 ,  9 ,  4 ,  12},
                    { 6 ,  5 ,  2 ,  9 ,  3 ,  1 , 11 ,  13},
                    { 7 , 14 , 15 , 10 , 11 ,  3 ,  2 ,  14},
                    { 8 ,  9 , 10 , 11 , 12 , 13 , 14 , -15}};
 
    float mat[8][8]={{-1.1 , 2.1 ,  3.1 , -4.1 ,  5.1 ,  6.1 ,  7.1 ,   8.1},
                     { 2.1 , 3.2 ,  3.3 ,  5.2 ,  9.8 ,  8.5 ,  5.9 ,   9.3},
                     { 3.1 , 4.3 ,  5.4 ,  6.3 ,  6.4 ,  7.4 ,  4.1 ,  10.4},
                     {-4.1 , 5.2 ,  6.3 ,  7.4 ,  8.5 ,  9.6 , 10.7 ,  11.8},
                     { 5.1 ,   3 ,    4 ,  8.5 , 10.2 ,  9.4 ,  4.9 ,  12.5},
                     { 6.1 ,   5 ,    2 ,  9.6 ,  3.2 ,  1.2 , 11.5 ,  13.6},
                     { 7.1 ,  14 ,   15 , 10.7 , 11.2 ,  3.2 ,  2.3 ,  14.7},
                     { 8.1 , 9.3 , 10.4 , 11.8 , 12.5 , 13.6 , 14.7 , -15.8}};
 
    cout << endl << "*** Пример для вещественных значений ***"<<endl;
    MATR <8, float> m(mat);
    m.print();
    m.rows_and_colums();
    m.sum_negative();
 
    cout << endl << "*** Пример для целых значений ***"<<endl;
    MATR <8, int> m1(mat1);
    m1.print();
    m1.rows_and_colums();
    m1.sum_negative();
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
template <int n, typename T> MATR<n,T> MATR<n,T>::create(){
    int i,j;
    cout << "Input demtntion" << endl;
    do
        cin >> n;
    while(n<0);
 
    mat=new T *[n];
    for(i=0; i<n; i++)
        mat[i]=new T [n];
    cout << "Input " << n*n << " elements" << endl;
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
            cin >> mat[i][j];
    MATR m(mat);
    *this=m;
    return m;
}
 
template <int n, typename T> void MATR<n,T>::sum_negative(){
    int i,j;
    T *sum;
    sum=new T [n];
    for(i=0; i<n; i++){
        sum[i]=0;
        for(j=0; j<n; j++){
            if(mat[i][j]<0){
                sum[i]+=mat[i][j];
            }
        }
    }
    cout << "Сумма эл-ов строки с отрицательными эл-ми" << endl;
    for(i=0; i<n; i++)
        cout << sum[i] << ' ';
    cout << endl;
}
 
template <int n, typename T> T MATR<n,T>::rows_and_colums(){
    bool matches[n];
    int flag;
    int mat1[8][8];
    for(int i=0; i<=n; i++){
        matches[i] = 0;
        flag = 0;
        for(int j=0; j<=n; j++){
            if (mat1[i][j] == mat1[j][i])
                flag++;
        }
        if (flag == n)
            matches[i] = 1;
        cout << endl;
    }
    cout << endl;
    for (int i=0; i<=n; i++){
        if (matches[i])
            cout << "\nСовпадают строка и столбец под номером: " << i;
    }
    return 0;
}
 
template <int n, typename T> void MATR<n,T>::print(){
    int i,j;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            cout.width(5);
            cout << mat[i][j];
        }
        cout << endl;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 07:49     Что-то в шаблоне не так
Посмотрите здесь:

C++ Что не так?
что не так? C++
C++ что-то не так
что-то не так C++
что не так? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.12.2012, 08:20     Что-то в шаблоне не так #2
В первом случае массив (mas/mas1) неявно приводится к указателю, но такое преобразование работает только один раз, т.е. двумерный массив может быть преобразован максимум к указателю на массив, но не к указателю на указатель.

Добавлено через 2 минуты
Можно попробовать добавить явное приведение к указателю на указатель при передаче аргумента, но я вообще не уверен, корректно ли это.

Добавлено через 10 минут
Или добавь конструктор из ссылки на двумерный массив, примерно так:
C++
1
2
3
explicit MATR(T const (&array)[n][n]) {
   // ...
}
Андрей0792
 Аватар для Андрей0792
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 16
25.12.2012, 22:03  [ТС]     Что-то в шаблоне не так #3
Не получилось у меня. С преподом сегодня говорил по этому поводу - он тоже в ступор впал. Я Даже уже начал грешить может последовательности в функции и вызове путаю, но тоже всё норм.

Я понимаю, что через рандомные матрицы было бы проще вызывать, но у меня в условии задания пункт, в котором прога должна выводить совпадающие строки и столбцы. Поэтому пришлось вручную. Мне в универе предложили добавить нулевую рандомную матрицу, но я не знаю как её тут присобачить и вообще с какого бока начать. Может у кого-то есть идеи?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.12.2012, 22:22     Что-то в шаблоне не так #4
Андрей0792, я ничего не понял) Поправил код из первого поста, чтобы он хотя бы компилировался:
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
#include <iostream>
#include <cstdlib>
#include <numeric>
//#include <conio.h>
#include <algorithm>
 
 
using namespace std;
 
template <int n, typename T> class MATR{
    private:
        T **mat;
    public:
        MATR(T **mat1, int nn){
            mat=new T *[nn];
            for(int i=0; i<nn; i++)
                mat[i]=new T[n];
            for(int i=0; i<nn; i++)
                for(int j=0; j<nn; j++)
                    mat[i][j]=mat1[i][j];
        }
        
        explicit MATR(T const (&array)[n][n]) {
           mat = new T *[n];
           for (int i = 0; i != n; ++i) {
              mat[i] = new T[n];
              std::copy(&array[i][0], &array[i][0] + n, &mat[i][0]);
           }
        }
 
        ~MATR() {
           for (int i = 0; i != n; ++i) {
              delete[] mat[i];
           }
           delete[] mat;
        }
        
        //MATR create();
        void sum_negative();
        T rows_and_colums();
        void print();
};
 
int main() {
    //setlocale(LC_ALL, "Russian");
    int n = 8;
    int mat1[8][8]={{-1 ,  2 ,  3 , -4 ,  5 ,  6 ,  7 ,   8},
                    { 2 ,  3 ,  3 ,  5 ,  9 ,  8 ,  5 ,   9},
                    { 3 ,  4 ,  5 ,  6 ,  6 ,  7 ,  4 ,  10},
                    {-4 ,  5 ,  6 ,  7 ,  8 ,  9 , 10 ,  11},
                    { 5 ,  3 ,  4 ,  8 , 10 ,  9 ,  4 ,  12},
                    { 6 ,  5 ,  2 ,  9 ,  3 ,  1 , 11 ,  13},
                    { 7 , 14 , 15 , 10 , 11 ,  3 ,  2 ,  14},
                    { 8 ,  9 , 10 , 11 , 12 , 13 , 14 , -15}};
 
    float mat[8][8]={{-1.1 , 2.1 ,  3.1 , -4.1 ,  5.1 ,  6.1 ,  7.1 ,   8.1},
                     { 2.1 , 3.2 ,  3.3 ,  5.2 ,  9.8 ,  8.5 ,  5.9 ,   9.3},
                     { 3.1 , 4.3 ,  5.4 ,  6.3 ,  6.4 ,  7.4 ,  4.1 ,  10.4},
                     {-4.1 , 5.2 ,  6.3 ,  7.4 ,  8.5 ,  9.6 , 10.7 ,  11.8},
                     { 5.1 ,   3 ,    4 ,  8.5 , 10.2 ,  9.4 ,  4.9 ,  12.5},
                     { 6.1 ,   5 ,    2 ,  9.6 ,  3.2 ,  1.2 , 11.5 ,  13.6},
                     { 7.1 ,  14 ,   15 , 10.7 , 11.2 ,  3.2 ,  2.3 ,  14.7},
                     { 8.1 , 9.3 , 10.4 , 11.8 , 12.5 , 13.6 , 14.7 , -15.8}};
 
    cout << endl << "*** Пример для вещественных значений ***"<<endl;
    MATR <8, float> m(mat);
    m.print();
    m.rows_and_colums();
    m.sum_negative();
 
    cout << endl << "*** Пример для целых значений ***"<<endl;
    MATR <8, int> m1(mat1);
    m1.print();
    m1.rows_and_colums();
    m1.sum_negative();
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
//template <int n, typename T> MATR<n,T> MATR<n,T>::create(){
//    int i,j;
//   cout << "Input demtntion" << endl;
//    do
//        cin >> n;
//    while(n<0);
// 
//    mat=new T *[n];
//    for(i=0; i<n; i++)
//        mat[i]=new T [n];
//    cout << "Input " << n*n << " elements" << endl;
//    for(i=0; i<n; i++)
//       for(j=0; j<n; j++)
//            cin >> mat[i][j];
//    MATR m(mat);
//    *this=m;
//    return m;
//}
 
template <int n, typename T> void MATR<n,T>::sum_negative(){
    int i,j;
    T *sum;
    sum=new T [n];
    for(i=0; i<n; i++){
        sum[i]=0;
        for(j=0; j<n; j++){
            if(mat[i][j]<0){
                sum[i]+=mat[i][j];
            }
        }
    }
    cout << "Сумма эл-ов строки с отрицательными эл-ми" << endl;
    for(i=0; i<n; i++)
        cout << sum[i] << ' ';
    cout << endl;
}
 
template <int n, typename T> T MATR<n,T>::rows_and_colums(){
    bool matches[n];
    int flag;
    int mat1[8][8];
    for(int i=0; i<=n; i++){
        matches[i] = 0;
        flag = 0;
        for(int j=0; j<=n; j++){
            if (mat1[i][j] == mat1[j][i])
                flag++;
        }
        if (flag == n)
            matches[i] = 1;
        cout << endl;
    }
    cout << endl;
    for (int i=0; i<=n; i++){
        if (matches[i])
            cout << "\nСовпадают строка и столбец под номером: " << i;
    }
    return 0;
}
 
template <int n, typename T> void MATR<n,T>::print(){
    int i,j;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            cout.width(5);
            cout << mat[i][j];
        }
        cout << endl;
    }
}
http://liveworkspace.org/code/1HVJW9
Андрей0792
 Аватар для Андрей0792
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 16
25.12.2012, 23:18  [ТС]     Что-то в шаблоне не так #5
Спасибо. Тебе хоть как-то удалось заставить её работать. Есть правда одно но. Он не видит функцию m.rows_and_colums(проверяет строки и столбцы на совпадения, а в каждой матрице у меня по три таких) =(
Но всё равно спасибо.
Yandex
Объявления
25.12.2012, 23:18     Что-то в шаблоне не так
Ответ Создать тему
Опции темы

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