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

Προγραμματισμος σε C


Liam Lawrence

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

...

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

...

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

 

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

 

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

 

Οι γλώσσες είναι εργαλεία, και ως τέτοια πρέπει να αντιμετωπίζονται. Επίσης, πίσω από τις επιλογές που έχει κάνει η κάθε γλώσσα για το τι θα υποστηρίξει και πως θα το υποστηρίξει συνήθως (σχεδόν πάντα δηλαδή) υπάρχει συγκεκριμένο rationale. Με τον καιρό και όσο εμβαθύνετε θα είστε σε θέση να το καταλαβαίνετε και να επιλέγετε ποια features (και κατ' επέκταση ποιες γλώσσες) θα χρησιμοποιήσετε ανάλογα τις ανάγκες του εκάστοτε project σας.

 

Τα υπόλοιπα είναι υπερφίαλες σάλτσες.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 60
  • Δημ.
  • Τελ. απάντηση

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

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

Έχεις παρατηρήσει ότι σε οποιοδήποτε topic κάποιος διατυπώσει ενστάσεις πάνω σ' αυτά που λες, πάντα η τελευταία σου λέξη είναι "όλα τα πράγματα έχουν και το καλό έχουν και το κακό, μπλα μπλα μπλα"; Δεν υπήρξε ούτε μία φορά που υποστήριξες τη θέση σου επαρκώς ("έτσι που τα λέω είναι γι' αυτό και γι' αυτό το λόγο").

 

Just saying.

 

Έτσι και σήμερα δυστυχώς δεν ήταν γραφτό να μάθουμε ποιά είναι τα πλεονεκτήματα των null terminated strings. Αλλά c'est la vie. Καληνύχτες.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Offtopic

 

Mig αυτή η εμπάθεια με την c σε κάνει... Κάπως.. Μη σοβαρός συνομιλητής ο defaecr? Οκ κι αυτός έχει την εμπάθεια του με σένα. Αλλά το να τσακονεσε με τον ημίθεο; Ε αυτό είναι πάτος.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Απο την δικη μου εμπειρία μεχρις τωρα, η C μου είναι χρήσιμη όταν διαβαζω τα patch στο linux. Καταλαβαίνω γιατί και πως φτιάχνουν τα bugs, και βλέπω μπροστά μου ακριβώς τι συμβαίνει και ποιο ήταν το πρόβλημα. Απο κει και πέρα, για προσωπική χρήση, χρησιμοποιώ bash για scripting ενώ δηλώνω ερωτευμένος με την Python.

 

Θα σου πρότεινα να ξεκινήσεις με Python, και όσον αφορά του αλγορίθμους (σε περιπτωση που σε ενδιαφερουν) αγόρασε το βιβλίο: http://www.manning.com/bhargava/

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αλλά το να τσακονεσε με τον ημίθεο; Ε αυτό είναι πάτος.

Δεν ισχυρίστηκα ποτέ ότι έχω τις σούπερ-ουάου γνώσεις αλλά είμαι πια τόσο άσχετος που όταν τσακώνεται κάποιος μαζί μου έφτασε στον πάτο ? :)

 

Τέσπα ξαναμπαίνω στη σπηλιά μου γιατί αρκετά ξεφύγαμε από το θέμα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Offtopic

 

Mig αυτή η εμπάθεια με την c σε κάνει... Κάπως..

Σου υπενθυμίζω πως πρότεινα python στον OP.

 

 

 

Μη σοβαρός συνομιλητής ο defaecr? Οκ κι αυτός έχει την εμπάθεια του με σένα.

