ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

...ασύγχρονα μαθήματα γλώσσας C

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό Qdata » 20 Ιουν 2011, 19:09

stamatiou έγραψε:1.Αντί για return, δεν μπορούσες να χρησιμοποιήσεις printf;


Όχι γιατί με την return επιστρέφεις μια τιμή και δεν τυπώνεις κάτι στην οθόνη!Αντίθετα η printf() δεν επιστρέφει αυτό που τυπώνει αλλά τον χώρο που καταλαμβάνει.Πχ το:
Κώδικας: Επιλογή όλων
printf("Hello World!");

Θα τυπώσει στην οθόνη "Hello World!" και θα επιστρέψει μια άχρηστη τιμή που θα είναι η 12 επειδή Η+e+l+l+o+ +W+o+r+l+d+! είναι 12, αν θέλεις πες τα, "αντικείμενα".Με την return παίρνεις μια επιστροφή(πχ από μια συνάρτηση) και δεν τυπώνεις κάτι!Επίσης αυτή την επιστροφή μπορείς να την χρησιμοποιήσεις για να δεις αν είχε αποτέλεσμα η εντολή ή η εργασία που ανάθεσες στον υπολογιστή σου κάνει.

Πληροφοριακά: Όλες οι εντολές έχουν μια επιστροφή στο λειτουργικό σύστημα.Αν εκτελεστούν σωστά επιστρέφουν την τιμή 0.Πχ μια και ξέρει python3: Άνοιξε το τερματικό και γράψε:
Κώδικας: Επιλογή όλων
python3


Θα σε βγάλει στην κονσόλα/διεπαφή της python3 και γράψε:
Κώδικας: Επιλογή όλων
import os

μετά:
Κώδικας: Επιλογή όλων
os.system("cd /")

Δες το αποτέλεσμα!Έξοδος:
Κώδικας: Επιλογή όλων
>>> os.system("cd /")
0


Σημαίνει ότι η εντολή εκτελέστηκε με επιτυχία χωρίς κανένα σφάλμα! :)
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό stamatiou » 20 Ιουν 2011, 19:22

linuxs έγραψε:
stamatiou έγραψε:
linuxs έγραψε:[b]Κεφάλαιο 5 - Συναρτήσεις
return a+b;

2 ερωτήσεις:
1.Αντί για return, δεν μπορούσες να χρησιμοποιήσεις printf;
2.Στο scanf, γιατί χρησιμοποίησες δείκτες; Γενικά, μπορείς να μου δώσεις ένα παράδειγμα που πρέπει να χρησιμοποιήσουμε μόνο δείκτη και γιατί πρέπει;
Ευχαριστώ πολύ....


Μιλας γενικότερα για το προγράμματα που χρησιμοποιώ return? Αν ναι, δεν έχει καμία σχέση το return με το printf. Λοιπόν, το return όπως σε κάθε συνάρτηση έτσι και στην Main σου επιστρέφει μια τιμή. Κατανοητό? το οτι βάζω στην main "return 0" δεν παίζει κα΄ποιο ρόλο. Δηλαδή δεν θα δείς κάποιο αποτέλεσμα. Στην ουσία(απο προγραμματισμό συστήματος) επιστρέφεις 0 στην init αν δεν κάνω λάθος που είνα η πρώτη διεργασία που εκτελέστεικε στον υπολογιστή σου. Αυτή έκανε παιδιά τα παιδιά παιδιά κτλ. Ξεφεύγω πολύ όμως...αυτό που θα πρέπει να κρατήσεις είναι οτι αν σε κα΄ποια συνάρτηση έχεις επιστροφή με int float κτλ θα υπάρχει ένα τουλάχιστον return. Αν όχι και ε΄΄ιναι void δεν βάζεις καθόλου return. Το printf απο την άλλη εκτυπώνειι κάτι σστο stdout-οθόνη. δεν έχει καμιά σχέση με επιστροφή τιμών.

Στο scanf ΔΕΝ χρησιμοποιώ δείκτες. το & που ίσως σε μπερδεύει είαναι κάποιο address μόνο. Απλά σκέψου οτι όταν θέλουμε να διαβάσουμε ζητάμε να διαβάσουμε απο κάποια διεύθυνση απο κάποια μνήμη. Με την απάντηση μου η μισή ερώτηση σου δεν στέκει οπότε πες μου που θέλεις να εμβαθύνω... :)

καλή συνέχεια...

Δεν πολυκτάλαβα, γιατί δεν έβαλες κανονικά a και b στο scanf; Τι είναι τα adresses;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό pc_magas » 20 Ιουν 2011, 20:43

