2014 dxdy logo

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

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




 
 C++ использование шаблонов
Сообщение13.05.2012, 16:24 
Доброго времени суток,Дорогие Написала я значит программку,а она выдает ошибку. Предполагаю,что надо было работать с динамическим,а не со статическим массивом.
Вот само задание:
Для работы с двумерными массивами арифметических типов данных разработать шаблоны ввода и вывода массива,а также шаблон для решения основной задачи:поменять местами столбцы по правилу- первый с последним,второй с предпоследним и т.д.

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


Вот код:
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
killeraleksana в сообщении #570349 писал(а):
...а еще никак не могу понять,как сформировать массивы нормально здесь( выводятся упорно в одну строку.

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

 
 
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 13:26 
Alexu007 в сообщении #570579 писал(а):
Перевод на другую строку - символ "\n", а у вас "\t" - может в этом дело?

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

 
 
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 14:29 
killeraleksana в сообщении #570349 писал(а):
Вот код:


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

 
 
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 18:56 
еще проблема- ошибка в этой строке.
zadanieArray(a,n,m);


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

 
 
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 21:34 
Вы бы написали код ошибки и её описание. Всё-таки не станут же все копировать код и запускать, это долго.

 
 
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 23:13 
arseniiv в сообщении #570965 писал(а):
Всё-таки не станут же все копировать код и запускать, это долго.


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

 
 
 
 Re: C++ использование шаблонов
Сообщение14.05.2012, 23:35 
Вот именно, что без описания ошибки это «то, не знаю что».

 
 
 
 Re: C++ использование шаблонов
Сообщение16.05.2012, 14:53 
Зачем шаблоны так использовать не понятно, но да ладно...

Цитата:
еще проблема- ошибка в этой строке.
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 
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 
спасибо,буду разбираться.

 
 
 
 Re: C++ использование шаблонов
Сообщение18.01.2013, 17:03 
Добрый день.
Я пишу шаблон класса на 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 
Аватара пользователя
Проблема в том, что у Вас объявление и реализация шаблонного класса в разных файлах находятся.
Компилятор 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 
Спасибо, заработало.

 
 
 
 Re: C++ использование шаблонов
Сообщение18.01.2013, 19:52 
Более того, complex.cpp компилируется в совершенно пустой объектный файл.

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group