Ναι, μη σοβαρός συνομιλητής ο defacer. Επειδή ούτε εγώ ούτε εσύ είμαστε χτεσινοί στο φόρουμ, θυμήσου πόσες φορές αναλώθηκα σε κυκεώνα παπαρολογίας με τον συγκεκριμένο, επειδή υποστήριζα τα αυτονόητα. Το πιο χαρακτηριστικό που μου έρχεται στο μυαλό αυτή τη στιγμή είναι πως το hash function είναι εξ' ορισμού map function, και άρα βρίσκεται σε εξάρτηση με το μέγεθος του map (είναι και πολλά άλλα, που δεν τα θυμάμαι τώρα).

 

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

 

Αλλά το να τσακονεσε με τον ημίθεο; Ε αυτό είναι πάτος.

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

 

Επίσης, που είναι γραμμένο πως όποτε του ταβλώσει του defacer, του ημίθεου ή όποιου άλλου είμαι υποχρεωμένος να γράφω σεντόνια; Δόξα το Θεό υπάρχουν βιβλία (ηλεκτρονικά και μη), φροντιστήρια, σχολές, και γενικώς πληθώρα πηγών για να επιμορφωθεί όποιος πραγματικά ενδιαφέρεται.

 

 

 

Στο δια ταύτα, δεν είδα κανέναν από τους συνομιλητές στο νήμα (σοβαρούς και μη) να σχολιάζουν για παράδειγμα το κατά περίπτωση πλεονέκτημα των nul-terminated strings που παρέθεσα, δηλαδή του να μπορείς να κάνεις in-place tokenization (το οποίο btw έχει σχέση και με το immutability) . Οπότε για ποια σοβαρότητα μιλάς;

 

Άντε να παραθέσω και άλλο ένα κατά περίπτωση πλεονέκτημα των nul-terminated strings, δηλαδή κάτι σαν κι αυτό:

char s[] = "   \tPlease trim me in-place";
char *trimmed = s;
while ( isblank(*trimmed) ) {
    trimmed++;
}
puts( trimmed );

Ή κάτι σαν αυτό...

