Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

...

αλλα βλεπω βαζεις και συναρτησεις για να παιρνει την εισοδο??? γιατι? για να μην παραφουσκωνεις την main? :P ή για να μην βάζεις πολλα ορισματα σε συναρτησεις ? σε μια περασα μεχρι και 4 :P

Ένας από τους βασικούς λόγους που χρησιμοποιούμε συναρτήσεις είναι για να μη διπλογράφουμε κώδικα. Που με τη σειρά του σημαίνει πως όσο πιο ευέλικτες τις κάνουμε, τόσο περισσότερο reusable γίνονται, και άρα τόσο λιγότερο κώδικα διπλογράφουμε.

 

Από ένα σημείο και μετά όμως ενέχει κι αυτό κάποιους κινδύνους, όπως για παράδειγμα ότι είναι εύκολο από την πολύ... ευελιξία να πέσουμε στην "λούμπα" η συνάρτηση να προσπαθεί να καλύψει πάρα πολλές & διαφορετικές μεταξύ τους περιπτώσεις, και να χάσει έτσι την ομοιογένειά και την στόχευσή της. Ένα τέτοιο "κακό" παράδειγμα θα ήταν αν επιχειρούσαμε ας πούμε να διαβάζουμε με μια συνάρτηση και int και char και float. Το έβαλα σε εισαγωγικά το "κακό" γιατί ούτε αυτό είναι απόλυτο. Ανάλογα τις ανάγκες μπορεί όντως να θέλουμε όντως κάποιες συναρτήσεις ψιλο-πασπαρτού (κυρίως σε πιο υψηλό επίπεδο -- higher layer). Σε αυτές τις περιπτώσεις, η ας την πούμε γενική συνάρτηση συνήθως αποτελείται από κλήσεις πιο εξειδικευμένων συναρτήσεων.

 

Σε γενικές γραμμές όσο πιο στοχευμένες είναι οι συναρτήσεις μας, τόσο ευκολότερα μπορούμε να διαχειριστούμε τον κώδικα, αλλά τόσο αυξάνεται και η πιθανότητα να την πάρα-εξειδικεύσουμε, οπότε αυξάνει και πάλι η πιθανότητα για διπλογραμμένο κώδικα.

 

Χρειάζεται μια μέση προσέγγιση, μια χρυσή τομή, ανάλογα το project, κι ανάλογα τα levels of abstraction του project.

 

Αν συγκρίνεις τις 2 εκδοχές του κώδικα που ποστάρισα, πρόκειται ουσιαστικά για ενοποίηση των 2 συναρτήσεων int get_times() και int get_guess() σε μια, την int get_bounded_int(). Δεν είναι μόνο αυτό, όποτε χρειαστεί να διαβάσουμε οποιονδήποτε int μπορούμε να χρησιμοποιήσουμε την int get_bounded_int() περνώντας της ως ορίσματα μονάχα εκείνα τα γνωρίσματα που διαφοροποιούν το διάβασμα το συγκεκριμένου int από το διάβασμα των άλλων int (δλδ στη περίπτωσή μας το string προτροπής και τα όρια μέσα στα οποία θέλουμε να οριοθετηθεί η είσοδος του int).

 

Επισης βλεπω οτι μεσα στο if τον && τον χειριζεσαι ακριβως οπως και εγω.....

Ναι, για κάποιες δουλειές δεν υπάρχουν πολλές εναλλακτικές.

 

@defacer κοιτα το προβλημα δεν βρισκεται στις MACROS αλλα βρισκοταν στον && οπως λεω...

σου φαινονται πολυ ασχημες ετσι οπως τις εχω γραψει? Γιατι? Γραψε τη δικη σου εκδοχη .

 

Παντως και ετσι οπως ειναι τα macros οι κωδικας δουλευει μια χαρα... παρτον και δοκιμασε τον.

Τα macros που χρησιμοποιείς δεν εξυπηρετούν σε τίποτα (εκτός ίσως από ελαφρώς καλύτερο readability την στιγμή της κλήσης τους, αλλά κι αυτό ελέγχεται με τον τρόπο που τα υλοποιείς). Επίσης, τα macros τα χρησιμοποιούμε κι αυτά (μεταξύ άλλων) για να μην διπλογράφουμε εμείς κώδικα, και να βάζουμε τον per-processor να κάνει αυτοματοποιημένα αυτή την δουλειά. Στη δική σου περίπτωση δεν εκπληρώνουν αυτό τον στόχο, αφού τα χρησιμοποιείς μονάχα μια φορά το καθένα, αλλά κυρίως επειδή τα περιορίζεις στο να χρησιμοποιούν συγκεκριμένους πίνακες, οι οποίοι δεν είναι διαθέσιμοι παντού.

 

Άρα τα macros αυτά δεν μπορούν να χρησιμοποιηθούν γενικώς. Τέλος, τα ορίζεις να δέχονται παράμετρο, η οποία και άχρηστη είναι και δεν την χρησιμοποιείς κιόλας.

 

