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

Работа с шаблонами - C++

Восстановить пароль Регистрация
 
.: TAPAKAH :.
Мега Таракан
 Аватар для .: TAPAKAH :.
110 / 11 / 1
Регистрация: 24.05.2010
Сообщений: 227
25.02.2012, 21:00     Работа с шаблонами #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
#include <iostream>
#include <cstdlib>
 
//-----------------------------------------------------------
template <class T, unsigned int n1, unsigned int n2>
void InArray(T (&t)[n1][n2])
{
  for(unsigned int i = 0; i < n1; i++)
  {
    for(unsigned int j = 0; j < n2; j++)
    {
      std::cout << "Array[" << i <<"]["<< j << "]-> ";
      std::cin >> t[i][j];
    }
  }
}
 
//-----------------------------------------------------------
template <class T, unsigned int n1, unsigned int n2>
void OutArray(T (&t)[n1][n2])
{
  for(unsigned int i = 0; i < n1; i++)
  {
    for(unsigned int j = 0; j < n2; j++)
    {
      std::cout << "Array[" << i << "][" << j << "]-> ";
      std::cout << t[i][j];
      std::cout << std::endl;
    }
  }
}
 
//-----------------------------------------------------------
template <class T, unsigned int n1, unsigned int n2>
void Average(T (&t)[n1][n2])
{
  T tmp = 0;
  for(unsigned int i = 1; i < n1; i++)
    for(unsigned int j = 0; j < n2; j++)
      if(i >= j) tmp += t[i][j];
}
 
 
int main(int argc, char * argv[])
{
  const int N = 5;
  float A[N][N];
  std::cout << "------------ input array ------------" << std::endl;
  InArray(A);
  std::cout << "------------ output array ------------" << std::endl;
  OutArray(A);
  std::cout << "------------ average value ------------" << std::endl;
  Average(A);  
  system("PAUSE");
  return 0;
}

Подробности ошибки
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: conhost.exe
Версия приложения: 6.1.7601.17641
Отметка времени приложения: 4e03f6d7
Имя модуля с ошибкой: conhost.exe
Версия модуля с ошибкой: 6.1.7601.17641
Отметка времени модуля с ошибкой: 4e03f6d7
Код исключения: c0000005
Смещение исключения: 00001990
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
http://go.microsoft.com/fwlink/?link...8&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
C:\Windows\system32\ru-RU\erofflps.txt

Если не сложно, укажите ошибкудумаю она очевидная, просто я в С++ не оч. шарю...
Заранее всем премного благодарен
Миниатюры
Работа с шаблонами   Работа с шаблонами  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Devochka
 Аватар для Devochka
31 / 19 / 1
Регистрация: 07.10.2011
Сообщений: 98
25.02.2012, 21:50     Работа с шаблонами #2
Либо так
C++
1
2
template <class T>
void InArray(T *Array, unsigned int n1, unsigned int n2)
Либо так (48)
C++
1
InArray(A, n, n);
Уж очень шаблон мудренный...
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
25.02.2012, 22:02     Работа с шаблонами #3
Шаблонные функции, вроде, работают нормально, если не учитывать, что функция Average никак не обрабатывает результат.
У меня все работает, как должно. Каким образом воспроизвести ошибку?
.: TAPAKAH :.
Мега Таракан
 Аватар для .: TAPAKAH :.
110 / 11 / 1
Регистрация: 24.05.2010
Сообщений: 227
25.02.2012, 22:12  [ТС]     Работа с шаблонами #4
Devochka ща проверю и напишу результат)

lemegeton попробую добавить после 40 строки std::cout << "Average-> " << tmp;

Добавлено через 3 минуты
Devochka что то не получается воспользоваться твоим советом
выложи исправленный код пжлст
Devochka
 Аватар для Devochka
31 / 19 / 1
Регистрация: 07.10.2011
Сообщений: 98
25.02.2012, 22:42     Работа с шаблонами #5
Где-то так, но заполнение рандомно, одномерный массив, без std:: Думаю, принцип понятен и сделаешь под себя.
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
#include <iostream>
#include <ctime>
using namespace std;
 