char validfullname[] = "balbalablabla/blabla/name.ext"
char *name = NULL, *cp = NULL;
if ( NULL == (cp=strrchr(validfullname, '/') ) {
   puts( "invalid fullpath" );
}
else {
   name = cp+1;
   
}

Άντε να αναφέρω και ότι στα nul-terminated strings δεν υπάρχει ούτε κρυφό indirection, ούτε κρυφές μεταβλητές, ούτε κρυφές δεσμεύσεις μνήμης.

 

Μπορώ να συνεχίσω, αλλά ποιο το νόημα; Θα βγουν τουλάχιστον κάνα-δυο-τρεις και θα αρχίσουν τα όμορφα περί τετράγωνων τροχών (όπου κλασικά θα αγνοήσουν το "κατά περίπτωση" και θα προσπαθήσουν να μας πείσουν πως υπάρχει μια και μοναδική αλήθεια... κάτι σαν το ΣΩΣΤΟ string ένα πράγμα, λες και η πληροφορική και ο προγραμματισμός είναι ομοιογενείς τομείς).

 

ΥΓ. If you can't connect the dots, you simply can't connect the dots. Και κατά τη δική μου γνώμη δεν είναι σοφό να ποντάρεις σε γενικά φόρουμς για να μάθεις πως να συνδέεις τις κουκκίδες. Οι σχολές, τα βιβλία και τα manuals είναι πάντα κατά την άποψή μου καλύτερες πηγές.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δε θέλω να τοποθετηθώ περί των παραπάνω. Απλά θα ήθελα να συνεχίσουμε την κουβέντα για τα nul-terminated strings.

 

Δεν έχω μεγάλη εμπειρία με τον προγραμματισμό, οπότε, το αρνητικό που βλέπω στα C strings είναι το nul. Αν κάποιος το ξεχάσει, τότε θα υπάρχουν προβλήματα με όλες τις συναρτήσεις που το χρησιμοποιούν. Και αυτό γιατί κατα 99% των περιπτώσεων, το nul είναι στη τερματική συνθήκη. Σπάνια είναι το μήκος και κάποια άλλη σύμβαση.

 

Αλλά και πάλι, έτσι είναι όλη η ιδεολογία της C γενικά και όχι μόνο τα strings.

 

Ποια μπορεί να είναι άλλα αρνητικά τους;

 

UPDATE:

Εδώ βρήκα αρκετά αρνητικά, αλλά και αρκετά θετικά των c-strings. Επίσης υπάρχει και ο λόγος για τον οποίο έγιναν nul-terminated.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Απο την δικη μου εμπειρία μεχρις τωρα, η C μου είναι χρήσιμη όταν διαβαζω τα patch στο linux. Καταλαβαίνω γιατί και πως φτιάχνουν τα bugs, και βλέπω μπροστά μου ακριβώς τι συμβαίνει και ποιο ήταν το πρόβλημα. Απο κει και πέρα, για προσωπική χρήση, χρησιμοποιώ bash για scripting ενώ δηλώνω ερωτευμένος με την Python. Θα σου πρότεινα να ξεκινήσεις με Python, και όσον αφορά του αλγορίθμους (σε περιπτωση που σε ενδιαφερουν) αγόρασε το βιβλίο: http://www.manning.com/bhargava/

 Μιας κ γνωριζεις και τις 2 γλωσσες εσυ η οποιος αλλος εχει χρονο θα ηταν ενδιαφερον να εκανε port σε C αυτον τον daemon ( https://github.com/gkarakou/systemd-mailify ) που ειναι σε python για να δουμε τη διαφορα σε memory footprint αναμεσα στις 2 γλωσσες.

Έτσι για το ακαδημαικό της υπόθεσης αλλά και για να δούμε πόσο χρονο θα πάρει. Σε python μου πήρε λίγο καιρό πάνω-κάτω 1-2 εβδομάδες άλλα είχα την εμπειρία απο το systemd-denotify που μου πήρε παραπάνω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν ισχυρίστηκα ποτέ ότι έχω τις σούπερ-ουάου γνώσεις αλλά είμαι πια τόσο άσχετος που όταν τσακώνεται κάποιος μαζί μου έφτασε στον πάτο ? :)Τέσπα ξαναμπαίνω στη σπηλιά μου γιατί αρκετά ξεφύγαμε από το θέμα.

Χαχα. Εννοώ οτι εισαι ευγενεστατος.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλημέρα στη παρέα!
Φιλαράκι με τα λίγα που ξέρω και έχω ζήσει στο θέμα της C είναι ότι αν ξέρεις C μπορείς μετά να καταλάβεις εύκολα οποιαδήποτε γλώσσα… (τις περισσότερες).
Δηλαδή καταλαβαίνεις  την δομή απλά αλλάζει η σύνταξη.

 

Ναι οι C έχει δείκτες και είναι ένα σημαντικό κεφάλαιο, έχεις προσπέλαση στη μνήμη οπότε αν κάνεις καμιά μαλακία ίσως και να κάνεις ζημιά.. Θα μπερδευτείς, αλλά όταν τους εμπεδώσεις θα συνεχίσεις πιο δυναμικά.
Αλλά αφού ξεκινάς τώρα θα αργήσεις να κάνεις ζημιά!

 

Είδα ότι σου πρότειναν την python, πολύ καλή γλώσσα αντικειμενοστραφή και ότι πρέπει να προγράμματα αναζητήσεις!
Και η Java είναι καλή! Μπορείς να κάνεις παπάδες και να την δουλεύεις σε όποιο λειτουργικό θες, αλλά αν κάνεις πολλές γραμμές κώδικα και κάνεις το ίδιο και στη c++ θα δεις τότε ταχύτητες.. Η C++ να είναι πιο γρήγορή αλλά αν κάνεις το compile στα Windows σε Linux δε τρέχει…

 

Όπως κατάλαβες όλες οι γλώσσες έχουν τα θετικά τους και τα αρνητικά τους…
Και ένα άτομο που δουλεύει την C θα σου πει C, ο Java-ς την java κτλ.
Ο προγραμματισμός είναι πάνω κάτω σα να διαλέγεις λάπτοπ.. εξαρτάται για τι δουλειά το θες…

 

Εγώ θα σου πρότεινα την C και μετά C++,C#,Java,PHP… γιατί?
Γιατί σε σχέση με τις άλλες έχει πιο λίγες βιβλιοθήκες και αυτό θα πει ότι για κάποια πράγματα θα πρέπει να φτιάξεις δικές σου συναρτήσεις και έτσι θα σε βάλει να ψαχτείς λίγο παραπάνω. Εκτός αν θέλεις ετοιματζίδικα που σε αυτό δεν θα σε βοηθήσει.

 

Αυτά από μένα, αυτή είναι η ταπεινή μου γνώμη! :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλημέρα στη παρέα!

Καλημέρα φίλε μου και καλώς ήρθες στο φόρουμ.

 

Φιλαράκι με τα λίγα που ξέρω και έχω ζήσει στο θέμα της C είναι ότι αν ξέρεις C μπορείς μετά να καταλάβεις εύκολα οποιαδήποτε γλώσσα… (τις περισσότερες).

Δηλαδή καταλαβαίνεις  την δομή απλά αλλάζει η σύνταξη.

Όχι απαραίτητα γιατί υπάρχουν διαφορετικοί τρόποι σκέψης και υλοποίησης. Όπως αναφέρθηκε και σε προηγούμενο μήνυμα, αν ξέρεις C δεν σημαίνει ότι αυτόματα με το που θα δεις κάτι object-oriented θα το καταλάβεις.

 

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

 

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

 

Ναι οι C έχει δείκτες και είναι ένα σημαντικό κεφάλαιο, έχεις προσπέλαση στη μνήμη οπότε αν κάνεις καμιά μαλακία ίσως και να κάνεις ζημιά.. Θα μπερδευτείς, αλλά όταν τους εμπεδώσεις θα συνεχίσεις πιο δυναμικά.

Αλλά αφού ξεκινάς τώρα θα αργήσεις να κάνεις ζημιά!

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

 

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

 

Στα πρώτα κεφάλαια της C θα γράφεις βαρετές ασκήσεις τύπου

printf("Dose onoma\n")
scanf("%s", &name)    (πχ Nikos)
printf("Geia soy %s\n", name) (πχ Geia soy Nikos)
και μέχρι να πας στο κεφάλαιο των πινάκων θα γράφεις ασκήσεις με 100 μεταβλητές τύπου

int a1, a2, a3, a4;
a1 = 2;
a2 = 6;
a3 = a2 / a1;
κτλ
με αποτέλεσμα να σκυλοβαρεθείς και να θες να την παρατήσεις.

 

Η python αντίθετα υποστηρίζει πάρα πολλά πράγματα (όπως πχ να γράψεις ένα tcp server με 3 γραμμές αντί για 150 σε C) και έτσι οι ασκήσεις είναι πιο ενδιαφέρουσες.

 

 

 

Ο πιο ευκολονόητος παραλληλισμός που μπορώ να κάνω είναι με την εκμάθηση τυφλού συστήματος. Αν τρέξεις οποιοδήποτε πρόγραμμα εκμάθησης της διάταξης qwerty, θα δεις ότι στις πρώτες ασκήσεις σε βάζουν να πατάς συνέχεια jjjjjj dddddd κτλ γιατί η διάταξη είναι χάλια. Έτσι πολύς κόσμος βαριέται και σταματάει την εκμάθηση.

 

Αντίθετα στις διατάξεις dvorak, colemak που έχουν πολύ καλύτερη κατανομή, μπορείς να γράψεις λέξεις από την πρώτη κιόλας άσκηση. Αυτό σου κρατάει το ενδιαφέρον και δεν σε κάνει να βαριέσαι.

 

 

 

Εγώ θα σου πρότεινα την C και μετά C++,C#,Java,PHP… γιατί?

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

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

 

Και ένα άτομο που δουλεύει την C θα σου πει C, ο Java-ς την java κτλ.

Δεν ισχύει αυτό. Εγώ δουλεύω μόνο C και η μόνη χρήση που έχω κάνει σε python είναι σε scripting για αυτοματοποιήσω κάποιες δουλειές και εκείνο σπάνια γιατί προτιμώ την perl για αυτό. Παρόλα αυτά ήμουν ο πρώτος στο νήμα που πρότεινα python :)

 

