C Compiler for Ubuntu

...IDE, compilers, κλπ

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

Re: C Compiler for Ubuntu

Δημοσίευσηαπό Dimitris » 22 Οκτ 2008, 17:08

Ωραία χαίρομαι! Γενικά πάντως αν κάτι λειτουργεί σε μία διανομή linux τότε πρέπει να λειτουργεί και σε όλες τις υπόλοιπες. Φυσικά πάντα υπάρχουν εξαιρέσεις. Αν έχεις όρεξη γράψε έναν οδηγό στα ελληνικά με αυτά που έκανες βήμα-βήμα έτσι ώστε αν κάποιος άλλος τα χρειαστεί να ξέρει που να τα βρει.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: C Compiler for Ubuntu

Δημοσίευσηαπό bullgr » 22 Οκτ 2008, 18:47

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

Αποφάσισα τελικά να ασχοληθώ με τη C και άρχισα να διαβάζω το -κλασικό πλέον- βιβλίο "Η Γλώσσα Προγραμματισμού C" των Kerninghan & Ritchie. Τα παραδείγματα-ασκήσεις του βιβλίου βασίζονται στη ANSI C και τον compiler που χρησιμοποιώ φυσικά είναι ο gcc.

Από τη δική σας εμπειρία, υπάρχουν διαφορές της ANSI C με τον compiler gcc; Γιατί σε μια άσκηση ενώ τα έκανα όλα σωστά, δεν μπορούσε να μου τυπώσει το backspace. Σύμφωνα με το site: http://users.powernet.co.uk/eton/kandr2/krx110.html στο οποίο παρατίθονται όλες τις ασκήσεις του εν λόγω βιβλίου, το listing της άσκησης είναι η εξής:

Κώδικας: Επιλογή όλων
#include <stdio.h>

int main()
{
    int c, d;

    while ( (c=getchar()) != EOF) {
        d = 0;
        if (c == '\\') {
            putchar('\\');
            putchar('\\');
            d = 1;
        }
        if (c == '\t') {
            putchar('\\');
            putchar('t');
            d = 1;
        }
        if (c == '\b') {
            putchar('\\');
            putchar('b');
            d = 1;
        }
        if (d == 0)
            putchar(c);       
    }
    return 0;
}


Αλλά παρ' όλα αυτά, τρέχοντας ακόμα και τον δικό τους *σωστό* κώδικα, μου τυπώνει κανονικά τους υπόλοιπους χαρακτήρες εκτός του backspace. Ότι και αν κάνω η μεταβλητή που χρησιμοποιώ για τη μέτρηση του backspace παραμένει μηδενική.

Θα μου πείτε ότι είναι ασήμαντο το πρόβλημα και δεν με απασχολεί τόσο η επίλυσή του συγκεκριμένου κώδικα. Αυτό που με ενδιαφέρει πραγματικά είναι: Θα προκύψουν και άλλα προβλήματα ασυμβατότητας της ANSI C με τον gcc compiler;
ΕΠΙΤΡΕΠΕΤΑΙ ΝΑ ΠΕΣΕΙΣ, ΕΠΙΒΑΛΛΕΤΑΙ ΝΑ ΣΗΚΩΘΕΙΣ... HASTA SIEMPRE...
Άβαταρ μέλους
bullgr
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 1853
Εγγραφή: 10 Μάιος 2008, 21:45
Εκτύπωση

Re: C Compiler for Ubuntu

Δημοσίευσηαπό Dimitris » 22 Οκτ 2008, 19:09

