powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / запутался на указателе на функцию
9 сообщений из 9, страница 1 из 1
запутался на указателе на функцию
    #34419781
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!
Всем программистам привет! Respect! Вот только начал изучать С++ ( где то около 3 недель ) и начинают появляться первые проблемки, запутался на указателе на функцию.
Делал на подобие как описано в учебном пособии, но вываливается постоянно ошибки следующего плана :

Вот мои тестовые исходники, три файла : собственно описание класса, реализация класса и прога с main() :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
------ Build started: Project: Array, Configuration: Debug Win32 ------
Compiling...
Array.cpp
d:\visual_c++\ 1 \array\array\array.cpp( 77 ) : warning C4244: 'initializing' : conversion from 'double' to 'size_t', possible loss of data
d:\visual_c++\ 1 \array\array\array.cpp( 130 ) : error C3867: 'Array::ascending': function call missing argument list; use '&Array::ascending' to create a pointer to member
d:\visual_c++\ 1 \array\array\array.cpp( 135 ) : error C3867: 'Array::descending': function call missing argument list; use '&Array::descending' to create a pointer to member
Build log was saved at "file://d:\VISUAL_C++\1\array\Array\Debug\BuildLog.htm"
Array -  2  error(s),  1  warning(s)
========== Build:  0  succeeded,  1  failed,  0  up-to-date,  0  skipped ==========

насколько я понимаю первый варнинг не критичен, а вот с error C3867 никак не могу разрулиться.

Код: plaintext
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.
#ifndef ARRAY_H
#define ARRAY_H

#include "stdafx.h"

class Array 
{
public :
	Array() ;								// кон - ор : указываем количество элементов в динамическом массиве
	void inputElements() ;					// забиваем значениями элементы
	void getMaximumElement() ;				// ищем максимальный элемент ( значение и индекс )
	void getMinimumElement() ;				// ищем минимальный элемент ( значение и индекс )
	void getSumElements() ;					// сумма всех элементов
	int getRepeatElements(double, double) ; 
	void totalNumberRepeatElements( const double *, int, double ) ;// ищем все вхождения элементов равные min/max
	void select() ;							// выбираем тип сортировки массива asc/desc
	void selectionSort( double [], const int, bool( * )( double, double ) ) ; // передаем указатель на asc/desc
	void swap( double * const, double * const ) ; //для обмена
	bool ascending( double, double ) ;		// сортирвока по возрастанию
	bool descending( double, double ) ;		// -//-//-    по убыванию
	~Array() ;								// освобождаем память для динамического массива
private :
	int sizeArray ;
	double *Arr ;
} ;

#endif

Код: plaintext
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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
#include "stdafx.h"
#include "Array.h"

#include <iostream>
using std :: cout ;
using std :: cin ;
using std :: endl ;