Να μάθει έννοιες και αλγορίθμους και γενικά να μάθει σκέφτεται σωστά και μετά θα μπορεί να δουλέψει όλες τις γλώσσες. Αν ήταν δυνατόν να τα μάθει αυτά χωρίς να χρειάζεται να τα δοκιμάσει σε κάποια γλώσσα δεν θα πρότεινα ούτε καν την python :P αλλά θα χρειαστεί να κάνει εξάσκηση κάπου.

 

Κανένας δεν αγαπάει την C περισσότερο από εμένα (καλά λέμε τώρα) αλλά δεν νομίζω ότι υπάρχει κάποιος λόγος να προτείνω σε κάποιον εν έτει 2015 να αρχίσει με C γιατί 99% δεν θα μάθει να προγραμματίζει σωστά. Και αν πιστεύεις το αντίθετο, μπορείς να μου πεις τι γνωρίζεις περί undefined behavior ? Γράψε μας σε παρακαλώ 3 από τους καλύτερους κώδικές σου σε C και πάω στοίχημα ότι θα σου βρούμε 15 περιπτώσεις από unspecified / undefined behavior.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

UPDATE:

Εδώ βρήκα αρκετά αρνητικά, αλλά και αρκετά θετικά των c-strings. Επίσης υπάρχει και ο λόγος για τον οποίο έγιναν nul-terminated.

 