Στις επιλογές του gcc μπορείς να ορίσεις ποιο πρότυπο θα ακολουθήσει. Δες man gcc ή στο viewtopic.php?f=9&t=55 :D στις γενικές επιλογές. Αλλά τώρα που το λες και το δοκιμάζω και σε μένα έτσι συμπεριφέρεται. Οπότε με λίγο ψάξιμο: http://books.google.de/books?id=4vm2xK3 ... &ct=result
"Terminal input in unix is "cooked" by default, meaning that the raw input is first processed so that line ending characters (backspace, delete, and so on) can be used, and these keys take effect without being passed to the program running.
Δηλάδη αν διαβάζεις το backspace από τη γραμμή εντολών ποτέ δεν προκειται να το δεις στο πρόγραμμά σου. Αλλά είμαι σχεδόν σίγουρος ότι μπορείς να το ρυθμίσεις από κάπου να συμπεριφέρεται διαφορετικά. Δεν είναι απαραίτητο όμως, γιατί σχεδόν πάντα κάνει τη σωστή δουλειά το τερματικό.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: C Compiler for Ubuntu

Δημοσίευσηαπό simosx » 22 Οκτ 2008, 20:49

Πράγματι είναι ζήτημα με το buffered input που είναι η προεπιλογή.
Με την setvbuf() (από stdio.h) μπορείς να αλλάξεις σε unbuffered.

Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
  int c;

  if ( setvbuf(stdin, NULL, _IONBF, 0) )
  {
   fprintf(stderr, "Αποτυχία ρύθμισης του τερματικού σε κατάσταση unbuffered\n");
   return -1;
  }

  do
  {
     c = getchar();
     printf(".");
  } while ( c != 'q' );

  return 0;

}


Το πρόγραμμα όμως δε δουλεύει όπως πρέπει σε Ubuntu, και νομίζω ότι έχει να κάνει με το γεγονός ότι για την setvbuf για να λειτουργήσει, το αρχείο πρέπει να έχει ανοιχτεί άμεσα, δίχως να έχει γίνει κάποια άλλη λειτουργία. Διαφορετικά, το αποτέλεσμα είναι undefined. Είναι πιθανό να συμβαίνει κάτι ειδικό σε Linux.
Μπορείς να βρεις περισσότερα με αναζήτηση για unbuffered setvbuf.

Άλλη επιλογή, αν θέλεις να το ψάξεις ακόμα περισσότερο, είναι να χρησιμοποιήσεις τη βιβλιοθήκη libncurses.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: C Compiler for Ubuntu

Δημοσίευσηαπό bullgr » 23 Οκτ 2008, 09:58

Ευχαριστώ για τις απαντήσεις σας... Τελικά κατάλαβα ότι είναι θέμα τερματικού. Ο compiler δεν έχει προβλήματα ασυμβατότητας... Άλλωστε με τις υποδείξεις του @Dimitri διάβασα τη man σελίδα (πως πιάνομαι ώρες-ώρες σαν newbie) και διαπίστωσα ότι μπορώ να κάνω compile των κώδικα σε καθαρή ANSI (επιλογή -ansi). Άρα δεν τίθεται θέμα ασυμβατότητας του compiler.

Απλώς η πρώτη έκδοση του βιβλίου γράφτηκε το 1978 και η δεύτερη το 1988. Οι άνθρωποι τότε χρησιμοποίησαν παραδείγματα σε περιβάλλον Unix. Και όπως και να το κάνουμε υπάρχουν ψιλοδιαφορές του Unix με το Linux.
ΕΠΙΤΡΕΠΕΤΑΙ ΝΑ ΠΕΣΕΙΣ, ΕΠΙΒΑΛΛΕΤΑΙ ΝΑ ΣΗΚΩΘΕΙΣ... HASTA SIEMPRE...
Άβαταρ μέλους
bullgr
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 1853
Εγγραφή: 10 Μάιος 2008, 21:45
Εκτύπωση

Re: C COMPILER FOR UBUNTU

Δημοσίευσηαπό thodoris_turtle » 25 Οκτ 2008, 13:03

cyberpython έγραψε:Αν έκανες σωστά την εγκατάσταση, ανοίγεις ένα τερματικό και δίνεις την εντολή (αν π.χ. θες να κάνεις compile το αρχείο /home/cyberpython/programming/hello_world.c):
Κώδικας: Επιλογή όλων
cd /home/cyberpython/programming
gcc hello_world.c -o hello_world.bin