#include <iomanip>
using std :: setw ;
//===============================================================
Array :: Array()
{
	cout << "Quit from programm is : -100 " << endl ;
	cout << "Enter number elements of double array : " ;
	cin >> sizeArray ;
//	if ( sizeArray == -100 )
//		exit	;
	while ( sizeArray ==  0  || sizeArray <  0  )
	{
		cout << "Number of elements not be null or minus! Enter correctly! " << endl ;
		cout << "\nEnter number elements of double array : " ;
		cin >> sizeArray ;
	}
	Arr = new double [ sizeArray ] ;
}
//===============================================================
void Array :: inputElements()
{
	for ( int i =  0 ; i < sizeArray; i++ )
	{
		cout << "Enter " << i << " element of double array : " 
			<< endl << " Arr[ " << i +  1  << " ] = " ;
		cin >> Arr[ i ] ;
		cout << endl ;
	}
}
//===============================================================
void Array :: getMinimumElement()
{
	register double minElement ;
	register double minValue =  0  ;

	minElement = Arr[  0  ] ;
	for ( int next =  0 ; next < sizeArray; next++ )
	{
		switch ( getRepeatElements( Arr[next], minElement ) )
		{
		case  0  :
			minElement = Arr[ next ] ;
			minValue = next ;
		default :
			;
		}
	}
	if ( sizeArray >  1  )
		 totalNumberRepeatElements(Arr, sizeArray, minElement ) ;
}
//===============================================================
int Array :: getRepeatElements( double x, double y)
{
	if ( x < y )
		return  0  ;
	return  1  ;
}
//===============================================================
void Array :: totalNumberRepeatElements(const double* array, int size, double value )
{
	double *repeatArr ;
	register double totalRepeat =  0  ;
	for ( int i =  0 ; i < size; i++ )
	{
		if ( array[ i ] == value )
			totalRepeat++ ;
	}

	repeatArr = new double [ totalRepeat ] ;
	int counter =  0  ;
	for ( int i =  0 ; i < size; i++ )
	{
		if ( array[ i ] == value )
		{
			repeatArr[counter] = i +  1  ;
			counter++ ;
		}
	}

	if ( counter >  1  )
	{
		cout << "The minimum value elements of array repeat in : " << endl ;
		cout << " Arr[ " ;
		for ( int i =  0 ; i < counter; i++ )
			cout << repeatArr[ i ] << ( i < counter -  1  ? ", " : "" ) ;
		cout << " ] " << " = " << value ;
	}
	else
		cout << "The minimum element of double array is : " << endl
		<< "Arr[ " << repeatArr[  0  ] << " ] = " << value << endl ;
}
//===============================================================
void Array :: getSumElements()
{
	register double totalSum =  0  ;
	for 
		( int i =  0 ; i < sizeArray; i++ )
		totalSum += Arr[ i ] ;
	cout << "\n\nTotal sum elements of double array is : "
		<< totalSum << endl ;
}
//===============================================================
int _tmain(int argc, _TCHAR* argv[])
{
	return  0 ;
}
//===============================================================
void Array :: select()
{
	cout <<"\n\nArray before sorting : \n" ;
	for ( int counter =  0 ; counter < sizeArray; counter++ )
		cout << Arr[ counter ] << setw( 7 ) << " " ;

	register int orderSort ;
	cout << "\nEnter 1 to sort in ascending order, \n"
		<< "Enter 2 to sort in descending order : " ;
	cin >> orderSort ;
	if ( orderSort !=  1  || orderSort !=  2  )
		orderSort =  1  ;
	if ( orderSort ==  1  )
	{
		selectionSort( Arr, sizeArray, ascending ) ;
		cout <<"\nData items in ascending order : \n" ;
	}
	else
	{
		selectionSort( Arr, sizeArray, descending ) ;
		cout <<"\nData items in descending order : \n" ;
	}	

	for ( int counter =  0 ; counter < sizeArray; counter++ )
		cout << Arr[ counter ] << setw( 7 ) << " " ;

}
//===============================================================
void Array :: selectionSort(double work[], const int size, bool (*compare)(double, double))
{
	int smallestOrLargest ;
	for ( int i =  0 ; i < size -  1 ; i++ )
	{
		smallestOrLargest = i ;
		for ( int index = i +  1 ; index < size; index++ )
			if ( (*compare)(work[ index ], work[ smallestOrLargest ] ) )
				smallestOrLargest = index ;
		swap( &work[ i ], &work[ smallestOrLargest ] ) ;
	}
}
//===============================================================
void swap( double * const element1Ptr, double * const element2Ptr )
{
	double hold = *element1Ptr ;
	*element1Ptr = *element2Ptr ;
	*element2Ptr = hold ;
}
//===============================================================
bool Array :: ascending( double a, double b )
{
	return a < b ;
}
//===============================================================
bool Array :: descending( double a, double b )
{
	return a > b ;
}
//===============================================================
Array :: ~Array()
{
	delete [ ]Arr ;
}

в общем ошибка указывает на вызов элемент функции selectionSort() из элемент функции select()
в двух местах. Целый день сёдня писал и запутался окончательно, как понимаю дело в передаче
параметров, но что именно хочет компилятор не понимаю . Подскажите как быть то .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include "stdafx.h"
#include "Array.h"

