πρόβλημα περάσματος δομής σα παράμετρο

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
katerinaaa
Δημοσιεύσεις: 109
Εγγραφή: 28 Ιαν 2010 12:46

πρόβλημα περάσματος δομής σα παράμετρο

Δημοσίευση από katerinaaa » 14 Νοέμ 2011 19:13

Καλησπέρα, θέλω να φτιάξω μια συνάρτηση που θα εκτυπώνει μενού αλλά κάτι κάνω λάθος με τις δομές και δε μου τρέχει.

Κώδικας: Επιλογή όλων

#include <stdio.h>

typedef void &#40;*Ptr_To_Function&#41;&#40;void&#41;;

struct Menu_Record
&#123;
    unsigned int option_number;
    const char * text;
    Ptr_To_Function process_function;
&#125;;

void Enter_Data&#40;&#41;&#123;
     printf&#40;"a"&#41;;
&#125;

void Control_Variables&#40;&#41;&#123;
      printf&#40;"b"&#41;;
&#125;


struct Menu_Record main_menu&#91;&#93; =
&#123;
    &#123;1, "abc", Enter_Data&#125;,
    &#123;2, "def",Control_Variables&#125;,
    &#123;3, "Exit", NULL&#125;
&#125;;

const unsigned int NUM_MAIN_OPTIONS = sizeof &#40;main_menu&#41; / sizeof&#40;main_menu&#91;0&#93;&#41;;


int select&#40;struct Menu_Record&#41;;

int main&#40;void&#41;
&#123;
   int choice = select&#40;main_menu&#41;;
    
system&#40;"pause"&#41;;    
return 0;
&#125;


int select&#40;struct Menu_Record main_menu&#41;
&#123;
         
    unsigned int i;
    int selection=0;

    for &#40;i = 0; i < NUM_MAIN_OPTIONS; ++i&#41;
    &#123;
         printf&#40;"\t%d %s\n",
         main_menu&#91;i&#93;.option_number,
         main_menu&#91;i&#93;.text&#41;;
    &#125;
   
    while &#40;selection != 1 && selection != 2 && selection !=3&#41;
    &#123;
          printf&#40;"choice&#58;"&#41;; 
          scanf&#40;"%d",&selection&#41;;
    
          for &#40;i = 0; i < NUM_MAIN_OPTIONS; ++i&#41;
          &#123;
              if &#40;selection == main_menu&#91;i&#93;.option_number&#41;
              &#123; 
                 if &#40;main_menu&#91;i&#93;.process_function&#41;
                      main_menu&#91;i&#93;.process_function&#40;&#41;;
                 break;
              &#125;
           &#125;
    &#125;   
    return selection;  
         
&#125;
Επίσης θα ήθελα εντός του while να μη το γράφω χειροκίνητα !=1 !=2 αλλά να βλέπει από τον πίνακα ποιες είναι οι αποδεκτές τιμές.

Και κάτι τελευταίο γιατί σας ζάλισα, όταν πατάω γράμμα αντί για αριθμό η κονσόλα κρασάρει, υπάρχει τρόπος να το αποφύγω αυτό κάπως με την isdigit ?

ευχαριστώ

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

πρόβλημα περάσματος δομής σα παράμετρο

Δημοσίευση από gvre » 14 Νοέμ 2011 21:02

Ξεκίνα με το παρακάτω και κάνε ό,τι αλλαγές χρειάζεσαι.

ps. Ο κώδικας που έστειλες δεν έκανε compile. Καλό είναι να ενεργοποιήσεις τα warnings "-Wall" και "-Wextra" στον compiler που χρησιμοποιείς. Περισσότερα μπορείς να διαβάσεις εδώ.

Κώδικας: Επιλογή όλων

#include <stdio.h>

typedef void&#40;*func&#41;&#40;void&#41;;
void callback1&#40;void&#41;;
void callback2&#40;void&#41;;

struct menu_record
&#123;
	size_t option;
	const char *text;
	func callback;
&#125;;

struct menu_record menu&#91;&#93; = 
&#123;
	&#123; 1, "callback1", callback1 &#125;,	
	&#123; 2, "callback2", callback2 &#125;,	
	&#123; 3, "exit", NULL &#125;
&#125;;

void callback1&#40;void&#41;
&#123;
	printf&#40;"callback1 call\n"&#41;;
