1 Востаннє редагувалося Дмитро-Чебурашка (21.05.2015 10:52:10)

Тема: Як оголосити і як використати функцію та взагалі

Доброго дня! Я щось наплутав. Відбувається помилка
    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\rozbir\shablony\shablony\shablony\shablony.cpp    114    1    Shablony
Це в рядку
A = Printer (ArrayOfZeros, Psize );


#include <iostream> 

#include <stdlib.h> 

#include <conio.h>

template<class T, class T1> class array 

{ 
public: 
   array(int size); 
   T1 sum(void); 
   T average_value(void); 
   void show_array(void); 
   int add_value(T); 
private: 
   T *data; 
   int size; 
   int index; 
}; 

//Далі, перед кожною функцією класу ви повинні вказати такий же запис зі словом 
//template. Крім того, відразу ж після імені класу ви повинні вказати типи класу 

template<class T, class T1> array<T, T1>::array(int size) 

{ 
   data = new T[size]; 
   if (data == NULL) 

   { 
      std::cerr << "Недостатньо пам'яті - програма завершується" << std::endl; 
      exit(1); 
   } 

   array::size = size; 
   array::index = 0; 
} 

template<class T, class T1> T1 array<T, T1>::sum(void) 

{ 
   T1 sum = 0; 
   for (int i = 0; i < index; i++) sum += data[i]; 
   return(sum); 
} 
// //визначення функції average _ value для цього класу:
template<class T, class T1> T array<T, T1>::average_value(void)  

{ 
   T1 sum =0; 
   for (int i = 0; i < index; i++) sum += data[i]; 
   return (sum / index); 
} 

template<class T, class T1> void array<T, T1>::show_array(void) 

{ 
   for (int i = 0; i < index; i++) std::cout << data[i] << ' '; 
   std::cout << std::endl; 
} 

template<class T, class T1> int array<T, T1>::add_value(T value) 

{ 
   if (index == size) 
   return(-1); // Масив повний 
 
   else 

   { 
      data[index] = value; 
      index++; 
      return(0); // Успішно 
   } 

}



int *Psize;

template< class T >
  T* CreateArray( T(*GetValue)(), const int size )
  {
    Psize = &size;
    T *Array = new T[ size ];
    for( int i = 0; i < size; i++ )
      Array[i] = GetValue();
    return Array;
  }
 
  int GetZero() { return 0; }
  char InputChar()
  {
    char c;
    std::cin >> c;
    return c;
  }
 
    
  template< class T >
  bool Printer(T*PrintValue, int *Psize )
  {
    for (int i=0, i<*Psize, i++)
    {
            std::cout << "Распечатаємо значенння ." << *(PrintValue+i) << std::endl;
    }     
    return true;
  }
  
  bool A,S;
  int *ArrayOfZeros = CreateArray( GetZero, 20 );
  A =  Printer(ArrayOfZeros, Psize );
  char *String = CreateArray( InputChar, 40 );
  S =  Printer(String, Psize );
  
  void main(void) 

{ 
   // Масив зі 100 елементів 
   array<int, long> numbers(100);
   // Масив з 200 элементів 
   array<float, float> values(200); 
   int i; 
   for (i = 0; i < 50; i++) numbers.add_value(i); 
   numbers.show_array(); 
   std::cout << "Сума чисел рівна " << numbers.sum () << std::endl; 
   std::cout << "Середнє значення рівне  " << numbers.average_value() << std::endl; 
   for (i = 0; i < 100; i++) values.add_value(i * 100); 
   values.show_array(); 
   std::cout << "Сума чисел рівна." << values.sum() << std::endl; 
   std::cout << "Середнє значення рівне  " << values.average_value() << std::endl; 
_getch();
  } 

2

Re: Як оголосити і як використати функцію та взагалі

Що повертає? (який тип) функція

Printer()

Re: Як оголосити і як використати функцію та взагалі

Кажись bool

Re: Як оголосити і як використати функцію та взагалі

return true; Хіба не так?

5

Re: Як оголосити і як використати функцію та взагалі

A = (bool)Printer (ArrayOfZeros, Psize );

Що це буде робити?

Re: Як оголосити і як використати функцію та взагалі

Я сам точно не знаю, подивимось...

Re: Як оголосити і як використати функцію та взагалі

Ось буде цікаво коли запрацює !!

8

Re: Як оголосити і як використати функцію та взагалі

Я щось із відступами не можу розібратися. В якій функції виконується оцей ваш рядок

 A =  Printer(ArrayOfZeros, Psize );

?

Re: Як оголосити і як використати функцію та взагалі

Це виклик функції Printer

Вона цілком 

template< class T >
  bool Printer(T*PrintValue, int *Psize )
  {
    for (int i=0, i<*Psize, i++)
    {
            std::cout << "Распечатаємо значенння ." << *(PrintValue+i) << std::endl;
    }     
    return true;
  }

10

Re: Як оголосити і як використати функцію та взагалі

Я розумію, що це виклик. Я питав, в чому знаходиться оператор =. Наприклад, i++ у вас знаходиться в for, а for - в template<...>bool Printer(...). А в чому знаходиться оператор A = ...? В якій функції?

Подякували: Дмитро-Чебурашка1

11

Re: Як оголосити і як використати функцію та взагалі

Не зовсім щодо питання, але: якщо ви використовуєте динамічну пам'ять, то її треба звільняти, тому якщо пишете повноцінний клас, то варто написати деструктор. Наприклад:

template<class T, class T1> class array 
{ 
    //...
    ~array();
    //...
};
//...
template<class T, class T1> array<T, T1>::~array()
{
    delete[] data;
} 

А щодо питання, то koala вам повністю відповів. Крім того, навіть якщо б цей код компілювався, то в ньому не було б сенсу, оскільки ви передаєте в Printer неініціалізований вказівник Psize.

Подякували: Дмитро-Чебурашка1