(με την πρώτη εντολή πας στο φάκελο που έχεις αποθηκεύσει τον κώδικά σου)
και θα δημιουργηθεί το αρχείο hello_world.bin, που το εκτελείς με:
Κώδικας: Επιλογή όλων
./hello_world.bin


ενα εναλλακτικο σεναριο θα ηταν make ονομα αρχειου
και μετα ./ονομα αρχειου

δηλ. εγω αντι να χρησιμοποιω το gcc χρησιμοποιω την εντολη make

δηλ. νομιζω με τον τροπο που ειπα ειναι πιο ευκολο να θυμασε make filename σε σχεση με το να θυμασε την συνταξη για το gcc

edit:

Κώδικας: Επιλογή όλων
#include<stdio.h>
int recfun(int n);

int main()
{
   int plithos,i;
   printf("Dose to plithos tis akolouthias fibonacci:");
   scanf("%d",&plithos);
   
   for(i=0;i<plithos;i++)
    printf("%d oros akolouthios fibonacci einai %d:",i,recfun(i));

  return (0);
}

int recfun(int n)
{
    int oros;
    if(n==1)
       oros=0;
   else if (n==2)
       oros=1;
  else
     oros=recfun(n-1)+recfun(n-2);

  return(oros);
}


κανω make programma2
μετα ./ programma2

μετα μου λεει να δωσω το πληθος το δινω και μετα μου εμφανιζει segmentation fault

γιατι αυτο? τι πρεπει να κανω καμια ιδεα?

να ρωτησω και κατι αλλο? το gcc ειναι compiler για C ετσι δεν ειναι? ενω το g++ ειναι συνωλο απο compilers ετσι δεν ειναι ? δηλ. το g++ περιλαμβανει τον c compliler δηλ. τον gcc , τον c++ compliler αυτον δεν τον θυμαμε

ετσι δεν ειναι ? σωστα τα λεω? :oops:
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

Re: C COMPILER FOR UBUNTU

Δημοσίευσηαπό simosx » 25 Οκτ 2008, 21:13

thodoris_turtle έγραψε:
cyberpython έγραψε:Αν έκανες σωστά την εγκατάσταση, ανοίγεις ένα τερματικό και δίνεις την εντολή (αν π.χ. θες να κάνεις compile το αρχείο /home/cyberpython/programming/hello_world.c):
Κώδικας: Επιλογή όλων
cd /home/cyberpython/programming
gcc hello_world.c -o hello_world.bin

(με την πρώτη εντολή πας στο φάκελο που έχεις αποθηκεύσει τον κώδικά σου)
και θα δημιουργηθεί το αρχείο hello_world.bin, που το εκτελείς με:
Κώδικας: Επιλογή όλων
./hello_world.bin


ενα εναλλακτικο σεναριο θα ηταν make ονομα αρχειου
και μετα ./ονομα αρχειου

δηλ. εγω αντι να χρησιμοποιω το gcc χρησιμοποιω την εντολη make

δηλ. νομιζω με τον τροπο που ειπα ειναι πιο ευκολο να θυμασε make filename σε σχεση με το να θυμασε την συνταξη για το gcc

edit:

Κώδικας: Επιλογή όλων
#include<stdio.h>
int recfun(int n);

int main()
{
   int plithos,i;
   printf("Dose to plithos tis akolouthias fibonacci:");
   scanf("%d",&plithos);
   
   for(i=0;i<plithos;i++)
    printf("%d oros akolouthios fibonacci einai %d:",i,recfun(i));

  return (0);
}

int recfun(int n)
{
    int oros;
    if(n==1)
       oros=0;
   else if (n==2)
       oros=1;
  else
     oros=recfun(n-1)+recfun(n-2);

  return(oros);
}


κανω make programma2
μετα ./ programma2

μετα μου λεει να δωσω το πληθος το δινω και μετα μου εμφανιζει segmentation fault

γιατι αυτο? τι πρεπει να κανω καμια ιδεα?