Παιδιά στο τερματικό:
Κώδικας: Επιλογή όλων
man <συνάρτηση-εντολή>

Σας επιστρέφει πληροφορίες για την συγγεκριμένη συνάρτηση
My blog|Κυπριακή Κοινότητα Ελευθέρου Λογισμικού Λογισμικού ανοικτού Κώδικα
Γνώσεις Linux:Ποτέ αρκετές|Προγραμματισμός: Php, javascript, nodejs, python, bash |Aγγλικά:Καλά
Οι υπολογιστές μου:
Spoiler: show
Ubuntu 16.04 64 bit σεIntel(R) Pentium(R) CPU G4400 @ 3.30GHz, 16Gib Ram, 500Gib Hard Disk, και κάρτα γραφικών Nvidia Geforce GT610
Lubuntu 14.04 σε Dell Inspiron mini 10(1010) intel Atom Z500 1Gb ram και gma500 (εδώθη σε άλλον)
Kubuntu 16.04 Lenovo G70 Intel i5 Nvidia Grapgics Card, Intel Graphics card (έχει 2) με Nouveau, 16Gb RAM, 126GB SSD Σκληρό Δίσκο
Άβαταρ μέλους
pc_magas
powerTUX
powerTUX
 
Δημοσιεύσεις: 2598
Εγγραφή: 12 Απρ 2009, 18:55
Τοποθεσία: Αχαρναί Αττικής
Launchpad: pc_magas
IRC: pc_magas
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό linuxs » 21 Ιουν 2011, 14:37

stamatiou έγραψε:Δεν πολυκτάλαβα, γιατί δεν έβαλες κανονικά a και b στο scanf; Τι είναι τα adresses;


Καταρχήν αν προσπάθήσεις να βάλεις μόνο a, b στο scanf θα χτυπήσει ο compiler. Όταν χρησιμοποιούμε scanf πάντα βάζουμε τις διευθύνσεις δηλαδή με &a, &b κτλ
Η scanf διαβάζει απο πληκτρολόγιο δεδομένα και τα αποθηκεύει σύμφωνα με τα φορμάτ που έχουμε(%d %f etc) στις θέσεις που δείχνουν τα arguments μας(τα οποία θα πρέπει ηδη όταν έχουμε ορίσει κάποιο να έχει δεσμευτεί μνήμη για αυτό).

Δηλαδή, χωριάτικα και απλά...ορίζεις μια μεταβλητή,
Κώδικας: Επιλογή όλων
int a;

και αμέσως έχει δεσμευτεί μνήμη για αυτή. Υπάρχει κάπου στην μνήμη του υπολογιστή μας. Όταν χρησιμοποιείς την scanf και διαβάζεις κάτι αν του πείς,
Κώδικας: Επιλογή όλων
scnaf("%d", a);

στην δικιά σου γλώσσα είναι: "διάβασε έναν ακέραιο και ονόμασέ τον a". Είναι σωστό αλλα θα σου πεί ο Υ/Η "και εγώ πως θα τον θυμάμαι? Που να τον βάλω στην μνήμη?". Ε, εδώ μπαίνει το '&' που του λες ""Βάλε το εκεί που έχει δεσμευτεί μνήμη με ΟΝΟΜΑ 'α' ". Το κατάλαβες τώρα? :/
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό g1wrg0s » 24 Ιουν 2012, 12:43

Σε καποιο σημειο του οδηγου λες :
Spoiler: show
Προσέξτε την σειρά που ορίζετε τις συναρτήσεις αν ακολουθήσετε την δεύτερη περίπτωση. Υπάρχει περίπτωση να τις ορίσετε με τέτοια σειρά ώστε να καλείτε μια συνάρτηση στη οποία χρησιμοποιήτε κάτι που το δηλώνετε σε μια άλλη συνάρτηση παρακάτω. Με άλλα λόγια θα πρέπει πρίν χρησιμοποιήτε κάτι(πχ. μια μεταβλητή) να το έχετε δηλώσει-αρχικοποιήσει στην main η σε κάποια συνάρτηση που έχετε ήδη καλέσει!!!


Μπορεις να αναφερεις ενα παραδειγμα σε κωδικα;
Ευχαριστω για καθε πιθανη απαντηση απο συμφορουμιτη.
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό poscore » 28 Ιουν 2012, 13:24

Πιστεύω να σου κάνει και σε ψευδοκώδικα :)

Κώδικας: Επιλογή όλων
function1() {
//μπλα μπλά κώδικας
function2();
}
function2() {
//μπλα μπλά κώιδκας
}
main() {
// μπλα μπλά κώδικας
function1();
}


Αποθήκευση και το τρέχεις. Τι νομίζεις θα γίνει? :)

Στο σημείο που θα μπεί στην function1() και θα πάει να καλέσει την function2 τι θα κάνει? Εγώ νομίζω θα αναρωτηθεί "wtf? where is function2? " :P

κατανοητό? :)
Τελευταία επεξεργασία από poscore και 28 Ιουν 2012, 14:16, έχει επεξεργασθεί 1 φορά/ες συνολικά
Άβαταρ μέλους
poscore
punkTUX
punkTUX
 
Δημοσιεύσεις: 153
Εγγραφή: 28 Απρ 2012, 17:21
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό g1wrg0s » 28 Ιουν 2012, 13:50

o compiler δεν βλεπει πρωτα ολα τα definitions του προγραμματος; Δηλαδη ξεκιναει απο τη main και στη πορεια που βλεπει μια μεταβλητη-συναρτηση κοιτα αν αυτη ειναι ορισμενη καπου(π.χ global);
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό poscore » 28 Ιουν 2012, 14:15

Δεν είμαι επαγγελματίας για να σου δώσω πλήρης απάντηση αλλα ναι κάπως έτσι είναι. Δες τα παρακάτω:

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

void func1(){
   printf("func1!\n");
}

void func2() {
   printf("func2!\n");
}

int main(){
   func1();
   func2();
return 0;
}


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

void func1();
void func2();

int main(){
   func1();
   func2();
return 0;
}

void func1(){
   printf("func1!\n");
}

void func2() {
   printf("func2!\n");
}


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

void func1(){
   printf("func1! will call func2 now\n");
   func2();
   printf("func2 called from func1\n");
   
}

void func2() {
   printf("func2!\n");
}

int main(){
   func1();
   func2();
return 0;
}



error message:
Κώδικας: Επιλογή όλων
func3_example.c:10: warning: conflicting types for ‘func2’
func3_example.c:5: note: previous implicit declaration of ‘func2’ was here


Ελπίζω να σε βοήθησαν να καταλάβεις τι εννοώ.

edit: ζητώ συγγνώμη στο προηγούμενο ποστ είχα ένα λάθος. Οι συναρτήσεις έπρεπε να είναι πάνω απο την main(). Δεν ξέρω αν σε μπέρδεψε αυτό...
Άβαταρ μέλους
poscore
punkTUX
punkTUX
 
Δημοσιεύσεις: 153
Εγγραφή: 28 Απρ 2012, 17:21
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό konnn » 28 Ιουν 2012, 14:18

poscore έγραψε:Εγώ νομίζω θα αναρωτηθεί "wtf? where is function2? " :P

Θα τη βρει.Αλλιώς ποια μορφή θα έπρεπε να είχε το πρόγραμμα ώστε καλέσει μια άλλη;
Δες
Κώδικας: Επιλογή όλων
#include<stdio.h>
void sum(int , int);
void myprint(int );
int main(){
int a=3;
int b=5;
sum(a,b);

return 0;
}
void sum(int a, int b){
int c=a+b;
myprint(c);
}
void myprint(int c){
printf("%d",c);
}

οπότε αν είναι
Κώδικας: Επιλογή όλων
function1();
function2();
main() {
    // μπλα μπλά κώδικας
    function1();
    }

    function1() {
    //μπλα μπλά κώδικας
    function2();
    }

    function2() {
    //μπλα μπλά κώιδκας
    }

είναι οκ.
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: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό migf1 » 28 Ιουν 2012, 20:44

Για να το θυμάσαι, μην χρησιμοποιείς συναρτήσεις πριν τις ορίσεις.

Αν θες να καλέσεις την foo2() μέσα στην foo1() τότε βεβαιώσου...

είτε πως έχεις ορίσει την foo2() πριν τον ορίσμό της foo1()...

Μορφοποιημένος Κώδικας: Επιλογή όλων
// ορισμός της foo2
void foo2( void )
{
...
}

// ορισμός της foo1
void foo1( void )
{
...
foo2(); // κλήση της foo2
}

int main( void )
{
...
foo1(); // κλήση της foo1
...
}


είτε πως έχεις δηλώσει το πρότυπο της foo2() πριν από τον ορισμό της foo1()...

Μορφοποιημένος Κώδικας: Επιλογή όλων
// δήλωση του προτύπου της foo2
void foo2( void );

// ορισμός της foo1
void foo1( void )
{
...
foo2(); // κλήση της foo2
...
}

// ορισμός της foo2
void foo2( void )
{
...
}

int main( void )
{
...
foo1(); // κλήση της foo1
...
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Επιστροφή στο Μαθήματα C