Κι ένα τελευταίο, προσπάθησε τις μεταβλητές να τις ορίζεις όσο πιο locally μπορείς στα blocks που χρειάζονται. Αν δεν έχουν λόγο ύπαρξης έξω από αυτό το block δεν υπάρχει απολύτως κανένας λόγος να τις ορίσεις με υψηλότερο scope. Για παράδειγμα οι πίνακες arr1 και arr2 δεν χρειάζεται να ορίζονται στη main()... γενικώς δεν χρειάζονται καν πίνακες για την συγκεκριμένη άσκηση.

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

@defacer κοιτα το προβλημα δεν βρισκεται στις MACROS αλλα βρισκοταν στον && οπως λεω...

σου φαινονται πολυ ασχημες ετσι οπως τις εχω γραψει? Γιατι? Γραψε τη δικη σου εκδοχη .

 

Δεν μου φαίνονται "άσχημες". Μου φαίνεται ότι χρησιμοποιείς το λάθος εργαλείο για τη δουλειά. Οι macros έχουν μόνο ένα 100% legit σενάριο χρήσης, και αυτό είναι να "παραμετροποιήσουν" τον κώδικά σου πριν τον δει ο compiler. Κατι σαν

 

>#ifdef _WINDOWS
#define foo_function foo_win
#else
#define foo_function foo_other
#endif

foo_function();

 

Κατά την άποψή μου οποιαδήποτε άλλη χρήση εκτός από την παραπάνω είναι κατάχρηση.

 

Επειδή εδώ προβλέπω διαφωνίες με άλλα μέλη του forum :P θα πω επίσης ότι είναι αρκετά συνηθισμένο να χρησιμοποιούνται και για "σύντομη επεξεργασία", του στυλ

 

>#define ΤΟ_UPPER(x) (x >= 'a' && x <= 'z' ? x - 'a' + 'A' : x)

 

Τέτοιου είδους χρήση (που δεν έχει να κάνει καθόλου με το τι ακριβώς θα γίνει compile αλλά μόνο με το τι θα γίνει run) είχε κάποια πλεονεκτήματα το 1980 αλλά σήμερα θεωρώ ότι είναι απλά κακή χρήση των δυνατοτήτων της γλώσσας γιατί:

 

  1. Έχει όλα τα μειονεκτήματα μιας macro
  2. Δεν προσφέρει τίποτα που δεν μπορεί να γίνει με function

 

 

Σε όποιον πει ότι έτσι τρέχει γρηγορότερα, οι απαντήσεις μου είναι κατά σειρά: α) όχι απαραίτητα ειδικά με τους σημερινούς compilers, β) σε καλή μεριά τα 2 nanosecond που κέρδισες, γ) μάλλον έχεις μπερδέψει τον εαυτό σου με κάποιον που γράφει time critical κώδικα, δ) λογικά αφού γράφεις με τέτοιο στόχο το επόμενο βήμα θα είναι να διαβάσεις το machine code που έφτιαξε ο compiler για να διαπιστώσεις ακριβώς το τι γίνεται -- αν δεν το κάνεις τζάμπα αερολογείς.

 

 

Οι συγκεκριμένες macro έχουν όμως και μια σειρά από τελείως απαράδεκτα χαρακτηριστικά σαν κερασάκι στην τούρτα:

 

  • Παίρνουν παράμετρο που δε χρησιμοποιούν (εξώφθαλμη ένδειξη ότι κάτι πάει πολύ στραβά).
  • Χρησιμοποιούν "υπογείως" μεταβλητές οι οποίες θα πρέπει να τυχαίνει να βρίσκονται in scope στο σημείο εμφάνισης (αυτό για μένα είναι κατευθείαν λόγος no hire -- τουλάχιστον ας τις έπαιρναν σαν παραμέτρους!).
  • Και μάλιστα όχι μία αλλά με το τσουβάλι!
  • Τα ονόματά τους είναι άσχημα επιλεγμένα.
  • Από τη Win_A λείπουν περικλείουσες παρενθέσεις, οι οποίες όμως υπάρχουν στη Win_S -- αυτό δείχνει είτε ότι δεν ξέρεις γιατί χρειάζονται, είτε ότι δεν είσαι προσεκτικός. Την ώρα που χρησιμοποιείς ένα από τα επικινδυνότερα εργαλεία της C. Κακό combo.

 

Κλείνω λέγοντας ότι αυτό που κάνεις το κάνεις επειδή κάπου το είδες. Όμως θα έπρεπε να το κάνεις επειδή μπορείς να δικαιολογήσεις το γιατί μόνος σου, διαφορετικά δεν έχεις κανένα τρόπο να ξέρεις αν εκεί που το είδες ήταν παράδειγμα μεγαλοφυίας ή παράδειγμα μεγαλοβλακείας.

 

Παντως και ετσι οπως ειναι τα macros οι κωδικας δουλευει μια χαρα... παρτον και δοκιμασε τον.

 

Αυτό δεν παίζει κανέναν απολύτως ρόλο. Δεν κάνουμε debug το πρόγραμμα, συζητάμε το γιατί στην τρέχουσα μορφή του σε κάνει no hire και πώς θα μπορούσε να βελτιωθεί για να μη σε κάνει.

 

Επίσης, τα macros τα χρησιμοποιούμε κι αυτά (μεταξύ άλλων) για να μην διπλογράφουμε εμείς κώδικα, και να βάζουμε τον per-processor να κάνει αυτοματοποιημένα αυτή την δουλειά.

Ήμουν έτοιμος να φωνάξω "ένσταση" με ενδεχομένως ανεπιθύμητα αποτελέσματα :-D αλλά αυτή τη φορά θα σε βάλω να διαφωνήσεις με τον εαυτό σου (μα τι πονηρός που είμαι):

 

Ένας από τους βασικούς λόγους που χρησιμοποιούμε συναρτήσεις είναι για να μη διπλογράφουμε κώδικα. Που με τη σειρά του σημαίνει πως όσο πιο ευέλικτες τις κάνουμε, τόσο περισσότερο reusable γίνονται, και άρα τόσο λιγότερο κώδικα διπλογράφουμε.

Δημοσ.

...

Ο κωδικας τρεχει μια χαρα αλλα εχω μια απορια.

 

> #define Win_A(x)  arr1[j] == ( guess ) && arr2[j] == ( guess )  

 

εδω αν το αλλαξω σε

 

> #define Win_A(x) arr1[j] && arr2[j] == guess 

 

δεν θα παιρνω καλα αποτελεσματα αν ο χρηστης επιλεξει Advanced game...

...

Ως πρώτη επισήμανση, το 2ο δεν κάνει την ίδια δουλειά με το 1ο. Στο 1ο συγκρίνεις το arr1[j] με το guess, ενώ στο 2ο το συγκρίνεις με το 0.

 

Μετά, το j που κολλάει στον ορσιμό; Επίσης, που κολλάνε τα arr1 και arr2; Αυτά κάνουν defeat τον λόγο ύπαρξης του macro γενικότερα. Όπως σου έγραψα και στο προηγούμενο ποστ, προσπάθησε να χρησιμοποιείς local scope όσο μπορείς περισσότερο... μόνο καλό θα σου κάνει στην πορεία ;)

 

Αυτό που προσπαθείς να κάνεις με αυτά τα macros, εκφράζεται σωστά ως εξής:

>
#define WIN_ADVANCED(r1, r2, guess)   ( (r1) == (guess) && (r2) == (guess) )

το οποίο όταν θελήσεις να το καλέσεις με στοιχεία των πινάκων θα το καλείς ως εξής...

 

>
...
if ( WIN_ADVANCED(arr1[j], arr2[j], guess) )
  ...

 

όπως βλέπεις το macro δεν εξαρτάται πλέον από κανένα j κι από κανέναν πίνακα. Μπορεί να εφαρμόσει την συνθήκη του σώματός του σε οποιουσδήποτε 3 int του περάσεις ως ορίσματα τη στιγμή της κλήσης του.

 

Επίσης, το έξτρα σετ παρενθέσων εξασφαλίζει πως δεν θα την πατήσεις αν το χρησιμποιήσεις ας πούμε κάπως έτσι...

 

>
if ( isadvanced && WIN_ADVANCED(...) )
  ...

Χωρίς τις έξτρα παρενθέσεις, το παραπάνω ξεκινάει συγκρίνοντας το && του isadvanced με το (r1) == (guess) ενώ εσύ θέλεις να το συγκρίνει με το συνολικό αποτέλεσμα του macro (και όχι δλδ με τον 1ο όρο της συνθήκης του macro).

 

EDIT1:

 

...

Κατά την άποψή μου οποιαδήποτε άλλη χρήση εκτός από την παραπάνω είναι κατάχρηση.

 

Επειδή εδώ προβλέπω διαφωνίες με άλλα μέλη του forum :P θα πω επίσης ότι είναι αρκετά συνηθισμένο να χρησιμοποιούνται και για "σύντομη επεξεργασία", του στυλ

 

>#define ΤΟ_UPPER(x) (x >= 'a' && x <= 'z' ? x - 'a' + 'A' : x)

 

Τέτοιου είδους χρήση (που δεν έχει να κάνει καθόλου με το τι ακριβώς θα γίνει compile αλλά μόνο με το τι θα γίνει run) είχε κάποια πλεονεκτήματα το 1980 αλλά σήμερα θεωρώ ότι είναι απλά κακή χρήση των δυνατοτήτων της γλώσσας γιατί:

 

  1. Έχει όλα τα μειονεκτήματα μιας macro
  2. Δεν προσφέρει τίποτα που δεν μπορεί να γίνει με function