Μπορείς να χρησιμοποιήσεις τον debugger gdb για να πάρεις περισσότερες πληροφορίες για το σφάλμα.
Διαφορετικά, βάλε αρκετές εντολές printf() σε διάφορα σημεία του κώδικα για να παρακολουθήσεις το πως εκτελείται.

Για debugger,
1. Εγκατέστησε το πακέτο gdb
2. Μεταγλώττισε ξανά το αρχείο, τώρα με επιλογή να μπουν οδηγίες εκσφαλμάτωσης,
Κώδικας: Επιλογή όλων
gcc -g programma2.c -o programma2

3. Εκτέλεσε το πρόγραμμα μέσα από το debugger,

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

4. Στην προτροπή του gdm, γράφεις run και πατάς Εντερ.
5. Δίνεις νούμερο για το πρόγραμμα και πατάς Έντερ
6. Το πρόγραμμα καταρρέει, και δείχνει και τον κώδικα στη γραμμή με το σφάλμα.
7. Με την εντολή where μπορείς να δεις όλες τις κλήσεις συναρτήσεων στο πρόγραμμά σου. Γιατί βλέπεις τις γραμμές που θα δεις;

thodoris_turtle έγραψε:να ρωτησω και κατι αλλο? το gcc ειναι compiler για C ετσι δεν ειναι? ενω το g++ ειναι συνωλο απο compilers ετσι δεν ειναι ? δηλ. το g++ περιλαμβανει τον c compliler δηλ. τον gcc , τον c++ compliler αυτον δεν τον θυμαμε

ετσι δεν ειναι ? σωστα τα λεω? :oops:


Το GCC είναι το συνολικό έργο για μεταγλωττιστές του Free Software Foundation.
Ένας μεταγλωττιστής αποτελείται από ένα front-end (το κομμάτι που μετατρέπει τον πηγαίο κώδικα μιας γλώσσας προγραμματισμού σε μια ενδιάμεση γενική μορφή κώδικα) και ένα back-end (το κομμάτι που μετατρέπει την ενδιάμεση γενική μορφή κώδικα σε κώδικα μηχανής για την αρχιτεκτονική που θέλουμε).

Ο gcc είναι ο μεταγλωττιστής για C (οκ, έχει ίδιο όνομα) ενώ ο g++ είναι ο μεταγλωττιστής για C++.
Η διαφορά μεταξύ gcc και g++ είναι στο front-end που αναγνωρίζουν γενικά διαφορετική γλώσσα.
Υπάρχουν τέτοιοι μεταγλωττιστές για αρκετές γλώσσες όπως fortran και αρκετές άλλες.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: C Compiler for Ubuntu

Δημοσίευσηαπό thodoris_turtle » 25 Οκτ 2008, 22:23

ok θα το ψαξω οσων αφορα για το C προγραμμα

στοχος μου ητανε να κανω πρωτα το C προγραμμα για fibonacci και μετα να προσπαθησω να το μετατρεψω σε παραλληλο προγραμμα για να το τρεξω με τον mpich-1.2.4 :lol:
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

Re: C Compiler for Ubuntu

Δημοσίευσηαπό simosx » 25 Οκτ 2008, 22:46

thodoris_turtle έγραψε:ok θα το ψαξω οσων αφορα για το C προγραμμα

στοχος μου ητανε να κανω πρωτα το C προγραμμα για fibonacci και μετα να προσπαθησω να το μετατρεψω σε παραλληλο προγραμμα για να το τρεξω με τον mpich-1.2.4 :lol:


Πολύ ωραία.
Όπως είδες παραπάνω, δεν έδωσα τη λύση έτοιμη για το ζήτημα με το πρόγραμμα. Όταν αρχίζεις τον προγραμματισμό, η σημαντική διαδικασία στην εκμάθηση είναι να όταν καταφέρνεις να μπορείς από μόνος σου να αντιμετωπίζεις προβλήματα. Αν υπάρχουν άτομα που δίνουν έτοιμες τις λύσεις, τότε δεν μαθαίνεις.
Καλή συνέχεια με το προγραμματισμό!
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Προηγούμενη

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού