voulaji Δημοσ. 4 Μαρτίου 2008 Μέλος Δημοσ. 4 Μαρτίου 2008 Ίσως εγώ δεν έχω καταλάβει σωστά. Πάμε πάλι. 1) Για να κάνω έλεγχο λαθών πρέπει να φτιάξω μια άλλη συνάρτηση; ή όχι; Εννοώ πως κάτι τέτοιο είναι απαραίτητο να γίνει ή υπάρχει και άλλος τρόπος ελέγχου; 2) Εάν βάλω όπως μου προτείνεις την συνάρτησή σου, θα μου εμφανίσει τις τιμές της "f" που θέλω; (σσ δεν το δοκίμασα)
bokarinho Δημοσ. 4 Μαρτίου 2008 Δημοσ. 4 Μαρτίου 2008 Ίσως εγώ δεν έχω καταλάβει σωστά. Πάμε πάλι.1) Για να κάνω έλεγχο λαθών πρέπει να φτιάξω μια άλλη συνάρτηση; ή όχι; Εννοώ πως κάτι τέτοιο είναι απαραίτητο να γίνει ή υπάρχει και άλλος τρόπος ελέγχου; 2) Εάν βάλω όπως μου προτείνεις την συνάρτησή σου, θα μου εμφανίσει τις τιμές της "f" που θέλω; (σσ δεν το δοκίμασα) Οπα κάτσε γιατί εδώ έχουμε θέμα. Αρχικά γιατί νομίζω ότι δεν έχεις καταλάβει τι ζητάς ή δεν έχεις καταλάβει τι θέλεις να κάνεις και το πας λάθος. Η συνάρτηση που έχεις θέλεις να επιστρέφει το 'f' και για πιο λόγο; Έχω την εντύπωση ότι θέλεις να φτιάξεις μία συνάρτηση που να δέχεται ένα όνομα δηλαδή ένα δείκτη σε ένα αλφαριθμητικό και εφόσον αυτό το όνομα περάσει από κόσκινο για έλεγχο ορθότητας να σου επιστρέφει αν έχει βρεθεί λάθος το είδος του λάθους πχ: βρήκε αριθμό μέσα στο όνομα(το οποίο παριστάνει πάντα γυναίκα) ή κάτι άλλο για να δείξει ότι όλα είναι καλά και όντως πέρασε τον έλεγχο οπότε να επιστραφεί κάτι πχ το 0 για να δείξει ότι όντως έγιναν καλά τα πράγματα. Το να επιστρέφεις 'f' δεν το θεωρώ σωστό γιατί δεν έχει νόημα. Βάζεις μία δομή μέσα στην συνάρτηση σου την γεμίζεις και την κάνεις τι; Δεν επιστρέφεις κάτι από την δομή. Τελικά τι θέλεις να κάνεις πέρα από αυτά με τις συνοριακές τιμές και βλακείες; Ποιο είναι το γενικότερο concept του προγράμματος σου; 1. Μπορείς να κάνεις ότι θέλεις. Μπορείς να τα κάνεις όλα σε μία συνάρτηση ή να φτίαξεις άλλες 5 βοηθητικές πχ για να κάνεις επιμέρους δουλειές της μίας συνάρτησης και να τις καλείς μέσα στην μία συνάρτηση. Για να καταλάβεις αντί να γράψεις μέσα σε μία συνάρτηση 200 γραμμές κώδικα, γράφεις πχ 5 που να κάνουν επιμέρους πράγματα που θα τα έκανες στην μία και μετά τις πασάρεις μέσα στην μία και την κάνεις με 40 γραμμές κώδικα να φαίνεται κομψάτη. Δες το παράδειγμα μου πως έχω πετάξει στην συνάρτηση σου την δική μου που κάνει το error_checking. 2.Τι είναι αυτές οι τιμές της 'f' που λες; Ζητάς να κοιτάζεις μου λες πριν το όνομα αν είναι σωστό και αν δεν είναι να επιστρέφονται κάποιες τιμές, αν είναι τι σόνι και καλά να επιστρέφεις το 'f';
bokarinho Δημοσ. 4 Μαρτίου 2008 Δημοσ. 4 Μαρτίου 2008 Πάντως για να επιτρέψεις στο να εγγραφεί μία φοιτήτρια δεν χρειάζεσαι τίποτα από αυτά που βάζεις στο πρώτο σου post παρά μόνο την συνάρτηση μου και να ελέγχεις αν η τιμή που επιστρέφει είναι το OK(δηλαδή το 0 όπως το έχω ορίσει). Ούτε δομή χρειάζεται ούτε τίποτα. Τώρα γράφεις: > int enrollFemale(char *femaleName){ if (femaleName == NULL) return(-1); struct student s; s.gender = 'f'; //only females allowed. strncpy( s.name, femaleName, strlen(femaleName)); return(s.gender); } και επιστρέφεις ένα 'f' στην ουσία αν όντως από το error_checking που ζητάς και έχει περάσει το όνομα είναι καλό. Το πως θα ελέγχεις για λάθη έχει ντάλε κουάλε την συνάρτηση μου που κάνει την δουλειά και τελειώνεις. Μετά λες struct student s, κάνεις κάτι αναθέσεις στα μέλη της δομής και στο τέλος επιστρέφεις το s.gender που είναι γράμμα και όχι αριθμός(καλεις την συνάρτηση με int = επιστρέφω ακέραιο). Τέλος πάντων, αυτό το struct student s και ότι άλλο κάνεις με το s είναι καταδικασμένο να πεθάνει μετά το πέρας της συνάρτησης. Δηλαδή είναι τελείως άχρηστο αν δεν το επιστρέφεις με κάποιο τρόπο. Με λίγα λόγια και αυτό να έκανες: > int enrollFemale(char *femaleName){ if (femaleName == NULL) return(-1); char gender = 'f'; return gender; θα έκανε ακριβώς το ίδιο με το δικό σου. Δεν ξέρω αν με καταλαβαίνεις αλλά η δομη που δεν επιστρέφεις είναι χρήσιμη και ορατή μόνο στην συνάρτηση στο συγκεκριμένο παράδειγμα. Δεν χρησιμεύει πουθενά. Οπότε μάλλον αν αυτό που θέλεις να φτιάξεις είναι μία συνάρτηση που θέλεις να επιτρέπει να εγγραφούν κάποιες φοιτήτριες δεν μπλέκεις με δομές παρά μόνο βάζεις την συνάρτηση μου σε λειτουργία και λες οτι ναι αυτή μπορεί να εγγραφεί. Αν η πρόθεση σου όμως ειναι να γράψεις και την φοιτήτρια κάπου τότε αλλάζουν τα πράγματα γιατί θα πρέπει να κάνεις άλλα. Τα είπα και ησύχασα....
voulaji Δημοσ. 4 Μαρτίου 2008 Μέλος Δημοσ. 4 Μαρτίου 2008 Καταρχήν έχεις καταπληκτικές γνώσεις και μπράβο σου. Τώρα, σε ότι αφορά το δικό μου πρόβλημα, τα πράγματα είναι πολύ πιο απλά και ίσως ευθύνομαι εγώ που δεν ξεκαθαρίστηκε το θέμα από την αρχή. Πίστευα όμως ότι ο τίτλος του θέματος ήταν ξεκάθαρος. Λοιπόν, η συνάρτηση enrollFemale είναι στα δεδομένα του θέματος και σκοπός της είναι να επιτρέπει την εγγραφή μόνο φοιτητριών σε ένα πανεπιστήμιο. Αυτό που ψάχνω είναι: 1. Να γίνει έλεγχος σφαλμάτων της με την προσέγγιση συνοριακών τιμών 2. Για όσες περιπτώσεις η συνάρτηση δεν περνάει τον έλεγχο, θέλω τη τιμή που επιστρέφει Ελπίζω τώρα να είμαι πιο ξεκάθαρη....
bokarinho Δημοσ. 4 Μαρτίου 2008 Δημοσ. 4 Μαρτίου 2008 Καταρχήν έχεις καταπληκτικές γνώσεις και μπράβο σου. Τώρα, σε ότι αφορά το δικό μου πρόβλημα, τα πράγματα είναι πολύ πιο απλά και ίσως ευθύνομαι εγώ που δεν ξεκαθαρίστηκε το θέμα από την αρχή. Πίστευα όμως ότι ο τίτλος του θέματος ήταν ξεκάθαρος. Λοιπόν, η συνάρτηση enrollFemale είναι στα δεδομένα του θέματος και σκοπός της είναι να επιτρέπει την εγγραφή μόνο φοιτητριών σε ένα πανεπιστήμιο. Αυτό που ψάχνω είναι: 1. Να γίνει έλεγχος σφαλμάτων της με την προσέγγιση συνοριακών τιμών 2. Για όσες περιπτώσεις η συνάρτηση δεν περνάει τον έλεγχο, θέλω τη τιμή που επιστρέφει Ελπίζω τώρα να είμαι πιο ξεκάθαρη.... Ωραία τώρα το έθεσες σωστά. Αρχικά δεν έχω καταπληκτικές γνώσεις ξέρω πολύ λίγο προγραμματισμό, κατόπιν ορίστε η τελική εκδοχή της συνάρτησης που θέλεις, και του τρόπου που θα την χρησιμοποιήσεις, σε ευχαριστώ πάντως για τα καλά σου λόγια, καλή συνέχεια και ότι θέλεις εδώ είμαστε και εγώ και τα παιδιά του φόρουμ όπως ο DirectX, Georgemarios, Bilco κτλ. > //--------------------------------------------------------------------------- #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> /* Structures. */ /* Parameter Enumeration. */ typedef enum _Errors { OK, NULL_INPUT = -1, INVALID_LEN = -2, WHITESPACE = -3, DIGIT = -4, BAD_SYMBOL = -5, SIMILAR_LETTERS = -6, ALLOWED_LET = 2 }Errors; /* Exit. */ void Exit(const char *Tmsg) { if(Tmsg) { printf("%s\n", Tmsg); getchar(); } } int CheckForInvalidInput(const char *pszInput, int pszLen) { /* Get the len. */ int nLen = !pszLen ? (int)strlen(pszInput) : pszLen; /* Loop Variables. */ int i, j, nLetters = 0; if(!pszInput) { printf("Error NULL Input:%s\n", strerror(errno)); return NULL_INPUT; } if(pszLen < 0 || pszLen > (int)strlen(pszInput)) { printf("Error Invalid Length:%s\n", strerror(errno)); return INVALID_LEN; } /* Check Procedure. */ /* Loop. */ for(i = 0; i < nLen; i++) { /* Check for whitespace. */ if(isspace(pszInput[i])) return WHITESPACE; /* Check for digit. */ if(isdigit(pszInput[i])) return DIGIT; /* Check for non alpha character. */ if(!isalpha(pszInput[i])) return BAD_SYMBOL; /* Check for a predifined number of same letters. */ if(i < nLen-ALLOWED_LET && pszInput[i] == pszInput[i+1]) { j = i+1; while(pszInput[j] != '\0' && pszInput[i] == pszInput[j]) j++; /* How many same letters counted. */ nLetters = j-i; /* Return too many similar letters in the word. */ if(nLetters > ALLOWED_LET) return SIMILAR_LETTERS; /* Rewind j to use again. */ else j = 0; } } /* Return a valid word. */ return OK; } //--------------------------------------------------------------------------- /* This function does all the things, checks for any errors and tells you what error is encountered during the parsing. If any it returns a negative number through the nRetVal variable. If 0 all are OK and the female student can be writen or whatever is need to be done. */ int EnrollFemale(char *femaleName) { /* Get the checking from the previous function. */ int nRetVal = CheckForInvalidInput(femaleName, strlen(femaleName)); switch(nRetVal) { case OK: printf("SUCCESS, you can process the female student.\n"); break; case DIGIT: printf("ERROR, a number is found inside the female name.\n"); break; case WHITESPACE: printf("ERROR, a whitespace character is found inside the female name.\n"); break; case BAD_SYMBOL: printf("ERROR, a non character symbol is found inside the female name.\n"); break; case NULL_INPUT: case INVALID_LEN: break; case SIMILAR_LETTERS: printf("ERROR, the word is consisted of two many similar letters.\n"); break; default: break; } /* Return the value. */ return nRetVal; } /* Main Code. */ int main(int argc, char* argv[]) { int nRetStatus, nRetStatus1, nRetStatus2, nRetStatus3; /* Check a valid name. */ nRetStatus = EnrollFemale("Konstantina"); printf("Return from function: %d\n", nRetStatus); /* Check an invalid name, a number in it. */ printf("\n"); nRetStatus1 = EnrollFemale("Konstant1na"); printf("Return from function: %d\n", nRetStatus1); /* Check an invalid name, too many or all same letters. */ printf("\n"); nRetStatus2 = EnrollFemale("Konnnnnnstantina"); printf("Return from function: %d\n", nRetStatus2); /* Check an invalid name, an invalid symbol is in it. */ printf("\n"); nRetStatus3 = EnrollFemale("Kon!stantina"); printf("Return from function: %d\n", nRetStatus3); /* In any case exit. */ Exit("Hit enter to continue...."); return 0; } //--------------------------------------------------------------------------- Εκτυπωμένα αποτελέσματα: SUCCESS, you can process the female student. Return from function: 0 ERROR, a number is found inside the female name. Return from function: -4 ERROR, the word is consisted of two many similar letters. Return from function: -6 ERROR, a non character symbol is found inside the female name. Return from function: -5 Hit enter to continue.... Τέλος. Πραγματικά αν κατάλαβες κατάλαβες περισσότερο κατανοητός δεν μπορώ να γίνω....
voulaji Δημοσ. 5 Μαρτίου 2008 Μέλος Δημοσ. 5 Μαρτίου 2008 Σε ευχαριστώ πολύ για την βοήθεια. Μπορώ να πω τώρα ότι το κατάλαβα.
HalfAsleep Δημοσ. 5 Μαρτίου 2008 Δημοσ. 5 Μαρτίου 2008 Έχω το εξής πρόβλημα. Η πιο κάτω συνάρτηση "enrollFemale" επιτρέπει την εγγραφή μόνο φοιτητριών σε ένα Πανεπιστήμιο./* * enrollFemale * * returns gender i.e. always female or negative value indicating error * */ int enrollFemale(char *femaleName){ if (femaleName == NULL) return(-1); struct student s; s.gender = 'f'; //only females allowed. strncpy( s.name, femaleName, strlen(femaleName)); return(s.gender); } Το ερώτημά μου είναι το εξής: Πως μπορώ να ελέγξω τη συνάρτηση χρησιμοποιώντας την προσέγγιση συνοριακών τιμών και για όσες περιπτώσεις η συνάρτηση δεν περνάει τον έλεγχο,πρέπει να αναφέρω τι τιμή επιστρέφει εξηγώντας τη συμπεριφορά του προγράμματος. Εχω την εντυπωση πως αυτο που εχεις να κανεις ειναι απλα να περιγραψεις τη συμπεριφορα της συναρτησης για μη τυπικη εισοδο, δηλαδη για εισοδο που δεν χειριζεται ρητα η συναρτηση σου (σε αντιθεση με το να γραψεις κωδικα που χειριζεται τα errors, correct me if I'm wrong). Ο bokarinho εδωσε εναν τροπο, φανταζομαι ομως δε θελεις να τροποποιησεις την enrollFemale(), κι εκτος αυτου δεν περιγραφεις περιπτωσεις οπου η συναρτηση δεν επιστρεφει (η χρηση της strnlen() - κλασσικο buffer overflow vulnerability).
voulaji Δημοσ. 11 Μαρτίου 2008 Μέλος Δημοσ. 11 Μαρτίου 2008 Νομίζω ότι μόνο εσύ έχεις καταλάβει 100% τι ακριβώς ζητάω. Είναι αλήθεια ότι με έχει πεδέψει πολύ αυτό το θέμα. Συμφωνώ με όσα γράφεις, αλλά δεν μου "ελέγχεις" την συνάρτηση, ούτε που περιγράφεις τις τιμές που επιστρέφει όταν δεν περνά τον έλεγχο.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.