Απλώς να συμπληρώσω πως το λινκ που βρήκες συγκρίνει nul-terminated (cstrings) με length-prefixed (pascal-strings) strings. Υπάρχουν πολλές ακόμα υλοποιήσεις, αλλά το βασικό (κατά τη γνώμη μου) που πρέπει να θυμάται κανείς όχι μόνο στα strings αλλά σχεδόν για όλα, είναι πως there is no free lunch... (δηλαδή με άλλα λόγια "choose the right tool for the job").

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

(δηλαδή με άλλα λόγια "choose the right tool for the job").

Κανείς δεν διαφωνεί με αυτό. Δεν μιλάμε όμως για ένα embedded σύστημα με λίγη μνήμη ή για κάτι που θέλει την πιο γρήγορη υλοποίηση. Εκεί έγκειται η διαφωνία μας ότι για κάποιον που θέλει να μάθει προγραμματισμό, _δεν_ είναι το right tool.

 

Κάποιος που μαθαίνει τώρα προγραμματισμό δεν τον νοιάζει αν το string της java δεσμεύει διπλή μνήμη από ό,τι χρειάζεται για το τρέχον περιεχόμενο ή αν τρέχει 10 syscalls παραπάνω από ότι κάνει η C.

 

Δε θέλω να τοποθετηθώ περί των παραπάνω. Απλά θα ήθελα να συνεχίσουμε την κουβέντα για τα nul-terminated strings.

 

Ποια μπορεί να είναι άλλα αρνητικά τους;

 

UPDATE:

Εδώ βρήκα αρκετά αρνητικά, αλλά και αρκετά θετικά των c-strings. Επίσης υπάρχει και ο λόγος για τον οποίο έγιναν nul-terminated.

