Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 25 Φεβ 2012, 13:27

migf1 έγραψε:Εγώ κατά βάση προγραμματίζω σε Windows με "τουμπανιασμένο" Notepad++ (που στην ουσία είναι editor και όχι IDE, αλλά με το "τουμπάνιασμα" που του έχω κάνει συμπεριφέρεται εν πολλοίς ως IDE). Κάτι αντίστοιχο σε Linux είναι το Geany (υπάρχει και Windows version του) το οποίο και χρησιμοποιώ στο Linux. Debugging προσωπικά κάνω σε κονσόλα, χωρίς GUI, αλλά εκτός του ότι υπάρχουν GUI front-ends του gdb (π.χ. DDD, αρκετά παλιό πλέον) υπάρχουν crossplatform IDE με ενσωματωμένη υποστήριξη του gdb στον editor τους όπως π.χ. τα Code::Blocks, Netbeans, Eclipse.

Με εξαίρεση το Code::Blocks, τα άλλα 2 προσωπικά τα θεωρώ "bloatware" αλλά παρέχουν όντως πολλές & χρήσιμες αυτοματοποιήσεις. Υπάρχουν και linux specific IDEs, π.χ. το CodeLite, αλλά δεν τα έχω χρησιμοποιήσει ποτέ, οπότε δεν είμαι κατάλληλος να τα αξιολογήσω.

Καλώς. Οπότε θα μείνω με το Geany προς το παρών και θα δω στην πορεία αν με βολέψει κάτι άλλο.
Ευχαριστώ.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Φεβ 2012, 13:33

Δες και το CodeLite (το οποίο τελικά δεν είναι linux specific, είναι cross-platform). Μόλις το googlara και δείχνει πολύ καλό με 1η ματιά (ενσωματώνει και gdb support στον editor του): http://www.codelite.org/

ΥΓ. Αν κι εκείνο το Ubuntu 10.04 δεν μου χτυπάει και πολύ καλά... ίσως είναι ασύμβατο με 11.x
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Φεβ 2012, 14:09

Ηλία, και κάτι που μου ήρθε τώρα, σκεπτόμενος πως έγραψες ότι θα χρησιμοποιείς το mySCANF() που σου πρότεινα. Λοιπόν, αντί να το κάνεις copy σε κάθε σου κώδικα, μια μόνιμη λύση είναι να το βάλεις σε ένα ξεχωριστό header file, π.χ. myextras.h με το ακόλουθο περιεχόμενο:

Μορφοποιημένος Κώδικας: Επιλογή όλων
/*
* File: myextras.h
*/
#ifndef MY_EXTRAS_H /* inclusion Guard */
#define MY_EXTRAS_H

/* C99 specific macro, substituting scanf() */
#define mySCANF( ... ) \
do { \
char iNPutbUfFeR[1024+1] = {'\0'}; \
fgets( iNPutbUfFeR, 1024+1, stdin ); \
sscanf( iNPutbUfFeR, __VA_ARGS__ ); \
} while(0)


#endif /* #ifndef MY_EXTRAS_H */


Φτιάξε κατόπιν έναν φάκελο όπου θέλεις, όπου θα φυλάς τα δικά σου custom header files (όπως το myextras.h)... μπορείς να ονομάσεις τον φάκελο όπως θέλεις, π.χ: myInclude.

Όλοι οι C compilers σου δίνουν τη δυνατότητα να καθορίσεις φακέλους μέσα στους οποίους θα ψάχνουν για header (και για library) files, πέρα δηλαδή από τους δικούς τους στάνταρ φακέλους. Στον gcc το κάνεις με το flag -I (για libraries είναι -L).

Δηλαδή, αν έχεις φτιάξει π.χ. τον φάκελο: /usr/share/myInclude που περιέχει μέσα του το αρχείο myextras.h τότε γράφεις στους κώδικές σου...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include "myextras.h"
/* μπορείς πλέον να χρησιμοποιήσεις οτιδήποτε έχεις ορίσει μέσα στο myextras.h */
...

και κάνεις compile ως εξής:

Κώδικας: Επιλογή όλων

gcc myprog.c -I/usr/share/mhyInclude

Προφανώς μπορείς να ορίσεις κι άλλα πράγματα μέσα στο αρχείο myextras.h, ή/και να φτιάξεις κι άλλα δικά σου .h αρχεία.

ΥΓ. Φτιάξε κι ένα shell alias του gcc που να το αντικαθιστά π.χ. με "gcc $* -I/usr/share/myInclude" και γράφε εκείνο αντί για gcc στον φλοιό ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 25 Φεβ 2012, 14:34

Done! :clap:

Και μια απορία. Η 2η άσκηση σελ.71 ζητάει να πάρω έναν τριψήφιο αριθμό και να τον αντιστρέψω.

Η λύση του King:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
int n;

printf("Enter a three-digit number: ");
scanf("%d", &n);
printf("The reversal is: %d%d%d\n", n % 10, (n / 10) % 10, n / 100);

return 0;
}