Έχει να προσφέρει τουλάχιστον 2 ακόμα χρήσιμα χαρακτηριστικά:

 

1. Ηθελημένο non-type check...

 

Στην πιο απλή του μορφή...

 

>#define myMIN(x,y)  ( (x) > (y) ? (x) : (y) )

2. Εύκολη & γρήγορη παραμετροποίηση, π.χ. συγκεντρωμένα #defines σε ένα config.h χωρίς να χρειάζεται να καταφύγεις σε global consts.

 

Ρε συ δεν έχω κανένα πρόβλημα με τις διαφωνίες. Εκεί που βιδώνομαι είναι όταν πετάς πράγματα του στυλ "μπερδεύεις τις βούρτσες με τις...", "οφείλεις να αναθεωρήσεις", κλπ, κλπ τα οποία υποδηλώνουν εμμέσως πλην σαφώς πως θεωρείς ότι εσύ είσαι ο master of the universe και ο άλλος είναι ξέρω γω ένας αγρότης που αγόρασε ένα iphone.

 

Ήμουν έτοιμος να φωνάξω "ένσταση" με ενδεχομένως ανεπιθύμητα αποτελέσματα :-D αλλά αυτή τη φορά θα σε βάλω να διαφωνήσεις με τον εαυτό σου (μα τι πονηρός που είμαι):

Δεν την πιάνω την αντίφαση. Για βοήθα με λίγο.

 

EDIT2:

 

Α, μου ήρθε και 3η χρησιμότητα (πιθανώς να υπάρχουν κι άλλες)...

 

>
const int MAX_ELEMS = 100;
int array[ MAX_ELEMS ]; // <--- ΒΟΟΜ
...
#define MAX_ELEMS 100
int array[ MAX_ELEMS ]; // <-- Happily accepted

Δημοσ.

Καλα νταξει με πεισατε θα τις βγάλω τις macros!!! Η αληθεια ειναι οπως ειπε και ο migf1 οτι τις εβαλα για readability , να γινει αισθητικα πιο ομορφο σε καποιο σημειο ωστοσο περασε απο το μυαλο μου οτι ειναι περιττο γιατι καθεμια εξ αυτων χρησιμοποιειται μονο μια φορα. Μετα το ξεχασα βεβαια!

 

Τελοςπαντων . Ακομη δεν εχω διαβασει για προεπεξεργαστη οποτε defacer καποια στιγμη θα επιστρεψω :devil:

ουτε για τα scopes εχω διαβασει....

 

Την συναρτηση θα την αφησω ως εχει με τα 4 ορισματα της μεσα σαν κωδικα που τον εχω γραψει εγω :P

δεν ειναι και τοσο απολυτο οτι ειναι κακο οπως μου εξηγησε ο migf1 πιο πανω.

 

@migf1 σορρυ αλλα εδω δεν σε πιανω -> Ως πρώτη επισήμανση, το 2ο δεν κάνει την ίδια δουλειά με το 1ο. Στο 1ο συγκρίνεις το arr1[j] με το guess, ενώ στο 2ο το συγκρίνεις με το 0.

 

Κοιτα αν εχει νοημα τι ακριβως εννοεις? εγω νομιζω οτι συγκρινεις στην 1η περιπτωση τους 2 πινακες και αν και οι δυο ειναι ισοι με το guess τοτε δινει TRUE . εΙΧΑ την εντυπωση οτι ειναι ιδιο με το

 

> arr1[j] && arr2[j] == guess 

 

ΠΩΣ μεταφραζεται??? μπορεις να κανεις ενα tracing αν δεν σου ειναι κοπος????

 

ποια ειναι η διαφορα του δηλαδη με το

 

> arr1[j] == guess && arr2[j] == guess 

 

εγω εκανα και μου βγαζει τα ιδια :/

 

>

#include <stdio.h>
int main( void )
{
       int arr1[10]={1,2,3,4,5,6,7,8,9,10} , arr2[10]={1,2,3,4,5,6,7,8,9,10};
       
       int i=0;
       
       /*for(; i<10; i++)
       if( arr1[i] && arr2[i] == i+1 )
       printf(" OK ");*/
       
       for(; i<10; i++)
       if( arr1[i] == (i+1) && arr2[i] == (i+1) )
       printf(" OK ");
       
       
       return 0;
      
}

 

EDIT Δεν χρειαζεται να οριζονται οι πινακες στην main???? :/ και πως θα χρησιμοποιηθουν στην κληση των συναρτησεων αν θελω να περασω τους πινακες σαν ορισματα???

Δημοσ.

@migf1 σορρυ αλλα εδω δεν σε πιανω -> Ως πρώτη επισήμανση, το 2ο δεν κάνει την ίδια δουλειά με το 1ο. Στο 1ο συγκρίνεις το arr1[j] με το guess, ενώ στο 2ο το συγκρίνεις με το 0.

