Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Андрей0792
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 16

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

25.12.2012, 07:49. Показов 638. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сделал несколько шаблонных функций для одномерных массивов. Далее код. Всё работает, всё хорошо. Но...

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;
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2012, 07:49
Ответы с готовыми решениями:

Авторазмер Текстбоксов делает так, что в шаблоне появляются пробелы
Печатается постоянно одна и таже справка. Меняется только кому выдана, адрес этого человека и сумма оплаты. Сделал шаблон в экселе на...

Что нужно изменить что бы при добавлении этой ссылки в дополнительной новости с одной строкой, ссылка в шаблоне отображалась и работала
В Dle можно добавлять дополнительные поля новостей и там на выбор 1 строка или много строк, если выбрать одну строку как мне нужно то...

Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при открытии программы\игры Фуллскрином. т.е...

4
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
25.12.2012, 08:20
В первом случае массив (mas/mas1) неявно приводится к указателю, но такое преобразование работает только один раз, т.е. двумерный массив может быть преобразован максимум к указателю на массив, но не к указателю на указатель.

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

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

Я понимаю, что через рандомные матрицы было бы проще вызывать, но у меня в условии задания пункт, в котором прога должна выводить совпадающие строки и столбцы. Поэтому пришлось вручную. Мне в универе предложили добавить нулевую рандомную матрицу, но я не знаю как её тут присобачить и вообще с какого бока начать. Может у кого-то есть идеи?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
25.12.2012, 22:22
Андрей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
1
 Аватар для Андрей0792
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 16
25.12.2012, 23:18  [ТС]
Спасибо. Тебе хоть как-то удалось заставить её работать. Есть правда одно но. Он не видит функцию m.rows_and_colums(проверяет строки и столбцы на совпадения, а в каждой матрице у меня по три таких) =(
Но всё равно спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.12.2012, 23:18
Помогаю со студенческими работами здесь

Что за разметка в шаблоне?
День добрый всем Django-зависимым! Подскажите что за разметку вижу в шаблоне: &lt;div class=&quot;modal-footer&quot;&gt; ...

Что означает using typename в шаблоне?
template &lt; typename T &gt; class Class_name { public: using value_type = T; ... что произошло в этом месте?...

Что означает %s в шаблоне WordPress?
Здравствуйте есть тема с wordpress есть кнопка поиска через f12 такой код: &lt;button type=&quot;submit&quot;...

Что означает символ t в данном вариативном шаблоне?
Полный код: #include &lt;iostream&gt; template &lt;typename T&gt; struct NameOf {}; #define DEF_TYPENAME(type) template &lt;&gt; \ struct...

Закладки или метки в шаблоне Word. Что посоветуете?
Приветствую, Друзья! Собираю программу для создания пояснительной записки с вводом данных через windowsform. Есть шаблон пояснительной...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru