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

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

Δημοσ.

Καλησπέρα παιδιά. Ψάχνω να βρω να αγοράσω ένα βιβλίο για γλώσσα c. Ξέρω τα βασικά πίνακες,δείκτες, δομές επανάληψης και ελέγχου τα οποία έχω διαβάσει ιντερνετικά αλλά θέλω να εμβαθύνω. Βρήκα αυτό εδώ το βιβλίο http://www.public.gr/product/books/greek-books/computer-science/programming/i-glossa-c-se-bathos/prod1073527pp/Είναι καλό; το έχει πάρει κανείς; ή να πάω σε αγγλική βιβλιογραφία και να κοιτάξω και στο amazon. Όλες οι προτάσεις δεκτές.

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

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

Δημοφιλείς Ημέρες

Δημοσ.

Καλησπέρα παιδιά. Ψάχνω να βρω να αγοράσω ένα βιβλίο για γλώσσα c. Ξέρω τα βασικά πίνακες,δείκτες, δομές επανάληψης και ελέγχου τα οποία έχω διαβάσει ιντερνετικά αλλά θέλω να εμβαθύνω. Βρήκα αυτό εδώ το βιβλίο http://www.public.gr/product/books/greek-books/computer-science/programming/i-glossa-c-se-bathos/prod1073527pp/Είναι καλό; το έχει πάρει κανείς; ή να πάω σε αγγλική βιβλιογραφία και να κοιτάξω και στο amazon. Όλες οι προτάσεις δεκτές.

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

Δεν χρειάστηκε βασικά, οι εργαστηριακές ασκήσεις με κάλυψαν πλήρως.

Δημοσ.

υποθετω το βασικο βιβλιο του richie το εχεις ετσι.... κατα τα αλλα και τα δυο που προτειναν οι αποπανω καλα ειναι . 

  • Like 1
Δημοσ.

Καλησπέρα παιδιά. Ψάχνω να βρω να αγοράσω ένα βιβλίο για γλώσσα c. Ξέρω τα βασικά πίνακες,δείκτες, δομές επανάληψης και ελέγχου τα οποία έχω διαβάσει ιντερνετικά αλλά θέλω να εμβαθύνω. Βρήκα αυτό εδώ το βιβλίο http://www.public.gr/product/books/greek-books/computer-science/programming/i-glossa-c-se-bathos/prod1073527pp/Είναι καλό; το έχει πάρει κανείς; ή να πάω σε αγγλική βιβλιογραφία και να κοιτάξω και στο amazon. Όλες οι προτάσεις δεκτές.

Αν θέλεις οπωσδήποτε να ασχοληθείς με C και όχι με μία άλλη γλώσσα, τότε

 

http://www.amazon.co.uk/C-Programming-Modern-Approach-K-King/dp/0393979504/ref=sr_1_2?s=books&ie=UTF8&qid=1454359006&sr=1-2&keywords=king

 

λίγο τσιμπημένη τιμή αλλά από τα καλύτερα και πληρέστερα που υπάρχουν.

  • Like 1
Δημοσ.

Θα συμφωνησω με τους προλαλησαντες."Η γλωσσα C σε βαθος" ειναι πολυ ωραιο και τα λεει ξεκαθαρα.

Το Modern approach ειναι επισης εξαιρετικο βιβλιο!!

 

Για το τελευταιο, θα βρεις στο site του τις λυσεις, μονο απο συγκεκριμενες ασκησεις του βιβλίου. Με λιγο ψαξιμο στο github ομως, θα βρεις τις λυσεις περισσοτερων ασκησεων !

 

Τα εχω και τα δυο και μπορω να στα συστησω!

  • Like 1
Δημοσ.

υποθετω το βασικο βιβλιο του richie το εχεις ετσι.... κατα τα αλλα και τα δυο που προτειναν οι αποπανω καλα ειναι .

Όχι δεν το ξέρω. Ποιο είναι; αυτός να φανταστώ έχει φτιάξει την γλώσσα;

 

Το ότι έκδοση του 2008 παίζει κάποιο ρόλο; έχει αλλάξει τίποτα στην γλώσσα;

Δημοσ.

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

Δημοσ.

Όχι δεν το ξέρω. Ποιο είναι; αυτός να φανταστώ έχει φτιάξει την γλώσσα;

 

 

Το ότι έκδοση του 2008 παίζει κάποιο ρόλο; έχει αλλάξει τίποτα στην γλώσσα;

 

Ναι έχουν αλλαξει κάποια πραγματα αλλα οχι τα βασικά της γλώσσας. Οι λεγομενες αναθεωρήσεις. Το βιβλιο παρουσιαζει και την C99 αναθεώρηση αλλα ειχαμε και την C11.

Δημοσ.

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

 

Για κανένα λόγο. Πάρε από bookdepository.

Δημοσ.

Το βιβλίο των K&R που αναφέρθηκε πριν, να το διαβάσεις πολύ πιο μετά. Μην το πάρεις για να μάθεις γιατί δεν είναι διδακτικό βιβλίο αλλά πιο πολύ ευρετήριο για να ανατρέχεις όταν θέλεις κάτι.

 

Βρήκα αυτό εδώ το βιβλίο http://www.public.gr/product/books/greek-books/computer-science/programming/i-glossa-c-se-bathos/prod1073527pp/Είναι καλό; το έχει πάρει κανείς; ή να πάω σε αγγλική βιβλιογραφία και να κοιτάξω και στο amazon. Όλες οι προτάσεις δεκτές.

Θα συμφωνησω με τους προλαλησαντες."Η γλωσσα C σε βαθος" ειναι πολυ ωραιο και τα λεει ξεκαθαρα.

Σε περίπτωση που προτιμήσεις το "Η γλώσσα C σε βάθος", να αναφέρω κάποια nitpicks που ίσως ενδιαφέρει κάποιον να σημειώσει. Είχαμε επικοινωνήσει παλαιότερα με τον συγγραφέα και ήταν δεκτικός στο να αλλάξει κάποιες φράσεις. Κάποιες άλλες δεν μπορούσαν να αλλαχθούν επειδή είχε ήδη πάει η 4η έκδοση στον εκδοτικό οίκο ή επειδή δεν θεωρούσε ότι έχουν νόημα από διδακτική άποψη.

 

Ίσως όντως να είναι ασήμαντες λεπτομέρειες που να μην χρειάζονται σε ένα αρχάριο αλλά είμαι τιτίζης και σκάω όταν τα διαβάζω :P

 

 

 

Η συνάρτηση rand() δεν δέχεται παραμέτρους και επιστρέφει ως τιμή ένα τυχαίο ακέραιο αριθμό, από το 0 μέχρι το 32767.

Για την ακρίβεια επιστρέφει μέχρι RAND_MAX του οποίου η τιμή ποικίλει ανάλογα με το σύστημα. Σε κάποιο σύστημα (πχ σε 16bit DOS) μπορεί όντως να είναι 32767 αλλά δεν ισχύει πάντα. Συνήθως έχει ίδιο εύρος με αυτό του τύπου int χωρίς και αυτό να είναι σίγουρο.

 

Linux GLIBC
/* The largest number rand will return (same as INT_MAX).  */                   
#define RAND_MAX        2147483647

FreeBSD LIBC
#define RAND_MAX 0x7ffffffd

NetBSD LIBC
#define	RAND_MAX	0x7fffffff

Συχνά λάθη:

Ξεχνάμε να δηλώσουμε τη main() ως τύπου int και να βάλουμε την εντολή return 0. Αυτό είναι τυπικό (σύμφωνα με το πρότυπο C99) και όχι ουσιαστικό λάθος. Αρκετοί μεταγλωττιστές δεν θα έχουν πρόβλημα.

Σαν νόημα είναι απολύτως σωστό και καλά κάνει ότι πολλοί compilers μπορεί να είναι επιεικείς και να επιτρέπουν διάφορα πράγματα. Θα μου άρεσε ίσως να τονιστεί ότι παρότι επιτρέπεται από τον compiler, πρέπει να αποθαρρύνεται σαν πρακτική.

 

Η συνάρτηση exit()

 

#include <stdio.h>

int main(void)

...

Δεν αναφέρεται το αρχείο κεφαλίδας stdlib.h στο οποίο ορίζεται η συνάρτηση exit.

 

