2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 C++ использование шаблонов
Сообщение13.05.2012, 16:24 


12/05/12
19
Доброго времени суток,Дорогие Написала я значит программку,а она выдает ошибку. Предполагаю,что надо было работать с динамическим,а не со статическим массивом.
Вот само задание:
Для работы с двумерными массивами арифметических типов данных разработать шаблоны ввода и вывода массива,а также шаблон для решения основной задачи:поменять местами столбцы по правилу- первый с последним,второй с предпоследним и т.д.

а еще никак не могу понять,как сформировать массивы нормально здесь( выводятся упорно в одну строку. Печаль.


Вот код:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
  1.  #include <iostream>
  2.  using namespace std;
  3.  
  4.  template <typename X>
  5.  void getArray ( X *a,int &n,int &m) //вот этот кусок-ввод массива
  6.  { cout<<"n="; cin>>n;
  7.  cout<<"m="; cin>>m;
  8.  for (int i=0;i<n;i++,cout<<endl)
  9.  for (int j=0;j<m;j++)
  10.  {cout<<"a["<<i<<"]["<<j<<"]="<<;
  11.  cin>>a[i][j]>>"\t";}
  12.  return;
  13.  
  14.  }
  15.  template <typename X> //это вывод на экран
  16.  void printArray ( X *a,int n,int m)
  17.  {
  18.  for (int i=0;i<n;i++)
  19.  for (int j=0;j<m;j++)
  20.  cout<<a[i][j]<<"\t";
  21.  cout<<endl;}
  22.  
  23.  template <typename X> // здесь меняем местами столбцы
  24.  void zadanieArray (X *a, int n, int m)
  25.  {
  26.  X z;
  27.  for (int i=0;i<n;i++)
  28.  for (int j=0;j<(m/2);j++)
  29.  { z=a[i][j];
  30.  a[i][j]=a[i][m-j-1];
  31.  a[i][m-j-1]=z;}
  32.  }
  33.  
  34.  int main()
  35.  { int n,m; //тут мы вызываем функции-шаблоны,да?
  36.  int a[100][100];
  37.  getArray(a,n,m);
  38.  printArray(a,n,m);
  39.  zadanieArray(a,n,m);
  40.  double b[100][100];
  41.  printArray(a,n,m);
  42.  }

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 06:26 


24/05/09

2054
killeraleksana в сообщении #570349 писал(а):
...а еще никак не могу понять,как сформировать массивы нормально здесь( выводятся упорно в одну строку.

Перевод на другую строку - символ "\n", а у вас "\t" - может в этом дело?

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 13:26 


01/07/08
836
Киев
Alexu007 в сообщении #570579 писал(а):
Перевод на другую строку - символ "\n", а у вас "\t" - может в этом дело?

У ТС имеется endl, только использовать его нужно внутри цикла. Уверен что ТС справится с этим. :?
С уважением,

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 14:29 


01/07/08
836
Киев
killeraleksana в сообщении #570349 писал(а):
Вот код:


Исправление синтаксических ошибок, дело рук самого ТС. В противном случае задавайте вопросы по каждой ошибке конкретно. Можно в одном посте. :wink: С уважением,

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 18:56 


12/05/12
19
еще проблема- ошибка в этой строке.
zadanieArray(a,n,m);


Я неправильно обратилась к функции или что?

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 21:34 
Заслуженный участник


27/04/09
28128
Вы бы написали код ошибки и её описание. Всё-таки не станут же все копировать код и запускать, это долго.

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 23:13 


01/07/08
836
Киев
arseniiv в сообщении #570965 писал(а):
Всё-таки не станут же все копировать код и запускать, это долго.


А исправлять "то не знаю что" ( в смысле или не описано, или не реализовано) разве быстрее? С уважением,

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 23:35 
Заслуженный участник


27/04/09
28128
Вот именно, что без описания ошибки это «то, не знаю что».

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение16.05.2012, 14:53 


06/04/09
156
Воронеж
Зачем шаблоны так использовать не понятно, но да ладно...

Цитата:
еще проблема- ошибка в этой строке.
zadanieArray(a,n,m);

Вы просто не совсем правильно (не разобрались) используете шаблонные параметры и укзатели. Если первые две функции прощали это в следствие специфики языка и работы проца, то в этой компилятор уже не смог помочь. :(

1.
Код:
int a[100][100];

Главное понять, что а, фактически, int**

2.
Код:
template <typename X> // здесь меняем местами столбцы
void zadanieArray (X *a, int n, int m)

С учетом п. 1, что такое будет Х?

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение16.05.2012, 17:27 
Заслуженный участник


04/05/09
4582
p51x в сообщении #571778 писал(а):
1.
Код:
int a[100][100];

Главное понять, что а, фактически, int**
Неправда.
Фактически это будет именно int[100][100], хотя может использоваться как указатель на int[100], но никак не как указатель на указатель на int.
p51x в сообщении #571778 писал(а):
2.
Код:
template <typename X> // здесь меняем местами столбцы
void zadanieArray (X *a, int n, int m)

С учетом п. 1, что такое будет Х?
Соответственно X будет здесь int[100].

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение22.05.2012, 01:01 


12/05/12
19
спасибо,буду разбираться.

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение18.01.2013, 17:03 


22/02/12
2
Добрый день.
Я пишу шаблон класса на C++ для работы с комплексными числами.

test.cpp
Используется синтаксис C++
<div class="codetitle"><b>Код:</b></div><div class="codecontent">#include <iostream>
#include "mycomplex.h"
using namespace std;

int main()
{
        complex<int> c = complex<int>(1, 2);
        cout << c.Re();
        return 0;
}</div>


mycomplex.h
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
<div class="codetitle"><b>Код:</b></div><div class="codecontent">#pragma once

template <class T> class complex
{
private:
      T re, im;   
public:
   complex<T>(T, T);
   complex<T> operator+(complex<T>) const;
   complex<T> operator-(complex<T>) const;
   complex<T> operator*(complex<T>) const;
   bool operator==(complex<T>) const;
   bool operator!=(complex<T>) const;
   T abs(void);
   T Re(void);
   T Im(void);
   void setRe(T);
   void setIm(T);
};

</div>


mycoplex.cpp
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
<div class="codetitle"><b>Код:</b></div><div class="codecontent">#include "mycomplex.h"

template<class T> complex<T>::complex<T>(T a, T b)
{
   im = b;
   re = a;
}
template<class T> complex<T> complex<T>::operator+(complex<T> b) const
{
   return complex<T>((*.this).re + b.re, (*.this).im + b.im);
}
template<class T> complex<T> complex<T>::operator-(complex<T> b) const
{
   return complex<T>((*.this).re - b.re, (*.this).im - b.im);
}
template<class T> complex<T> complex<T>::operator*(complex<T> b) const
{
   return complex<T>((*.this).re * b.re - (*.this).im + b.im, (*.this).re * b.im + (*.this).im * b.re);
}
template<class T> bool complex<T>::operator==(complex<T> b) const
{
   return (*this).re == b.re && (*this).im == b.im;
}
template<class T> bool complex<T>::operator!=(complex<T> b) const
{
   return !((*this) == b);
}
template<class T> T complex<T>::abs(void)
{
   return im * im + re * re;
}
template<class T> T complex<T>::Re(void)
{
   return re;
}
template<class T> T complex<T>::Im(void)
{
   return im;
}
template<class T> void complex<T>::setRe(T r)
{
   re = r;
}
template<class T> void  complex<T>::setIm(T r)
{
   im = r;
}

</div>


При построении в MS Visual Studio 2010 выдает ошибку:
1>test.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall complex<int>::Re(void)" (?Re@?$complex@H@@QAEHXZ) в функции _main
1>test.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall complex<int>::complex<int>(int,int)" (??0?$complex@H@@QAE@HH@Z) в функции _main
1> fatal error LNK1120: 2 неразрешенных внешних элементов

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение18.01.2013, 17:38 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Проблема в том, что у Вас объявление и реализация шаблонного класса в разных файлах находятся.
Компилятор C++ при необходимости работы с шаблонным классом/функцией/методом берет его определение и подставляет туда нужные параметры. Соответственно, когда компилируется test.cpp, компилятор генерирует определение класса complex<int>, но, поскольку определения его методов находятся в другой единице компиляции (complex.cpp), они в test.cpp не видны и подстановка в эти шаблоны не происходит.

Либо объедините complex.h и complex.cpp в один .h-файл, либо допишите внизу complex.cpp строку
Код:
template class complex<int>;

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение18.01.2013, 18:45 


22/02/12
2
Спасибо, заработало.

 Профиль  
                  
 
 Re: C++ использование шаблонов
Сообщение18.01.2013, 19:52 
Заслуженный участник


09/09/10
3729
Более того, complex.cpp компилируется в совершенно пустой объектный файл.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group