Κοιτα αν εχει νοημα τι ακριβως εννοεις? εγω νομιζω οτι συγκρινεις στην 1η περιπτωση τους 2 πινακες και αν και οι δυο ειναι ισοι με το guess τοτε δινει TRUE . εΙΧΑ την εντυπωση οτι ειναι ιδιο με το

 

> arr1[j] && arr2[j] == guess 

 

ΠΩΣ μεταφραζεται??? μπορεις να κανεις ενα tracing αν δεν σου ειναι κοπος????

 

ποια ειναι η διαφορα του δηλαδη με το

 

> arr1[j] == guess && arr2[j] == guess 

Δεν συγκρίνεις πίνακες, μεμονωμένα στοιχεία πινάκων συγκρίνουν τα macros σου.

 

Πέρα από το παραπάνω, το ...

 

> arr1[j] && arr2[j] == guess 

σημαίνει: αν το arr1[j] διαφέρει του μηδενός και το arr2[j] ισούται με το guess.

 

Ενώ το ...

 

> arr1[j] == guess && arr2[j] == guess 

σημαίνει: αν το arr1[j] ισούται με το guess και το arr2[j] ισούται με το guess

 

EDIT Δεν χρειαζεται να οριζονται οι πινακες στην main???? :/ και πως θα χρησιμοποιηθουν στην κληση των συναρτησεων αν θελω να περασω τους πινακες σαν ορισματα???

Έτσι όπως έχεις δομήσει εσύ τον κώδικά σου χρειάζονται οι πίνακες, αλλά μπορεί να δομηθεί έτσι ώστε να μη χρειάζονται στην main() ή και να μη χρειάζονται καθόλου.

 

Επίσης, η guess εφόσον ουσιαστικά την χρησιμοποιείς μονάχα μέσα στην roll_dice_adv() θα μπορούσες να την ορίζεις, να την διαβάζεις και να την χρησιμοποιείς μονάχα μέσα στην roll_dice_adv()... στον δικό μου κώδικα την διαβάζω στην play() αφού μόνο εκεί έχει νόημα η ύπαρξή της.

 

EDIT:

 

Τώρα είδα που έγραψες πως δεν έχεις φτάσει ακόμα να διαβάσεις για scope. Είναι έως και αδύνατον για οποιοδήποτε σοβαρό βιβλίο να έχει φτάσει σε συναρτήσεις και να μην έχει αναφερθεί στο scope.

Δημοσ.

Oops! :wub:

 

Σωστα αριστερα και δεξια στον τελεστη && (και οχι μονο σε αυτον) έχουμε 2 ξεχωριστες εκφρασεις καθε φορα . Δε βαριεσαι και τα μπερδεματα ανθρωπινα ειναι καμια φορα :-D

 

Κοιταξε να δεις σχετικα με την guess ειναι μεταβλητη η οποια ετσι οπως εχει δομηθει ο δικος μου κωδικας

πρεπει να παρει τιμη στην main() αλλιως θα περάσει μη αρχικοποιημενη μεσα στην συνάρτηση roll_dice_adv

και θα παραπονεθει ο μεταγλωτιστης. Οσο για τους πινακες εχεις δικιο , απλα ετσι οπως το ειπες οτι δεν χρειαζονται στην main με βαση την παρουσα προσεγγιση ημουν πολυ περιεργος να εβλεπα τι θα μου ξεφουρνιζες :devil:

Δημοσ.

...

Κοιταξε να δεις σχετικα με την guess ειναι μεταβλητη η οποια ετσι οπως εχει δομηθει ο δικος μου κωδικας

πρεπει να παρει τιμη στην main() αλλιως θα περάσει μη αρχικοποιημενη μεσα στην συνάρτηση roll_dice_adv

και θα παραπονεθει ο μεταγλωτιστης.

Την ορίζεις τοπικά μέσα στην roll_dice_adv() ... αυτό σημαίνει το "προσπάθησε να ορίζεις σε όσο το δυνατόν πιο lcoal scope μπορείς τις μεταβλητές που χρησιμοποιείς".

 

Οσο για τους πινακες εχεις δικιο , απλα ετσι οπως το ειπες οτι δεν χρειαζονται στην main με βαση την παρουσα προσεγγιση ημουν πολυ περιεργος να εβλεπα τι θα μου ξεφουρνιζες :devil:

Καταλαβαίνεις όμως πως με τους πίνακες καταναλώνεις τσάμπα μνήμη στην συγκεκριμένη άσκηση χωρίς καν να κερδίζεις ταχύτητα ως αντιστάθμισμα, ε;

Δημοσ.

οταν εγω λεω οτι τρολαρει αγρια....

 

Ναι αλλη δουλεια δεν έχω

η έννοια μου ειναι να τρολάρω εσενα :/

 

Και εισαι σιγουρος οτι θες να μιλησουμε για τρολαρισμα?

γιατι σε βλεπω οτι το συνεχιζεις :P

 

την αλλη φορα ενω δεν σε ειχε ρωτησει κανεις για τους δισδιαστατους