template <typename T, typename K>
K InArray (K Arr[], T Size)
{
    srand (time(0));
    for (int i = 0; i < Size; i++)
    {
        Arr [i] = rand() % 51 - 20;
    }
    return 0;
}
 
template <typename T, typename K>
K OutArray (K Arr[], T Size)
{
    for (int i = 0; i < Size; i++)
    {
        cout << Arr [i] << '\t';
    }
    cout << endl;
    return 0;
}
 
int main()
{
    const unsigned int size = 5;
    int Array [size];
    InArray (Array, size);
    OutArray (Array, size);
    return 0;
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
25.02.2012, 22:54     Работа с шаблонами #6
Цитата Сообщение от .: TAPAKAH :. Посмотреть сообщение
lemegeton попробую добавить после 40 строки std::cout << "Average-> " << tmp;
Это все?
Я говорю, что код работает нормально. Как воспроизвести ошибку?
Devochka
 Аватар для Devochka
31 / 19 / 1
Регистрация: 07.10.2011
Сообщений: 98
25.02.2012, 23:01     Работа с шаблонами #7
Цитата Сообщение от Devochka Посмотреть сообщение
template <typename T, typename K> K OutArray (K Arr[], T Size)
Здесь можно даже лучше:
C++
1
2
template <typename T, typename K>
void OutArray (K Arr[], T Size)
Написать void вместо K в типе функции.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
25.02.2012, 23:10     Работа с шаблонами #8
Цитата Сообщение от .: TAPAKAH :. Посмотреть сообщение
template <class T, unsigned int n1, unsigned int n2>
void InArray(T (&t)[n1][n2])
Кстати, смысл такого "замысловатого" шаблона именно в том, чтобы не передавать размеры массива в функцию. Естественно, это не сработает с выделенной памятью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2012, 14:27     Работа с шаблонами
Еще ссылки по теме:

C++ Задача с шаблонами и наследованием
Работа с шаблонами и ошибка "Undefined reference" C++
C++ Работа с шаблонами С++

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

Или воспользуйтесь поиском по форуму:
.: TAPAKAH :.
Мега Таракан
 Аватар для .: TAPAKAH :.
110 / 11 / 1
Регистрация: 24.05.2010
Сообщений: 227
26.02.2012, 14:27  [ТС]     Работа с шаблонами #9
Короче, я понял корень всех моих бед - это компилятор MinGW
Измученный после танцов с бубном, я открыл RAD Studio и запустил код, который не работал в MinGW(такие же ошибки, что и в первом посте) и он без проблем заработал))

Рабочий код
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
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <cstdlib>
 
template <typename X>
void InputArray(X * a,int n1, int n2)
{
  for(int i = 0; i < n1; i++, std::cout << std::endl)
    for(int j = 0; j < n2; j++)
    {
      std::cout << "Array[" << i << "][" << j << "]-> ";
      std::cin >> a[i][j];
    }
}
 
template <typename X>
void OutputArray(X * a,int n1, int n2)
{
  for(int i = 0; i < n1; i++, std::cout << std::endl)
    for(int j = 0; j < n2; j++)
      std::cout << "a[" << i << "][" << j << "]-> " << a[i][j] << "\n";
}
 
template <typename X>
void Average(X * a, int n1, int n2)
{
  float summa = 0;
  int count = 0;
  for(int i = 0; i < n1; i++)
    for(int j = 0; j < n2; j++)
      if (i >= j)
      {
        summa += a[i][j];
        count++;
      }
  std::cout << "Average value-> " << summa/count << std::endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
  const int N = 4;
  float A[N][N];
  system("color 0a");
  std::cout << "------------ Input array ------------" << std::endl;
  InputArray(A, N, N);
  std::cout << "------------ Output array ------------" << std::endl;
  OutputArray(A, N, N);
  std::cout << "------------ Average value ------------" << std::endl;
  Average(A, N, N);
  system("PAUSE");
  return 0;
}
Yandex
Объявления
26.02.2012, 14:27     Работа с шаблонами
Ответ Создать тему
Опции темы

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