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

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

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

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

Δημοσίευσηαπό Star_Light » 08 Φεβ 2012, 02:31

Βασικα να ρωτήσω και εγω κάτι μεμονομένα?

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

#include<stdio.h>
int func( int sum );

int main(void)
{
int sum=0 , r ;
int (*p)(int sum) = NULL ;

p = &func;

r= (*p)(sum);
printf("%d", r );

printf("%p %p" , p , &func );

return 0;
}
int func(int sum)
{
int a , b;

puts("Give a number: ");
scanf("%d" , &a);
puts("Give a number: ");
scanf("%d", &b);

sum= a+b ;

return sum;
}


δηλαδη το (*p)(sum) ειναι ο δείκτης της συνάρτησης που έχει την τιμή της διεύθυνσης μνήμης? δεν μπορω να καταλαβω 100% ας πουμε.
Δινω σε εναν δεικτη την διευθυνση μνημης μιας συνάρτησης απο εκει και επειτα το αποτελεσμα που θα επιστρέψει η συνάρτηση μπορω να
το εμφανίσω με την απο-αναφοροποίηση ?

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

int (*p)(int sum) = NULL ;

p = &func;


μπορεί απευθείας να αντικατασταθεί απο το

Κώδικας: Επιλογή όλων
int (*p)(int sum) = &func ;


εκείνο που μπέρδευα το καλοκαίρι και σε ρωτούσα ηταν το initialization με το assignment στους δεικτες
δεν έχει σημασια το συμβολο μιας και ειναι 2 ξεχωριστα πραγματα... και τα χειριζεται διαφορετικα η γλωσσα.
Με την ιδια λογικη που το / μπορει να χρησιμοποιηθει σαν συμβολο για τα σχολια αλλα και για την διαιρεση.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 08 Φεβ 2012, 04:56

