Αυτό ήταν !
Εδώ και ο δικός μου κώδικας...
- Κώδικας: Επιλογή όλων
Bool table_fill_randomly( Table *table, const int maxval )
{
register int i = 0; /* μετρητής για το buffer */
if ( !table ) /* έλεγχος ασφαλείας */
return FALSE; /* ... πρόωρη έξοδος */
if ( !table->buffer ) /* το buffer δεν υπάρχει */
return FALSE; /* ... πρόωρη έξοδος */
if ( table->buflen == table->bufmaxlen ) /* το buffer είναι γεμάτο */
return FALSE; /* ... πρόωρη έξοδος */
for (i=table->buflen; i < table->bufmaxlen; i++)/* γέμισμα buffer με τυχαίους */
table->buffer[i] = rand() % (maxval + 1);
table->buflen = table->bufmaxlen; /* ενημέρωση τρέχοντος μήκους */
return TRUE;
}
Η μόνη διαφορά με τον δικό σου είναι πως δεν γράφω μηνύματα σφάλματος μέσα από την συνάρτηση (για να είναι πιο εύκολο να απομονώσουμε αργότερα το περιβάλλον επικοινωνίας με τον χρήστη -user interface- από τον πυρήνα του προγράμματος

)
Λοιπόν, μέχρι να το προσπαθήσει κι ο Star_Light, έχω κάτι αρκετά πιο δύσκολο τώρα...
μια βελτιωμένη έκδοση αυτής της συνάρτησης, που τα τυχαία νούμερα που θα παράγει θα είναι μοναδικά!
- Κώδικας: Επιλογή όλων
Bool table_fill_unique_randomly( Table *table, int maxval );
Αυτόματα αυτό σημαίνει πως η τιμή του ορίσματος maxval δεν μπορεί να είναι μικρότερη από το πλήθος των κενών στοιχείων του buffer μας. Διότι φανταστείτε π.χ. έναν κενό πίνακα μέγιστης χωρητικότητας 10 στοιχείων, που θέλουμε να τον γεμίσουμε με μοναδικούς τυχαίους αριθμούς από το 8 και κάτω. Μόλις συμπληρωθούν τα 8 πρώτα του στοιχεία, δεν θα υπάρχουν άλλοι τυχαίοι αριθμοί

Άρα η συνάρτησή μας πρέπει να εξετάζει αυτή την περίπτωση και να "αντιδράει" με κάποιον λογικό και λειτουργικό τρόπο. Ένας τέτοιος τρόπος είναι να επιστρέφει σφάλμα (FALSE).
Ένας άλλος πολύ πιο έξυπνος τρόπος είναι όταν χρειάζεται, να προσαρμόζει αυτόματα την τιμή του maxval ώστε να ισούται με το πλήθος των κενών κελιών του πίνακα, πριν αρχίσει να τα γεμίζει με τυχαία νούμερα.Αυτό θέλουμε να κάνει η συνάρτησή μας

Τώρα, σε ότι αφορά την μοναδικότητα του κάθε παραγόμενου τυχαίου αριθμού (από 0 έως maxval, συμπεριλαμβανομένων) θα μπορούσα να σας αφήσω να σκεφτείτε μόνοι σας πως θα το καταφέρετε, αλλά νομίζω πως ακόμα δεν έχετε αναπτύξει τέτοια αλγοριθμική σκέψη. Οπότε, θα σας περιγράψω τον αλγόριθμο και σεις θα προσπαθήσετε να τον υλοποιήσετε.
Ένας ΑΡΓΟΣ τρόπος είναι για κάθε παραγόμενο τυχαίο νούμερο που θέλετε να βάλετε σε ένα κενό στοιχείο του πίνακα, να ψάχνετε πρώτα στα γεμάτα στοιχεία του για να δείτε αν υπάρχει ήδη. Αν υπάρχει θα επαναλαμβάνετε τη διαδικασία μέχρι το παραγόμενο τυχαίο νούμερο να μην υπάρχει ήδη, οπότε θα μπορείτε να το αναθέσετε στο κενό στοιχείο που βρίσκεστε, και να πάτε στο επόμενο.
Όπως καταλαβαίνουμε, για κάθε παραγόμενο τυχαίο νούμερο πρέπει να εξετάζουμε όλο τον πίνακα! ΘΑΝΑΤΟΣ

Υπάρχει πολύ πιο γρήγορος τρόπος! Μέσα στη συνάρτηση θα ορίσετε έναν τοπικό πίνακα με στοιχεία τύπου Bool, που θα τον ονομάσετε usedvals...
- Κώδικας: Επιλογή όλων
Bool table_fill_unique_randomly( Table *table, int maxval )
{
Bool *usedvals = NULL;
...
Θα τον βάλετε να έχει μέγιστο πλήθος στοιχείων όσα είναι τα νούμερα μέσα από τα οποία θα επιλέγονται οι τυχαίοι αριθμοί. Για παράδειγμα, αν οι τυχαίοι αριθμοί επιλέγονται από το 0 έως το 100, τότε το μέγιστο πλήθος στοιχείων του usedvals θα πρέπει να είναι 101 στοιχεία (δλδ από το 0 έως το και 100).
Έχουμε λοιπόν έναν πίνακα από Bool στοιχεία, με το καθένα τους να αντιστοιχεί σε έναν από τους τυχαίους μας αριθμούς. Θα αρχικοποιήσετε όλα τα στοιχεία με την τιμή FALSE, που σημαίνει πως κανένα από αυτά τα νούμερα δεν έχει χρησιμοποιηθεί ακόμα!
Τώρα, όταν αρχίσετε να παράγετε τυχαία νούμερα για να τα βάλετε στα κενά κελιά του buffer, για καθένα από αυτά τα νούμερα θα εξετάζετε αν το κελί του στον πίνακα usedvals περιέχει την τιμή FALSE ή την τιμή TRUE. Αν περιέχει την τιμή TRUE σημαίνει πως έχει ήδη χρησιμοποιηθεί, άρα θα παράξετε νέο τυχαίο νούμερο και θα επαναλάβετε τον έλεγχο. Αν όμως περιέχει την τιμή FALSE, τότε σημαίνει πως το συγκεκριμένο νούμερο δεν έχει χρησιμοποιηθεί, άρα θα αλλάξετε την τιμή που του αντιστοιχεί στον usedvals σε TRUE και θα αναθέσετε το τυχαίο σας νούμερο στο κενό κελί του buffer που θα βρίσκεστε εκείνη τη στιγμή! Και θα πάτε στο επόμενο κενό κελί του table->buffer.
Θα το καταφέρουμε αυτό, τι λέτε;
