когда я использую указатель, ввод: 5 вывод: 0x29987, но когда я не использую указатель, я получаю ошибку в строке 18. - PullRequest
0 голосов
/ 30 апреля 2020
#include <iostream>
#include <string>
using namespace std;
template <class T> void sortArray(T items, int count) {
  T t;
  for (int a = 1; a < 5; a++) {
    for (int b = count - 1; b >= a; b--) {
      if (items[b - 1] > items[b]) {
        t = items[b - 1];
        items[b - 1] = items[b];
        items[b] = t;
      }
    }
  }
}
template <class T> void printArray(T items, int count) {
  T array[5];
  for (int i = 0; i < count; i++) {
    cout << array[i] << " ";
  }
}
int main() {
  int b[5];
  double d[5];
  char c[5];
  int i = 0;
  while (i < 5) {
    cin >> b[i];
    i++;
  }
  i = 0;
  while (i < 5) {
    cin >> d[i];
    i++;
  }
  i = 0;
  while (i < 5) {
    cin >> c[i];
    i++;
  }
  sortArray(b, 5);
  sortArray(d, 5);
  sortArray(c, 5);
  printArray(b, 5);
  printArray(d, 5);
  printArray(c, 5);
  return 0;
} 

1 Ответ

1 голос
/ 30 апреля 2020

Для начала даже эта функция

template <class T> void printArray(T items, int count) {
  T array[5];
  for (int i = 0; i < count; i++) {
    cout << array[i] << " ";
  }
}

не имеет смысла. Объявлен неинициализированный локальный массив array, который выводится в al oop.

. Функцию можно определить следующим образом

template <class T> 
std::ostream & printArray( const T *items, size_t n, std::ostream &os = std::cout ) 
{
    for ( size_t i = 0; i < n; i++ ) 
    {
        os << items[i] << ' ';
    }

    return os;
}

При вызовах функции шаблона sortArray вот так

sortArray(b, 5);

параметр типа шаблона выводится на тип int *. Таким образом, это объявление

T t;

эквивалентно

int *t;

, что не имеет смысла.

Также внутри функции, которую вы используете маги c число 5.

Вот демонстрационная программа, которая показывает, как могут быть определены функции.

#include <iostream>
#include <utility>

template <class T> 
void sortArray( T *items, size_t n )
{
    for ( size_t last; !( n < 2 ) ; n = last ) 
    {
        for ( size_t i = last = 1; i < n; i++ ) 
        {
            if ( items[i] < items[i-1] )
            {
                std::swap( items[i-1], items[i] );
                last = i;
            }
        }
    }
}

template <class T> 
std::ostream & printArray( const T *items, size_t n, std::ostream &os = std::cout ) 
{
    for ( size_t i = 0; i < n; i++ ) 
    {
        os << items[i] << ' ';
    }

    return os;
}

int main() 
{
    int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    const size_t N = sizeof( a ) / sizeof( *a );

    printArray( a, N ) << '\n';

    sortArray( a, N );  

    printArray( a, N ) << '\n';

    return 0;
}

Вывод программы:

9 8 7 6 5 4 3 2 1 0 
0 1 2 3 4 5 6 7 8 9 
...