το ποσταρισες... γιατι για να δειξεις οτι ξέρεις? Αυτο τι ειναι τρολαρισμα δεν ειναι? Μην κανεις τον εξυπνο λοιπον :-D

και γενικα οποιος νομιζει οτι τρολαρεται ή οτι ζοριζεται ας μην απαντησει καθολου. Δεν θελω τη βοηθεια του. Το χω πει και παλιοτερα το ξεκαθαριζω και τωρα ;)

 

>

void roll_dice_adv(int n , int guess , int arr1[] , int arr2[])
{

int j=0 , count=0;

if( guess < 0 || guess > 6)
return;

roll_dice(n,arr1,arr2);

   for(; j<n; j++)
{
	if(arr1[j] == ( guess ) && arr2[j] == ( guess ) )
	count++;
}

if(count)
printf(" Congratulations you have : %d Win(s) in Advanced Mode!!! " , count );

else
puts("Sorry! You lost.");

return;
}

 

Που ρε συ migf1 την οριζω τοπικα??? μηπως εννοεις οτι την περναω σαν εξτρα ορισμα??? ενω θα μπορουσα να την διαχειριστω απλα μεσα στην συνάρτηση τοπικα? δεν σε καταλαβα ρε φιλε..

Δημοσ.

Παντως και ετσι οπως ειναι τα macros οι κωδικας δουλευει μια χαρα... παρτον και δοκιμασε τον.

Καταπληκτικό επιχείρημα. Και η δήλωση void main() δουλεύει μια χαρά άρα να την χρησιμοποιούμε.

 

Οι συγκεκριμένες macro έχουν όμως και μια σειρά από τελείως απαράδεκτα χαρακτηριστικά σαν κερασάκι στην τούρτα:

 

  • Παίρνουν παράμετρο που δε χρησιμοποιούν (εξώφθαλμη ένδειξη ότι κάτι πάει πολύ στραβά).
  • Χρησιμοποιούν "υπογείως" μεταβλητές οι οποίες θα πρέπει να τυχαίνει να βρίσκονται in scope στο σημείο εμφάνισης (αυτό για μένα είναι κατευθείαν λόγος no hire -- τουλάχιστον ας τις έπαιρναν σαν παραμέτρους!).
  • Και μάλιστα όχι μία αλλά με το τσουβάλι!
  • Τα ονόματά τους είναι άσχημα επιλεγμένα.
  • Από τη Win_A λείπουν περικλείουσες παρενθέσεις, οι οποίες όμως υπάρχουν στη Win_S -- αυτό δείχνει είτε ότι δεν ξέρεις γιατί χρειάζονται, είτε ότι δεν είσαι προσεκτικός. Την ώρα που χρησιμοποιείς ένα από τα επικινδυνότερα εργαλεία της C. Κακό combo.

Κλείνω λέγοντας ότι αυτό που κάνεις το κάνεις επειδή κάπου το είδες. Όμως θα έπρεπε να το κάνεις επειδή μπορείς να δικαιολογήσεις το γιατί μόνος σου, διαφορετικά δεν έχεις κανένα τρόπο να ξέρεις αν εκεί που το είδες ήταν παράδειγμα μεγαλοφυίας ή παράδειγμα μεγαλοβλακείας.

οταν εγω λεω οτι τρολαρει αγρια....

10 μέρες ban στους εγκάθετους defacer και ChRis6 που θέλουν να μειώσουν τις τίμιες προσπάθειες του starlight και τον παρουσιάζουν ως troll, ενώ επανειλημμένα τους τόνισε ότι δεν είναι, απλά και μόνο επειδή ρωτάει κάτι αφού του το έχουν εξηγήσει 4 φορές σε προηγούμενα μηνύματα. Όχι στην φίμωση του συντρόφου starlight από τους ιερείς του ξερολισμού defacer και chris6. Όλοι στην συναυλία υποστήριξης του starlight. (Αρκετές μ...κίες έγραψα νομίζω :Ρ )

 

Α, μου ήρθε και 3η χρησιμότητα (πιθανώς να υπάρχουν κι άλλες)...

 

>
const int MAX_ELEMS = 100;
int array[ MAX_ELEMS ]; // <--- ΒΟΟΜ
...
#define MAX_ELEMS 100
int array[ MAX_ELEMS ]; // <-- Happily accepted

 

[τιτίζης]

Βοηθάει μεν σε αυτή την περίπτωση το #define αλλά με αυτό το σκεπτικό ένα enum είναι πολύ καλύτερο. Όσον αφορά το πρώτο με το const, είχε προταθεί να αλλαχθεί η σημασία του const ώστε σε αυτή την περίπτωση να δημιουργεί μια σταθερά όπως συμβαίνει στην C++ αλλά δυστυχώς δεν μπήκε στην C11 έκδοση. Με δεδομένο ότι υπάρχουν compilers που δεν έχουν υλοποιήσει την C99 ακόμη, και να έμπαινε ακόμη ποιος ξέρει πόσος καιρός θα περνούσε μέχρι να υλοποιηθεί αλλά θα ήταν καλό βήμα. Φημολογείται ότι έχει καλή πιθανότητα να μπει στην επόμενη έκδοση αλλά μέχρι τότε ζήσε μάη να φας τριφύλλι.