btw πρεπει να εχω κανει πολλα λαθη στον παραπανω κωδικα και μαλλον τρεχει by lack :(

αλλα θα τα ξανακοιταξω αυριο παλι. Καληνυχτα (αν διαβαζει και κανεις) :lol: :lol:
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 08 Φεβ 2012, 12:04

Καλημέρα, ναι μπορείς να χρησιμοποιήσεις την αποαναφορά του δείκτη της συνάρτησης ως την τιμή επιστροφής της συνάρτησης στην οποία δείχνει. Με μικρές αλλαγές, ο κώδικας που παραθέτεις γίνεται...

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

#include <stdio.h>

/* ------------------------------------------- */
int func( int sum )
{
int a, b;

printf("Give a number: ");
scanf("%d" , &a);

printf("Give a number: ");
scanf("%d", &b);

sum = a + b ;
return sum;
}

/* ------------------------------------------- */
int main( void )
{
int sum = 0;
int (*pf)(int sum) = &func ;

printf("%d\n", (*pf)(sum) );
printf("%p %p\n", pf, &func );

return 0;
}


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

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

printf("%d\n", (*pf)(sum) );

μπορείς να γράψεις...

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

printf("%d\n", pf(sum) );

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

Άσχετα με τους δείκτες, η χρήση του sum στην func() είναι περιττή (εκτός αν αλλάξεις το πέρασμα του sum από by-value σε by-reference, ώστε να έχει κάποιο νόημα η χρήση του στη συνάρτηση (π.χ. να κρατάει το άθροισμα των αριθμών και μετά το πέρας της συνάρτησης). Τώρα που το περνάς by-value είναι τελείως περιττό στην func(), οπότε ο κώδικας μπορεί να γραφτεί...

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

#include <stdio.h>

/* ------------------------------------------- */
int func( void )
{
int a, b;

printf("Give a number: ");
scanf("%d" , &a);

printf("Give a number: ");
scanf("%d", &b);

return a+b;
}

/* ------------------------------------------- */
int main( void )
{
int sum = 0;
int (*pf)(void) = &func ;

sum = (*pf)();
printf("%d\n", sum );

printf("%p %p\n", pf, &func );

return 0;
}

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

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

Δημοσίευσηαπό stamatiou » 08 Φεβ 2012, 18:36

Αυτό ουσιαστικά τι κάνει declare;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 08 Φεβ 2012, 18:37

Οκ ευχαριστώ.

Δεν χρειάζεται να διοχετεύεται το όρισμα σε μια συνάρτηση εφοσον το ζητάει μετα μέσα της η συνάρτηση ε?

το αποτέλεσμα της συνάρτησης βρίσκεται στον δείκτη και με * το τυπωνεις ουσιαστικα....

αυτο που λες με by ref βασικα μονο αν ειναι void χρειάζεται να γινει... εφοσον θες να δουλεψεις απευθειας
με την μνήμη μιας και οταν τελειωσει η συνάρτηση καταργείται και η τιμή των τοπικών της μεταβλητών.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

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

Star_Light έγραψε:
...
αυτο που λες με by ref βασικα μονο αν ειναι void χρειάζεται να γινει... εφοσον θες να δουλεψεις απευθειας
με την μνήμη μιας και οταν τελειωσει η συνάρτηση καταργείται και η τιμή των τοπικών της μεταβλητών.

Όχι δεν χρειάζεται μόνο τότε, είναι ανεξάρτητο από την τιμή επιστροφής της συνάρτησης. Αν το περνάς by-reference το sum τότε αποθηκεύει μέσα του όποιες αλλαγές του κάνει η συνάρτηση, ανεξάρτητα με το τι θα κάνει μετά ο caller της συνάρτησης με την τιμή επιστροφής της συνάρτησης (θα μπορούσε για παράδειγμα να την εκχωρεί σε μια άλλη μεταβλητή, άσχετη με την sum)..
Τελευταία επεξεργασία από migf1 και 09 Φεβ 2012, 00:07, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

stamatiou έγραψε:Αυτό ουσιαστικά τι κάνει declare;

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

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

Δημοσίευσηαπό Star_Light » 09 Φεβ 2012, 00:12

Oμολογώ οτι πιάνοντας έννοιες οπως συναρτήσεις που επιστρέφουν δείκτες σαν να μπερδεύτηκα παλι
και να αρχισα να αναρωτιέμαι αν οντως γνωρίζω τι ακριβως παίζει με τις απλές συναρτήσεις :o :o

δεν μπορω πλεον να καταλαβω 2 πράγματα :

1. Δεδομενου οτι οι τοπικές μεταβλητές έχουν περιορισμένο lifetime πως μπορούμε εμείς να τις επιστρέψουμε
στον caller και μετα αυτος να τις εκτυπώσει ? Αφου καταργούνται λεει οταν τελειώνει η συνάρτηση. Δεν ξερω μπερδευτηκα
παλι ρε γαμωτη.

2. Ποτε χρειαζόμαστε πραγματικά να περνάμε ορίσματα σε μια συνάρτηση? :/
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

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

Star_Light έγραψε:
δεν μπορω πλεον να καταλαβω 2 πράγματα :

1. Δεδομενου οτι οι τοπικές μεταβλητές έχουν περιορισμένο lifetime πως μπορούμε εμείς να τις επιστρέψουμε
στον caller και μετα αυτος να τις εκτυπώσει ? Αφου καταργούνται λεει οταν τελειώνει η συνάρτηση. Δεν ξερω μπερδευτηκα
παλι ρε γαμωτη.

Τα περιεχόμενά τους παραμένουν στη μνήμη μέχρι να γίνουν overwrite (απλώς η μνήμη αυτή μαρκάρεται ως διαθέσιμη για όποιον τη ζητήσει μελλοντικά). Οπότε γράφοντας εσύ:

Κώδικας: Επιλογή όλων
x = foo();

παίρνεις άμεσα ότι έχει βάλει η συνάρτηση σε εκείνη τη μνήμη, πριν προλάβει να γίνει overwrite από κάποια άλλη κλήση συνάρτησης ή οτιδήποτε

έγραψε:
2. Ποτε χρειαζόμαστε πραγματικά να περνάμε ορίσματα σε μια συνάρτηση? :/

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

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

Δημοσίευσηαπό Star_Light » 09 Φεβ 2012, 01:59

Toτε ποιο το πρόβλημα με αυτη την συνάρτηση

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


#include<stdio.h>
int *func( int a );

int main(void)
{
int a;
int *p=NULL;

printf(" * Give a * : ");
scanf("%d" , &a);

p = func(a);

printf("The given a is : %d" , *p);

return 0;
}
int *func(int a)
{
int *p=&a;

return p ;
}



???? :/
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

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