&#125;

void callback2&#40;void&#41;
&#123;
	printf&#40;"callback2 call\n"&#41;;
&#125;

int main&#40;void&#41;
&#123;
	size_t main_options_total = sizeof&#40;menu&#41; / sizeof&#40;menu&#91;0&#93;&#41;;
	size_t i, choice;

	for &#40;i = 0; i < main_options_total; ++i&#41;
		printf&#40;"%d %s\n", menu&#91;i&#93;.option, menu&#91;i&#93;.text&#41;;

	do
	&#123;
		printf&#40;"choice&#58; "&#41;;
		fflush&#40;stdout&#41;;
		scanf&#40;"%zu", &choice&#41;;
		getchar&#40;&#41;;
	&#125; while &#40;choice < 1 || choice > main_options_total&#41;;

	if &#40;menu&#91;choice-1&#93;.callback != NULL&#41;
		menu&#91;choice-1&#93;.callback&#40;&#41;;
		
	getchar&#40;&#41;;
	return 0;
&#125;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

πρόβλημα περάσματος δομής σα παράμετρο

Δημοσίευση από dva_dev » 14 Νοέμ 2011 21:41

Δοκίμασε τη function

Κώδικας: Επιλογή όλων

int select&#40;struct Menu_Record&#41;;
int select&#40;struct Menu_Record main_menu&#41;
&#123;
...
να την αλλάξεις σε

Κώδικας: Επιλογή όλων

int select&#40;struct Menu_Record*&#41;;
int select&#40;struct Menu_Record* main_menu&#41;
&#123;
...
Για τα υπόλοιπα, εγώ θα το έκανα κάπως έτσι:

Κώδικας: Επιλογή όλων

#include <stdio.h>

typedef void &#40;*Ptr_To_Function&#41;&#40;void&#41;;

struct Menu_Record
&#123;
    unsigned int option_number;
    const char * text;
    Ptr_To_Function process_function;
&#125;;

void Enter_Data&#40;&#41;&#123;
     printf&#40;"a"&#41;;
&#125;

void Control_Variables&#40;&#41;&#123;
      printf&#40;"b"&#41;;
&#125;


struct Menu_Record main_menu&#91;&#93; =
&#123;
    &#123;1, "abc", Enter_Data&#125;,
    &#123;2, "def",Control_Variables&#125;,
    &#123;3, "Exit", NULL&#125;
&#125;;

const unsigned int NUM_MAIN_OPTIONS = sizeof &#40;main_menu&#41; / sizeof&#40;main_menu&#91;0&#93;&#41;;


struct Menu_Record* select&#40;struct Menu_Record* main_menu&#41;;

int main&#40;void&#41;
&#123;
    struct Menu_Record* pEntry = select&#40;main_menu&#41;;
    if &#40;pEntry->process_function&#41;
        pEntry->process_function&#40;&#41;;
    return 0;
&#125;


struct Menu_Record* select&#40;struct Menu_Record* main_menu&#41;
&#123;

    unsigned int i;
    int selection=0;
    struct Menu_Record* pEntry=NULL;

    for &#40;i = 0; i < NUM_MAIN_OPTIONS; ++i&#41;
    &#123;
         printf&#40;"\t%d %s\n",
         main_menu&#91;i&#93;.option_number,
         main_menu&#91;i&#93;.text&#41;;
    &#125;

    while &#40;pEntry == NULL&#41;
    &#123;
          printf&#40;"choice&#58;"&#41;;
          scanf&#40;"%δ",&selection&#41;; getchar&#40;&#41;;

          for &#40;i = 0; i < NUM_MAIN_OPTIONS; ++i&#41;
          &#123;
              if &#40;selection == main_menu&#91;i&#93;.option_number&#41;
              &#123;
                  pEntry=&main_menu&#91;i&#93;;
                  break;
              &#125;
           &#125;
    &#125;
    return pEntry;
&#125;

katerinaaa
Δημοσιεύσεις: 109
Εγγραφή: 28 Ιαν 2010 12:46

πρόβλημα περάσματος δομής σα παράμετρο

Δημοσίευση από katerinaaa » 15 Νοέμ 2011 00:35

Σας ευχαριστώ πολύ για τις απαντήσεις σας
Δούλεψε μια χαρά!

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες