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

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

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

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

Δημοσίευσηαπό c7p » 08 Απρ 2012, 16:21

Αρχίζω και εγώ να προγραμματίζω σε C, μια ερωτησούλα.

Χρησιμοποιώ το geany ως IDE, ωστόσο έχω το εξής πρόβλημα. Το εκτελέσιμο αρχείο (arxeio.o) που δημιουργείται δεν μου το τρέχει, δλδ αν δώσω
Κώδικας: Επιλογή όλων
./arxeio.o
μου επιστρέφει
Κώδικας: Επιλογή όλων
bash: ./A1.o: cannot execute binary file


Αντίθετα αν κάνω compile το αρχείο απο τερματικό με gcc -o , και τρέξω το αρχείο όλα καλα. Τι μπορεί να φταίει ;
Άβαταρ μέλους
c7p
powerTUX
powerTUX
 
Δημοσιεύσεις: 1849
Εγγραφή: 30 Μάιος 2009, 16:09
Τοποθεσία: Κατερίνη
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 08 Απρ 2012, 16:28

Το .o δεν είναι το εκτελέσιμο.
Αφού κάνεις την μεταγλώττιση μέσα απ' το geany στο κάτω μενού "Μεταγλωττιστής" θα σου βγάλει την εντολή που χρησιμοποιήθηκε για το compile.
Κάνε ένα copy/paste.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 08 Απρ 2012, 17:45

Ilias95 έγραψε:
Κώδικας: Επιλογή όλων
if ( !s1 || !s2 )
return NULL;

Εδώ ελέγχουμε αν κάποιο εκ των s1, s2 είναι NULL;
Αν ναι, δεν είναι καλύτερα να το κάνουμε πιο explicit (s1 == NULL);

Αν σε βολεύει καλύτερα ναι, ότι σου είναι πιο κατανοητό.

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

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

Δημοσίευσηαπό c7p » 08 Απρ 2012, 18:19

Ilias95 έγραψε:Το .o δεν είναι το εκτελέσιμο.
Αφού κάνεις την μεταγλώττιση μέσα απ' το geany στο κάτω μενού "Μεταγλωττιστής" θα σου βγάλει την εντολή που χρησιμοποιήθηκε για το compile.
Κάνε ένα copy/paste.


Κώδικας: Επιλογή όλων
gcc -Wall -c "arxeio.c"


update: Άκυρο το βρήκα, έπρεπε να κάνω και build μετά το compilation.
Άβαταρ μέλους
c7p
powerTUX
powerTUX
 
Δημοσιεύσεις: 1849
Εγγραφή: 30 Μάιος 2009, 16:09
Τοποθεσία: Κατερίνη
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 08 Απρ 2012, 18:27

Μάλλον έκανες σκέτη τη μεταγλώττιση. Πάτα το κουμπάκι build.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 09 Απρ 2012, 11:23

c7p έγραψε:
Κώδικας: Επιλογή όλων
gcc -Wall -c "arxeio.c"


update: Άκυρο το βρήκα, έπρεπε να κάνω και build μετά το compilation.

Καλή αρχή φίλε c7p.

Το -c flag είναι που σου κάνει την "ζημιά", λέει στον gcc να MHN δημιουργήσει εκτελέσιμο αρχείο, αλλά μόνο object file(s) .ο (αυτά τα χρειάζεσαι όταν π.χ. φτιάχνεις βιβλιοθήκες). Το flag με το οποίο ονοματίζεις το δημιουργημένο εκτελέσιμο είναι το -o (αν δεν το βάλεις, τότε το εκτελέσιμο αρχείο δημιουργείται με το default όνομα: a.out

Οπότε, αν για παράδειγμα έχεις ένα πηγαίο αρχείο myprog.c και θέλεις να δημιουργηθεί εκτελέσιμο myprog, γράφεις...

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

gcc -Wall -Wextra myprog.c -o myprog

Τα -Wall -Wextra flags είναι προαιρετικά (λένε στον gcc να τυπώνει προειδοποιήσεις κατά το compilation, για σημεία του κώδικα που ενδέχεται να είναι προβληματικά)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό konnn » 10 Απρ 2012, 10:09

Γιατί δεν εμφανίζεται σωστά το μέγεθος του πίνακα;

έγραψε:#include <stdio.h>
#include <stdlib.h>
int main(){
int *arr;
arr= (int *)malloc(12 * sizeof(int ));
printf("\nsize of array=%ld\n",sizeof(arr) );
printf("\nsize of int=%ld\n",sizeof(int) );
return 0;
}


Ευχαριστώ.
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 10 Απρ 2012, 10:38

Καλημέρα,

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

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

Δημοσίευσηαπό konnn » 10 Απρ 2012, 10:46

migf1 έγραψε:Καλημέρα,

το sizeof όταν εφαρμόζεται σε δείκτες δείχνει το μέγεθος του δείκτη (που είναι ίδιο σε όλους τους τύπους). Για να σου δείξει μέγεθος πίνακα, θα πρέπει να τον έχεις ορίσει στατικά (με [ ]) και όχι ως δείκτη. Όταν τον ορίζεις ως δείκτη θα πρέπει να κρατάς σε ξεχωριστή μεταβλητή το μήκος/μέγεθός του.

Καλημέρα,χμμμ...κάτι τέτοιο βοηθά
έγραψε:int mysize(int *p){
int i=0;
while(((p+i))){
i++;
}
printf("\n%d\n",i);
return i;
}
?
ευχαριστώ.
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 10 Απρ 2012, 12:48

Δεν βοηθάει όχι. Αυτό που γράφεις σταματάει το loop στο πρώτο στοιχείο του πίνακα που ισούται με 0.

Γενικώς, από τη στιγμή που κάνεις malloc() μνήμη με κάποιο μέγεθος, το μέγεθος αυτό σου είναι γνωστό. Άρα μπορείς να το περάσεις σε όποια συνάρτηση χρειάζεται να το χρησιμοποιήσει. Τι προσπαθείς να κάνεις;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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