int main()
{
	Array arrayOfElement ;
	arrayOfElement.inputElements() ;
	arrayOfElement.getMinimumElement() ;
	arrayOfElement.getSumElements() ;
	arrayOfElement.select() ;
return  0  ;
...
Рейтинг: 0 / 0
запутался на указателе на функцию
    #34419903
C++_forumAnswer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Problema v tom chto

bool( * )( double, double ) ukazatelj ne na funkciju chlen. To estj zdesj objavljaetsja ukazatelj na funkciju ne javljajushajusja chlenom kakogo libo klasa.

A pri vizove funkciji selection sort proizvoditsja popitka peredatj ej uakazatelj na funkciju chlen klasa.
Eto zapresheno.

Samij prostoj sposob izbavitsja ot problemi vinesti objavlenija i opredelenija funkciji ascending i descending iz tela klasa Array.
...
Рейтинг: 0 / 0
запутался на указателе на функцию
    #34420317
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FasterHarder
в общем ошибка указывает на вызов элемент функции selectionSort() из элемент функции select()
в двух местах. Целый день сёдня писал и запутался окончательно, как понимаю дело в передаче
параметров, но что именно хочет компилятор не понимаю . Подскажите как быть то .


Тебе же компилятор написал:


Код: plaintext
selectionSort( Arr, sizeArray,  &Array::ascending) ;
...
Рейтинг: 0 / 0
запутался на указателе на функцию
    #34420762
C++_forumAnswer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh FasterHarder
в общем ошибка указывает на вызов элемент функции selectionSort() из элемент функции select()
в двух местах. Целый день сёдня писал и запутался окончательно, как понимаю дело в передаче
параметров, но что именно хочет компилятор не понимаю . Подскажите как быть то .


Тебе же компилятор написал:


Код: plaintext
selectionSort( Arr, sizeArray,  &Array::ascending) ;






Dumaju chto eto ne budet rabotatj potomu chto funkciju prinimaet ukazatelj ne na funkciju chlen. Sm. vishe.
...
Рейтинг: 0 / 0
запутался на указателе на функцию
    #34421026
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++_forumAnswer Akh FasterHarder
в общем ошибка указывает на вызов элемент функции selectionSort() из элемент функции select()
в двух местах. Целый день сёдня писал и запутался окончательно, как понимаю дело в передаче
параметров, но что именно хочет компилятор не понимаю . Подскажите как быть то .


Тебе же компилятор написал:


Код: plaintext
selectionSort( Arr, sizeArray,  &Array::ascending) ;






Dumaju chto eto ne budet rabotatj potomu chto funkciju prinimaet ukazatelj ne na funkciju chlen. Sm. vishe.

Ну да. Зато будет так:
Код: plaintext
1.
	void selectionSort( double [], const int, bool(Array::* )( double, double ) ) ; // передаем указатель на asc/desc

и соответсвенно, вызов через this.
...
Рейтинг: 0 / 0
запутался на указателе на функцию
    #34421041
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай ascending и descending статическими методами и все выйдет
C++
...
Рейтинг: 0 / 0
запутался на указателе на функцию
    #34422106
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!
попробывал сделать их статическими функциями, т е практически добавил только 2 слова static

Код: plaintext
1.
static bool ascending( double, double ) ;		// сортирвока по возрастанию
static bool descending( double, double ) ;		// //-    по убыванию
полезли более глубокие ошибки, которые мне понять пока не дано :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
------ Build started: Project: Array, Configuration: Debug Win32 ------
Linking...
LINK : warning LNK4067: ambiguous entry point; selected 'mainCRTStartup'
Array.obj : error LNK2019: unresolved external symbol "public: void __thiscall Array::swap(double * const,double * const)" (?swap@Array@@QAEXQAN0@Z) referenced in function "public: void __thiscall Array::selectionSort(double * const,int,bool (__cdecl*)(double,double))" (?selectionSort@Array@@QAEXQANHP6A_NNN@Z@Z)
D:\VISUAL_C++\ 1 \array\Debug\Array.exe : fatal error LNK1120:  1  unresolved externals
Build log was saved at "file://d:\VISUAL_C++\1\array\Array\Debug\BuildLog.htm"
Array -  2  error(s),  1  warning(s)
========== Build:  0  succeeded,  1  failed,  0  up-to-date,  0  skipped ==========
с английским у меня все в поряде, но имхо в данном случае пользы не много.
...
Рейтинг: 0 / 0
запутался на указателе на функцию
    #34422208
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Походу у тебя две функции main()
2.
Код: plaintext
1.
2.
//===============================================================
void swap( double * const element1Ptr, double * const element2Ptr )

Код: plaintext
1.
2.
//===============================================================
void Array::swap( double * const element1Ptr, double * const element2Ptr )
...
Рейтинг: 0 / 0
запутался на указателе на функцию
    #34422341
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!
Вы просто гений Akh:--))). Я забыл у элемент функции swap класса Array при описании реализации поставить спецификатор области класса Array :: . Теперь все зафурычило. Олично. Благодарен безмерно всем кто давал советы. Respect!
Код: plaintext
1.
void Array :: swap( double * const element1Ptr, double * const element2Ptr )
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / запутался на указателе на функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]