[/τιτίζης]

Δημοσ.

Εγω ρωτησα προχθες τον Chris αν υπαρχει προβλημα και αν δημιουργειται θεμα

μου ειπε οχι θελοντας να το παιξει άνετος και το κρατησε και σημερα που βρηκε ευκαιρια

το κτυπησε. Αν εγω ειμαι τρολλ αυτος τι ειναι τοτε? Ντραπηκε να πει προχθες οτι υπάρχει θεμα?

 

Αυτα που ειπε ο defacer τα καταλαβα... με τον migf1 κανουμε συζητηση για τον κωδικα που ποσταρα

σε αντιθεση με πολλους που δεν ποσταρουν δικους τους ολοκληρωμενους επειδη μαλλον φοβουνται την κριτικη κατα τα αλλα

κρινουν εκ του ασφαλους. Και ουτε τις αποριες τους ποσταρουν επειδη ντρεπονται.

 

Εχεις δει εσυ καναν ολοκληρωμενο κωδικα εδω μεσα εκτος απο του migf1???

ΠΟυντος? :devil:

 

Κοιταξε απλα παραδειγματακια πως τρεχουμε εναν πινακα ξερω και εγω να αναλυω και να το παιζω επαγγελματιας... δεν εισαι μαγκας ετσι

 

οποιος γουσταρει να διαφωνησουμε δεν εχω προβλημα αρκει να το λεει εξαρχης και να μην τον πιανουν οι ντροπουλες του... :-D

Δημοσ.

Έχει να προσφέρει τουλάχιστον 2 ακόμα χρήσιμα χαρακτηριστικά:

1. Ηθελημένο non-type check...

 

Στην πιο απλή του μορφή...

 

>#define myMIN(x,y)  ( (x) > (y) ? (x) : (y) )

 

Δεν είμαι και τόσο sold για τη χρησιμότητα του παραπάνω ή του κατά πόσον είναι καλή ιδέα για δύο λόγους:

 

  1. έχει νόμα μόνο όταν μιλάμε για primitives οπότε θα μπορούσες απλά να τα κάνεις type π.χ. σαν int ή float και να είσαι καλυμμένος στις περισσότερες των περιπτώσεων
  2. σε αντίθεση με μια function myMIN, η macro κάνει evaluate τα arguments παραπάνω από μία φορά και έχουμε "ενδιαφέρουσες" παρενέργειες αν δώσεις π.χ. myMIN(++i, ++j)

 

Ειδικά το δεύτερο είναι πρόβλημα το οποίο για να δεχτώ την πιθανότητα να μου συμβεί όταν δεν προσέχω θα πρέπει το αναμενόμενο ώφελος να είναι πολύ μεγαλύτερο από το να γλυτώσω μια γραμμή κώδικα στις πιθανότατα ελάχιστες περιπτώσεις που δε θα έχω άλλη επιλογή από το να γράψω untyped check.

 

2. Εύκολη & γρήγορη παραμετροποίηση, π.χ. συγκεντρωμένα #defines σε ένα config.h χωρίς να χρειάζεται να καταφύγεις σε global consts.

 

Δεν βλέπω με ποιό τρόπο η χρήση defines είναι ευκολότερη ή/και γρηγορότερη από τη χρήση global consts.

 

Α, μου ήρθε και 3η χρησιμότητα (πιθανώς να υπάρχουν κι άλλες)...

 

>
const int MAX_ELEMS = 100;
int array[ MAX_ELEMS ]; // <--- ΒΟΟΜ
...
#define MAX_ELEMS 100
int array[ MAX_ELEMS ]; // <-- Happily accepted

 

Αυτή η περίπτωση στο μυαλό μου μπαίνει στην κατηγορία που έγραψα (παραμετροποίηση κώδικα πριν τον δει ο compiler), νομίζω θα συμφωνήσεις ότι για κάτι τέτοιο μιλάμε. Ακόμα κι αν διαφωνήσεις, υπάρχει λύση και χωρίς τη χρήση macro:

 

>enum { ARRAY_SIZE = 100 };
char buf[ARRAY_SIZE]; // δεν είναι VLA

 

Απο κει και πέρα μπορεί κάλλιστα να υπάρχουν χρήσεις που δεν έχω σκεφτεί γιατί ούτε έκατσα να το ψειρίσω 2 ώρες ούτε είμαι ο guru της C, νομίζω όμως ότι και να υπάρχουν θα μιλάμε για αρκετά edge cases.

 

Δεν την πιάνω την αντίφαση. Για βοήθα με λίγο.

 