η x = x * 5 μπορεί να γραφεί και ως x *= 5. Παρά το γεγονός ότι δεν συνιστάται η χρήση αυτών, ......

Γιατί δεν συνιστάται ? Μια χαρά εκφράσεις είναι χωρίς κανένα πρόβλημα.

 

Οι εκφράσεις που μπορούσαν να οδηγήσουν σε πρόβλημα ήτανε μια παραπλήσια γραφή που επιτρεπόταν μόνο σε πάρα πολύ παλιές εκδόσεις της C.

 

Προτεραιότητα τελεστών

Ο πίνακας θα μπορούσε να είναι πιο πλήρης. Του λείπουν κάποιοι τελεστές.

 

Επεξήγηση 11

Κάθε χαρακτήρας μετατρέπεται σε έναν ακέραιο αριθμό ... Το πρότυπο αυτό ονομάζεται ASCII.

Πρακτικά ναι, θα είναι σχεδόν παντού το πρότυπο ASCII. Κανένας όμως δεν εμποδίζει την υλοποίηση να χρησιμοποιήσει utf-16, ebcdic ή όποιο άλλο πρότυπο θέλει.

 

Οι μεταβλητές τύπου char δεσμεύουν 1 byte (8bit). Στην μεταβλητή αποθηκεύεται ο κωδικός ASCII του χαρακτήρα.

1) Δες τι είπαμε πριν για το ASCII

2) Στην C, η λέξη byte έχει μια λίγο διαφορετική έννοια από αυτό που έχουμε συνηθίσει. Μπορεί 1 byte να υλοποιείται ως 12 bit ή 16 bit ή οτιδήποτε άλλο μεγαλύτερο του 8. Μόνο το πρότυπο POSIX εγγυάται ότι θα έχουμε 8 bits. Πρακτικά όμως θα είναι όντως 8.

 

Όταν είμασταν στο δημοτικό, μας είπανε ότι οι αριθμοί ξεκινάνε από το μηδέν και πηγαίνουν 1, 2, κτλ. Μετά μας είπανε ότι υπάρχουν και αρνητικοί και πιο μετά ότι υπάρχουν και κλάσματα, κτλ.

 

Όταν κάποιος μαθαίνει για πρώτη φορά, δεν μπορείς να του πετάξεις ένα κάρο εσωτερικές λεπτομέρειες και να του κάνεις το κεφάλι καζάνι. Θα γράψεις κάτι που είναι μεν ανακριβές αλλά είναι εύκολο να το κατανοήσει. Αυτό που μπορεί να γίνει όμως, είναι στο τέλος να έχεις ένα κεφάλαιο που να αναλύει αυτά τα θέματα και να λέει "κοίταξε, αυτό που είπαμε στο κεφάλαιο 1 δεν ισχύει πάντα αλλά υπάρχουν αυτές οι παραλλαγές". Αυτό γίνεται και στο βιβλίο του King.

 

putchar(ch)

Η παράμετρος ch πρέπει να είναι τύπου char ή τύπου int

Όχι char αλλά μόνο int πρέπει να είναι. Με char μπορεί να έχεις προβλήματα.

 

Η συνάρτηση getch()

Η συνάρτηση getch δεν είναι πρότυπη και δεν υπάρχει σε όλες τις υλοποιήσεις.

 

char ch1, ch2;

Πρέπει να οριστούν ως int λόγω αυτού που είπαμε πριν. Και σε άλλες σελίδες υπάρχουν τέτοιοι ορισμοί.

 

while (ch!=32)

Το σωστό είναι (ch != ' ') αντί για 32.

 

 

void test(float a, float 
int main(void)
{
int x=10, y=8;
test(x,y);
return 0;
}
Αν την καλέσουμε με τον παραπάνω τρόπο, πιθανώς (ανάλογα με τον compiler που χρησιμοποιούμε) να έχουμε λάθος αποτελέσματα. Ο λόγος είναι ότι η test() περιμένει δύο τιμές τύπου float, .....

 

Μετά η συνάρτηση καλείται ως "test((float)x, (float)y)". Δεν μπορώ να καταλάβω γιατί θα έχουμε λάθος αποτελέσματα. Εκτός από το explicit type casting δηλαδή αυτό που λες εσύ στον compiler τι τύπο θέλεις να θεωρηθεί ότι έχει η μεταβλητή, υπάρχει και το implicit type casting δηλαδή στην έκφραση test(x,y) ο compiler αυτόματα θα μετατρέψει τις μεταβλητές και θα παίξει σωστά. Η επόμενη σελίδα μάλιστα αναφέρει την αυτόματη μετατροπή τύπων.

 

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

 

Το μέγεθος μια μεταβλητής δείκτη δεν εξαρτάται από τον τύπο .... Όλες οι μεταβλητές δείκτη .... (int, float, κ.λ.π.), έχουν το ίδιο ακριβώς μέγεθος.

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

 

 

 

 

... Δεν με αφήνει να βάλω άλλα quotes οπότε συνεχίζω σε λίγο σε άλλο post ...

 

 

 

  • Like 4
Δημοσ.
while( ch!=32 )

Συμφωνώ πανω κατω με αυτα που έγραψε και ο ημιθεος , εγω ισως να μην ήμουν τοσο ψειρας σε ολα αλλα το παραπανω ειδικά μου "εβγαλε" το μάτι. Απο ποτε ειμαι εγω υποχρεωμένος να θυμάμαι "απεξω" με το που διαβαζω έναν κώδικα οτι ο αριθμητικος κωδικος 32 αντιστοιχει συμφωνα με το ASCII στον space χαρακτηρα?!

Δημοσ.

 

 

 

Η πρόταση (*p)++ σημαίνει: αύξησε κατά ένα τη θέση μνήμης στην οποία "δείχνει" ο δείκτης p. Στη συγκεκριμένη περίπτωση ... οπότε η τιμή της a από 9 θα γίνει 10.

Εδώ ξέφυγε μία λέξη που όμως είναι πολύ σημαντική και θα μπερδέψει τον αναγνώστη. Θα πρέπει να γίνει "αύξησε κατά ένα την τιμή της θέσης μνήμης" το οποίο φαίνεται και από την επόμενη φράση που λέει ότι η τιμή της μεταβλητής a θα γίνει 10. Ο δείκτης δηλαδή θα συνεχίσει να δείχνει στην ίδια θέση μνήμης (στο a) και θα αυξηθεί η τιμή.

 

Ο δείκτης null (null pointer) είναι ένας δείκτης με τιμή NULL, η οποία ορίζεται μέσα στο stdio.h

Το σωστό αρχείο κεφαλίδας είναι το stddef.h και όχι το stdio (στις περισσότερες υλοποιήσεις, μέσα στο stdio καλείται και το stddef οπότε θα παίξει ο κώδικας και με το stdio αλλά παρόλα αυτά είναι λάθος σαν δήλωση). Ακριβώς το ίδιο υπάρχει και στην ανασκόπηση στη σελίδα 291.

 

int* p1, p2; Οι μεταβλητές p1 και p2 δηλώνονται ως δείκτες σε int!

Αυτό είναι ένα από τα συχνά λάθη που γίνονται. Το γεγονός ότι ο αστερίσκος μπήκε δίπλα στο int δεν σημαίνει ότι ορίζονται δύο δείκτες. Μόνο η μεταβλητή p1 είναι δείκτης σε int ενώς η p2 είναι απλός ακέραιος int και όχι δείκτης. Ακριβώς το ίδιο υπάρχει και στην ανασκόπηση στη σελίδα 290.

 

Ο δείκτης a δεν είναι ένας απλός δείκτης αλλά ένας δείκτης σε δείκτες τύπου int!

Η a ορίζεται ως int a[4][3] οπότε είναι ένας πίνακας και όχι δείκτης. Σε κάποιες εκφράσεις αυτό θα μετατραπεί σε δείκτης σε πίνακα 3 int και όχι σε διπλό δείκτη.

 

 

Θα πρέπει να χρησιμοποιήσουμε τη συνάρτηση gets() στην οποία θα αναφερθούμε αργότερα.

Καλό είναι να μην χρησιμοποιείται η gets.

 

int strlen(char *str)

.

.

.

int len;

len = strlen(pp);

 

 

char *strcpy(char *str1, *str2)

Η strlen επιστρέφει size_t και όχι int. Στο παρόν πρόγραμμα που χρησιμοποιείται ως παράδειγμα εννοείται ότι και με int δεν υπάρχει κανένα πρόβλημα αλλά γενικά έχε το υπόψιν σου. Αυτός ήταν ένας από τους κυριότερους λόγους που προγράμματα που έπαιζαν σε 32bit άρχισαν να βγάζουν προβλήματα όταν έτρεξαν σε 64bit.

 

Το ίδιο υπάρχει και σε άλλες δηλώσεις όπως πχ στην δήλωση της malloc στη σελίδα 507.

 

Η δήλωση της strcpy έτσι όπως δίνεται είναι μπερδευτική γιατί δεν ξέρεις ποιο αντιγράφεται που. Μια πιο βολική δήλωση θα μπορούσε να είναι strcpy(char *dest, char *src).

 

Η καταχώρηση ενός συγκεκριμένου συνόλου χαρακτήρων μέσα σε ένα πίνακα μπορεί να γίνει μόνο με την strcpy(). Ένας σύνηθες λάθος που γίνεται είναι η επόμενη πρόταση καταχώρισης μιας συμβολοσειράς σε έναν πίνακα:

 

char lex[10];
lex="Νίκος";
Η παραπάνω πρόταση καταχώρισης είναι λανθασμένη. Παρόλο που αρχικά φαίνεται να δουλεύει σωστά, είναι αιτία πολλών προβλημάτων που δύσκολα εντοπίζονται.

 

Δεν πρέπει να γίνεται σύγχυση με τη σωστή ....

char lex[10]="Νίκος";

 

Η συγκεκριμένη έκφραση δεν μπορεί καν να χρησιμοποιηθεί γιατί είναι λάθος και ο compiler θα βαρέσει. Αυτό που εννοούσε είναι το lex να έχει οριστεί ως δείκτης με char *lex; και όχι τώρα που είναι πίνακας. Σαν δείκτης όντως φαίνεται να δουλεύει αλλά είναι αιτία προβλημάτων. Αυτό φαίνεται και από την ανάγνωση της εξήγησης στην σελίδα 352.

 

Και τα τρία πεδία μαζί καταλαμβάνουν χώρο ενός byte (και μαίστα περισσεύουν 5 bit). Επομένως.... καταλαμβάνει χώρο 14 byte (1 + 1 + 4 + 8).

Πέρα από αυτό που είπαμε πριν ότι κανείς δεν εγγυάται το μέγεθος του int να είναι 4 και του double 8, δεν υπάρχει εγγύηση πώς θα υλοποιηθούν τα bitfields και επίσης στις δομές υπάρχουν padding bytes. Το πιο σύνηθως για την παραπάνω δομή είναι 16 bytes μέγεθος αλλά μπορεί να είναι ακόμη περισσότερο. Το ίδιο ισχύει και για τις επόμενες δομές.

 

Μετέπειτα στις unions δεν υπάρχει κάποια εξήγηση για το που χρησιμεύουν.

 

Επίσης, όταν η C γράφει σε ένα αρχείο κειμένου, ο χαρακτήρας αλλαγής γραμμής μετατρέπεται σε δύο χαρακτήρες .... 10 και 13.

Αυτό ισχύει μόνο σε Windows. MAC και *nix συμπεριφέρονται διαφορετικά.

 

Επίσης λίγο πιο κάτω στη σελίδα 414 που αναφέρεται η συνάρτηση fflush, πάλι ισχύει μόνο σε windows. Η πρότυπη fflush είναι εγγυημένη να δουλέψει μόνο σε output streams (δηλαδή μπακάλικα μπορείς να την χρησιμοποιήσεις με την printf αλλά όχι με την scanf).

 

Στην σελίδα 435 υπάρχει ένα παράδειγμα που χρησιμοποιεί την έκφραση fflush(stdin) το οποίο δεν είναι εγγυημένο να δουλεύει παντού.

 

14_read_text_file.c

Η μεταβλητή ch πρέπει να οριστεί ως int. Έπειτα χρησιμοποιείται στο while χωρίς να της έχει ανατεθεί τιμή οπότε αν τύχει από προηγούμενα σκουπίδια να έχει τιμή EOF δεν θα εκτελεστεί ο βρόχος καθόλου. Ακόμη με τον τρόπο που έχει γραφεί, θα εμφανίσει και το τελικό EOF (συνήθως -1) οπότε θα εμφανιστεί ένα σκουπίδι στο τέλος στην οθόνη.

 

Το ίδιο λάθος υπάρχει και στο παράδειγμα 14_char_count.c της σελίδας 419 με την χρήση της feof στο while

 

Επίσης στη σελίδα 420 αναφέρεται ότι "σε δυαδικό αρχείο, μπορεί να παρουσιαστεί ο χαρακτήρας EOF σαν κανονικό byte". Για αυτό το λόγο ορίζουμε ως int την μεταβλητή μας και όχι ως char ώστε να μην μπορεί να εμφανιστεί ποτέ (επίσης το EOF δεν είναι χαρακτήρας αλλά συμβολίζει μια κατάσταση).

 

fgets(char *str, int mikos, FILE *fp)

 

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

Διαβάζει μέχρι ένα λιγότερο από την τιμή της παραμέτρου mikos δηλαδή το πολύ (mikos - 1) χαρακτήρες.

 

Το αποτέλεσμα θα ήταν ίδιο αν η fread() δινόταν με άλλες παραμέτρους:

fread(grammata,1,1000,fp); ή

fread(grammata,500,2,fp); ή

fread(grammata,20,50,fp);

 

Και στις τρεις προηγούμενες περιπτώσεις θα διαβαστούν 1000 byte και θα καταχωριστούν στον πίνακα grammata.

Η συμπεριφορά της fread δεν θα είναι ακριβώς η ίδια σε αυτές τις περιπτώσεις. Αφενός υπάρχει το αυτονόητο ότι θα επιστραφεί διαφορετική τιμή επειδή η fread επιστρέφει τον αριθμό όχι των bytes αλλά των στοιχείων που διάβασε. Έτσι αν ζητήσουμε 1000 στοιχεία με μέγεθος 1 θα πάρουμε τιμή 1000 ενώ αν ζητήσουμε 1 στοιχείο με μέγεθος 1000 θα πάρουμε επιστροφή 1.

 

Αφετέρου υπάρχει μια ακόμη διαφοροποίηση και είναι όταν δεν υπάρχει αρκετή είσοδος. Αν μια είσοδος έχει μέγεθος 532 bytes και εμείς ζητήσουμε 1000 στοιχεία μεγέθους 1, η fread θα επιστρέψει τιμή 532 και θα αποθηκεύσει τα 532 αυτά bytes στην μεταβλητή μας. Αν όμως ζητήσουμε 1 στοιχείο μεγέθους 1000, τότε μπορεί κάλλιστα να μην αποθηκεύσει τίποτα στην μεταβλητή μας (αν και σχεδόν όλες οι υλοποιήσεις θα αποθηκεύσουν και πάλι τα 532 bytes).

 

Η τιμή της argc είναι τουλάχιστον 1, δεδομένου ότι στο πλήθος των παραμέτρων υπολογίζεται και το όνομα του προγράμματος.

Για τα προγράμματα που θα γράψει ο χρήστης είναι όντως έτσι. Γενικά δεν είναι απαραίτητο να ισχύει (πχ με την χρήση των exec* συναρτήσεων). Αυτό είναι αρκετά τιτίζικο το παραδέχομαι :)

 

meson = (apo+eos)/2;

Και αυτό είναι αρκετά τιτίζικο αλλά θα προτιμούσα ο κώδικας να γραφεί ως "meson = apo + (eos - apo) / 2;". Στο παρόν πρόγραμμα φυσικά δεν θα υπάρχει πρόβλημα αλλά γενικά αν χειριζόμαστε μεγάλο αριθμό δεδομένων μπορεί η έκφραση "apo+eos" να προκαλέσει υπερχείλιση.

 

p = (char *)malloc(8);

strcpy(p, "nikos");

p=realloc(p,12);

Αφενός δεν είναι καλό (σε C compilers) να μπαίνει το cast στην malloc και αφετέρου πάντα στην realloc πρέπει να χρησιμοποιείται κάποιος προσωρινός δείκτης αντί να θέτουμε κατευθείαν τιμή στον p.

 

 

 

Σίγουρα θα μου ξέφυγε κάτι αλλά στο περίπου έχουμε αυτά.

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...