Η δικιά μου:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
//#include "myextras.h"
#define mySCANF( ... ) \
do { \
char iNPutbUfFeR[1024+1] = {'\0'}; \
fgets( iNPutbUfFeR, 1024+1, stdin ); \
sscanf( iNPutbUfFeR, __VA_ARGS__ ); \
} while(0)

int main(void)
{
int a, b, c;

printf("Enter a three-digit number: ");
mySCANF("%1d%1d%1d", &a, &b, &c);

printf("The reversal is: %d%d%d\n", c, b, a);

return 0;
}

Υπάρχει κάποιος ιδιαίτερος λόγος να προτιμήσει κάποιος την πρώτη λύση; Μου φαίνεται λιγότερο ευανάγνωστη και πιο δυσνόητη.
Ή έχει να κάνει με το ότι εγώ δηλώνω 3 μεταβλητές ενώ αυτός μία; Είναι καλό να αποφεύγουμε την δήλωση μεταβλητών όσο μπορούμε;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Φεβ 2012, 14:47

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

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

ΥΓ. Ξέχασα πριν, τα διπλά εισαγωγικά αντί για τα < > στα #include, δηλώνουν στον compiler πως το εν λόγω header αρχείο πρέπει πρώτα να αναζητηθεί στον ίδιο φάκελο που υπάρχει και το .c αρχείο, κατόπιν σε διαδρομές που τυχόν έχουν προστεθεί με το flag -Ι και τέλος στους στάνταρ φακέλους του compiler. Αντίθετα, τα < > λένε στον compiler να αναζητήσει το εν λόγω header file μόνο στους δικούς του, στάνταρ φακέλους.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Φεβ 2012, 14:51

Ilias95 έγραψε:
Spoiler: show
Η δικιά μου:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
//#include "myextras.h"
#define mySCANF( ... ) \
do { \
char iNPutbUfFeR[1024+1] = {'\0'}; \
fgets( iNPutbUfFeR, 1024+1, stdin ); \
sscanf( iNPutbUfFeR, __VA_ARGS__ ); \
} while(0)

int main(void)
{
int a, b, c;

printf("Enter a three-digit number: ");
mySCANF("%1d%1d%1d", &a, &b, &c);

printf("The reversal is: %d%d%d\n", c, b, a);

return 0;
}

Δεν είμαι σίγουρος αν το έχεις απενεργοποιήσει συνειδητά ή κατά λάθος σε σχόλιο το // #include "myextras.h", αλλά αν το ενεργοποιήσεις, τότε δεν χρειάζεται να ορίσεις (ξανά) από κάτω του το mySCANF()... είναι ήδη ορισμένο μέσα στο αρχείο: myextras.h
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 25 Φεβ 2012, 14:57

migf1 έγραψε:Τώρα στην συγκεκριμένη άσκηση, το "λάθος" σου είναι πως ενώ σου ζητάει να διαβάσεις έναν αριθμό, εσύ διαβάζεις τρεις. Δεν είσαι δηλαδή συνεπής ως προς την εκφώνηση της συγκεκριμένης άσκησης ;) Επίσης παρεκλίνεις από την ουσία της, η οποία είναι να σε εξοικειώσει με τη χρήση των πράξεων / (διαίρεση) και % (υπόλοιπο διαίρεσης).
Έχεις δίκιο. Κοιτούσα το αποτέλεσμα, όντως παρέκκλινα.

migf1 έγραψε:Δεν είμαι σίγουρος αν το έχεις απενεργοποιήσει συνειδητά ή κατά λάθος σε σχόλιο το // #include "myextras.h", αλλά αν το ενεργοποιήσεις, τότε δεν χρειάζεται να ορίσεις (ξανά) από κάτω του το mySCANF()... είναι ήδη ορισμένο μέσα στο αρχείο: myextras.h

Συνειδητά το "απενεργοποίησα" ώστε να μπορεί να τρέξει οποιοσδήποτε τον κώδικα χωρίς να έχει το header file.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Φεβ 2012, 15:00

Ilias95 έγραψε:
...
Συνειδητά το "απενεργοποίησα" ώστε να μπορεί να τρέξει οποιοσδήποτε τον κώδικα χωρίς να έχει το header file.

Είσαι ωραίος! :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 25 Φεβ 2012, 15:03

Ilias95 έγραψε:
migf1 έγραψε:Τώρα στην συγκεκριμένη άσκηση, το "λάθος" σου είναι πως ενώ σου ζητάει να διαβάσεις έναν αριθμό, εσύ διαβάζεις τρεις. Δεν είσαι δηλαδή συνεπής ως προς την εκφώνηση της συγκεκριμένης άσκησης ;) Επίσης παρεκλίνεις από την ουσία της, η οποία είναι να σε εξοικειώσει με τη χρήση των πράξεων / (διαίρεση) και % (υπόλοιπο διαίρεσης).
Έχεις δίκιο. Κοιτούσα το αποτέλεσμα, όντως παρέκκλινα.

Το ακριβώς επόμενο project ζητάει να κάνω αυτό ακριβώς που έκανα ήδη. :mrgreen:
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Φεβ 2012, 15:17

:lol:

ΥΓ. Δεν το βρίσκω το upc.c πρόγραμμα στην ενότητα 4.1 που λέει.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron