Передать функцию с несколькими параметрами в качестве аргумента - PullRequest
0 голосов
/ 28 мая 2019

Я хотел бы вызвать функцию с несколькими параметрами в качестве аргумента другой функции.Присвоение просит передать подсчитанное значение (которое точно так же является тем же значением, которое возвращается из функции типа integer read_Events) в качестве аргумента другой функции.Хотя я мог просто вызвать функцию, сохранить ее и передать, я подумал, что было бы немного чище передать всю функцию в качестве аргумента.

Это для проекта для предыдущего класса, который я пересматриваюв учебных целях.До сих пор я пытался сохранить адрес функции 2 в указателе и передать указатель, хранящий адрес функции 2, в качестве аргумента функции 1. Я также пытался передать всю функцию 2 в качестве аргумента функции 1.

#include<iostream>
#include<conio.h>
#include<string>
using namespace std;
struct Date {
    int month;
    int day;
    int year;
};
struct Time {
     int hour;
     int minute;
};
struct Event {
    char desc[80];
    Date date;
    Time time;
};

int read_Events(Event* Eptr[50], int MAX);
void display(Event* Eptr[50],int(*read_events)(Event , int )) //1. can i 
do this?;
int main() {
    Event* Eptr[50];
     int *Fptr = &read_Events;//#2 Is this possible? (function address 
to pass as arugement in display function)

    _getch();
    return 0;
}

int read_Events(Event* Eptr[50], int MAX) {
    bool repeat = true;
    char ans;
    char slash;
    char colon;
    int i = 0;

    while (repeat && i < MAX) {
        cout << "\nWould you like to add a new event [y/n]? ";
        cin >> ans;

        if (ans == 'Y' || 'y') {
            Eptr[i] = new Event;
            repeat = true;

            cout << "\nEnter description: ";
            cin.clear();
            cin.ignore(256, '\n');
            cin.getline(Eptr[i]->desc, sizeof(Eptr[i]->desc));

            cout << "\nEnter Date(MM/DD/YYYY): ";
            cin >> Eptr[i]->date.month >> slash >> Eptr[i]->date.day >> 
slash >> Eptr[i]->date.year;

            cout << "\nEnter time(HH:MM): ";
            cin >> Eptr[i]->time.hour >> colon >> Eptr[i]->time.minute;
        }
        else {
            repeat = false;
            return i;
        }
            i++;
        }
        return i; //returning number of events
}

It seems as if what I have done so far is not syntactically correct.

1 Ответ

0 голосов
/ 28 мая 2019
void display(Event* Eptr[50],int(*read_events)(Event , int )) //1. can i  do this?;

Да, вы можете.Убедитесь, что объявление завершено правильно.

void display(Event* Eptr[50],int(*read_events)(Event , int ));
int *Fptr = &read_Events;//#2 Is this possible? 

Это не правильно.&read_Events вычисляет указатель на функцию.Вам нужно

int(*Fptr)(Event , int ) = &read_Events;

Вы также можете использовать более простую версию.

int(*Fptr)(Event , int ) = read_Events;

Вы также можете использовать способность компилятора выводить типы и использовать

auto Fptr = &read_Events;

Имеясказал, что мне не ясно, как вы собираетесь использовать указатель fuction.В указанном вами коде нет звонка на display().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...