Το μεγάλο αρνητικό για εμένα είναι ότι δεν υπάρχει string. Το ότι όλοι τα λένε strings ίσως κάνει κακό γιατί μπερδεύει ένα νέο στο προγραμματισμό. Η αλήθεια είναι ότι η C δεν έχει strings αλλά δείκτες σε char. Αυτό επιφέρει ένα κάρο αρνητικά και σπάει όλα όσα θα περίμενε ένας που μαθαίνει τώρα.

 

* Δεν μπορείς να γράψεις (if s1 == s2) γιατί συγκρίνεις την διεύθυνση των δεικτών και όχι το περιεχόμενο.

 

* Δεν μπορείς να γράψεις s2 = s1 ή s = s1 + s2.

#include <stdio.h>

struct kk {
	int i;
	char s[30];
};

int main(void)
{
	char s1[10] = "Hello";
	char s2[10];
	struct kk k1 = { 5, "Tria poylakia" }, k2;

	// s2 = s1;   Error

	k2 = k1;
	printf("i = %d, s = %s\n", k2.i, k2.s);
	return 0;
}
Ειδικά όταν πάει κάποιος στο κεφάλαιο των δομών και δει το παραπάνω τραβάει τα μαλλιά του. Μπορείς να κάνεις ανάθεση μια ολόκληρη δομή σε μία άλλη. Αν αυτή δε, περιέχει κάποιο "string", τότε η ανάθεση πετυχαίνει μια χαρά.

 

Tα παραπάνω δεν έχουν σχέση με το αν είναι nul terminated ή όχι αλλά ότι είναι δείκτες. Το κακό της υλοποίησης με nul-termination είναι δεν μπορείς να ελέγξεις την ορθότητά τους.

 

Έχεις μια συνάρτηση που δέχεται σαν είσοδο ένα "string" και θέλεις πριν να το μεταχειριστείς να δεις αν είναι σωστό (ή αν το buffer σου επαρκεί ή ποιος ξέρει τι). Πώς θα το κάνεις αυτό ? Θα πρέπει να διατρέξεις όλο το string μέχρι να βρεις το \0. Δεν ξέρεις όμως αν εκεί τελειώνει το string που έδωσε ο caller ή αν ο caller ξέχασε να βάλει το \0 (ή έγινε truncation λόγω λάθος malloc) και αυτό το \0 που βρήκες δεν βρέθηκε συμπτωματικά κάπου στη μνήμη πιο πέρα.

 

Αυτό είναι για εμένα το μεγαλύτερο αρνητικό τους. Έπειτα έχουμε τα προβλήματα απόδοσης πάλι επειδή πρέπει να διατρέξουμε όλο το string. Η strlen είναι πολύ αργή. Αν πας να ενώσεις τα string "o gon1332", " είναι ψηλός", θα πρέπει η strcat να διατρέξει όλο το string. Αν μετά πας να προσθέσεις και το string " και έξυπνος" θα πρέπει να ξανά διατρέξει όλο το "o gon1332 είναι ψηλός". Κάποιος θα πει ότι αυτό είναι πρόβλημα της strcat που επιστρέφει δείκτη στην αρχή του ενωμένου string και όχι στο τέλος όπως θα ήταν και το βολικό. Θα έχει δίκιο αλλά το όλο πρόβλημα δημιουργείται από την υλοποίηση με nul.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σας ευχαριστω ολους και παλι για τις απαντησεις αν και αισθανομαι λιγο πιο μπερδεμενος απο πριν με ολα αυτα...τελος παντων...Θα ηθελα ν ζητησω και μια γνωμη εδω περα http://www.insomnia.gr/topic/575771-%CF%80%CE%BB%CE%B7%CF%81%CE%BF%CF%86%CE%BF%CF%81%CE%B9%CE%BA%CE%B7-%CE%BA%CE%B5%CF%81%CE%BA%CF%85%CF%81%CE%B1-%CE%BA%CE%B1%CE%B9-%CE%BB%CE%B1%CE%BC%CE%B9%CE%B1/μιας και ηρθε η ωρα για μηχανογραφικο...:)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

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