Δεν είναι αντίφαση με την έννοια της λογικής. Λες όμως ότι χρησιμοποιούμε ποτήρι για να πιούμε νερό και επίσης χρησιμοποιούμε το λάστιχο της βρύσης για να πιούμε νερό. Είναι εύλογο να περιμένει κανείς μια διευκρίνιση, ειδικά όταν απευθύνεσαι σε κόσμο που δεν έχει εμπειρία.

 

Στην προκειμένη κατά την άποψή μου θα ήταν πολύ σωστότερο να πεις "Για να πιούμε νερό χρησιμοποιούμε ποτήρι. Νερό μπορεί να πιεί κανείς και με το λάστιχο, έχε το υπόψη γιατί θα δεις κόσμο που το κάνει, αλλά αυτή η χρήση του λάστιχου δεν έχει κανένα απολύτως πλεονέκτημα απέναντι στο ποτήρι και πρέπει να το αποφεύγεις γιατί έχει μειονεκτήματα τα οποία πρέπει να είσαι έμπειρος για να εντοπίσεις".

 

Για τα υπόλοιπα θα σου στείλω ένα ΠΜ κάποια στιγμή να τα πούμε με την ησυχία μας.

 

Ναι αλλη δουλεια δεν έχω η έννοια μου ειναι να τρολάρω εσενα :/

 

Και εισαι σιγουρος οτι θες να μιλησουμε για τρολαρισμα?

γιατι σε βλεπω οτι το συνεχιζεις :P

 

την αλλη φορα ενω δεν σε ειχε ρωτησει κανεις για τους δισδιαστατους

το ποσταρισες... γιατι για να δειξεις οτι ξέρεις? Αυτο τι ειναι τρολαρισμα δεν ειναι? Μην κανεις τον εξυπνο λοιπον :-D

 

Μια φιλική συμβουλή: κάνε ο,τι περνάει απ' το χέρι σου για να μην παίρνεις την κριτική προσωπικά (άσχετα αν είναι σωστή ή δεν είναι, δεν το εξετάζω). Πολλοί άνθρωποι όταν τους λες "το φαγητό που έκανες είναι χάλια" αυτομάτως το μετατρέπουν σε "είσαι χάλια μάγειρας" και το παίρνουν πατριωτικά. Μην το κάνεις, γιατί το μόνο που θα καταφέρεις είναι να κόψεις από τον εαυτό σου ευκαιρίες να εντοπίσεις τι έκανες λάθος και να το βελτιώσεις.

Δημοσ.

σε αντιθεση με πολλους που δεν ποσταρουν δικους τους ολοκληρωμενους επειδη μαλλον φοβουνται την κριτικη κατα τα αλλα

κρινουν εκ του ασφαλους. Και ουτε τις αποριες τους ποσταρουν επειδη ντρεπονται.

 

Κοιταξε απλα παραδειγματακια πως τρεχουμε εναν πινακα ξερω και εγω να αναλυω και να το παιζω επαγγελματιας... δεν εισαι μαγκας ετσι

Δεν ήξερα ότι κάνουμε διαγωνισμό συγγραφής κώδικα και ό,τι άσκηση ποστάρεις εσύ πρέπει όλοι να γράφουμε την δική μας εκδοχή του αλγορίθμου αλλιώς "κρίνουμε εκ του ασφαλούς" ούτε ήξερα ότι στο insomnia γίνεσαι μάγκας. Εγώ γράφτηκα για να ρωτάω όταν χρειάζομαι βοήθεια και για να βοηθάω και εγώ εκεί που πρέπει όμως.

 

Μια παροιμία που λέει "εμ κλέφτης εμ ανώτερος" την ξέρεις ?

Δημοσ.

@defacer βλεπεις οτι ο ημιθεος το πηρε προσωπικα αυτο που ειπα με τους κωδικες? :P

 

αρα δεν ειμαι ο μοναδικος και η κριτικη που θα σου κανει ο αλλος μπορει καμια φορα να μην ειναι και τοσο αθωα.Παρολαυτα ποσταριζα παντα κωδικα.

 

Τελοςπαντων αυτοι πανε να μου κολλησουν την ταμπελα του τρολλ..

 

και θα ρωτησω για τελευταια φορα... υπαρχει θεμα με την παραμονη μου εδω μεσα?

χαλαει το θρεντ? ΝΑΙ / ΟΧΙ .

 

Μην ντραπει κανεις.

 

Δεν εγινε και τιποτα μπορει να μην μου πηγαινουν τα φορα... τα κοβω και τελειωσε και χεστηκα και για το προγραμματισμο λες και θα βρεις να δουλεψεις πουθενα :P

Δημοσ.

Κανενα προβλημα δεν δημιουργειται , το ξαναλεω. Απλα οι ερωτησεις σου ειναι καπως... περιεργες !!!

Οπως και την προηγουμενη φορα με τους τυχαιους αριθμους( εσυ δεν ησουν ; :mrgreen: ) .

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...