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

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

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

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

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

Ilias95 έγραψε:1.Δεν τρέχεις καμία συνάρτηση (στην python). 2.Και να έτρεχες το κακό που είναι;

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

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

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

viewtopic.php?f=6&t=18969&start=1790

εδω στο τελευταιο σου ποστ γιατι καλείς την συνάρτηση με τους 2 διπλούς δείκτες χρησιμοποιώντας τον τελεστή & ??? :/

Εγω σε ενα αλλο δικο μου παράδειγμα με call by reference απλα καλούσα την ιδια συνάρτηση με

σκέτο το 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
Εκτύπωση

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

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

πχ εγω σε μια συνάρτηση που ειχα φτιαξει :
Κώδικας: Επιλογή όλων

void double_p(int **p)
{
int c=4;
*p=&c;

printf("After change in double_p function : %d ", **p);

return ;
}


και την καλούσα ετσι :

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


μεσα απο την main

edit: Παλι down ειναι το σαιτ σου :S

edit2 : Οκ επειδη μετακινείς τον δείκτη μεσα σε μια συνάρτηση πρεπει οταν την καλείς να τον περνάς &p σαν ορισμα...
αλλα εχω καποιες αποριες παλι....

εγω δεν βλεπω μεσα στην συναρτηση της σελ. 180 να τον μετακινεις.... που γινεται αυτο?
ενα αυτο και δευτερον οταν μετακινείται ενας δείκτης αλλάζει και η διεύθυνση μνήμης ΤΟΥ ? :)

ξεχασε το παραδειγμα που βαζω παραπανω... δεν εχει καμια απολυτως σχεση.
Γνώσεις ⇛ 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 » 03 Φεβ 2012, 19:56

parenthesis έγραψε:@Star_Light : Και πάλι, έχεις πρόβλημα στις αρχικοποιήσεις (δηλ κάνοντας for(pt1=pt2; ....), χάνεις τον δείκτη που έδειχνε στο table1) κι επίσης, δεν προχωράς ποτέ τον pt2 στην επόμενη θέση...


Oops τωρα το ειδα αυτο!!!! Ευχαριστω.
Το πηρα πρεφα και εγω μετα ;)
Γνώσεις ⇛ 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++

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

migf1 έγραψε:
Ilias95 έγραψε:1.Δεν τρέχεις καμία συνάρτηση (στην python). 2.Και να έτρεχες το κακό που είναι;

Αυτό μου δημιουργεί μια απορία εμένα. Είναι εγγυημένο πως θα γίνει το swap;
Αν δεν είναι, τότε πως ελέγχεις αν προέκυψε κάποιο σφάλμα; Εξετάζεις π.χ. το 1ο στοιχείο μιας από τις 2 λίστες πριν και μετά την εναλλαγή;

Δεν καταλαβαίνω την απορία. Θεωρώ ότι είναι τόσο εγγυημένο, όσο το ότι η print('hello world') θα εκτυπώσει 'hello world' στην οθόνη.
Αφού είναι λειτουργία της γλώσσας. Από κει και πέρα αν κάτι πάει λάθος είναι bug της ίδιας της γλώσσας (της οποιασδήποτε γλώσσας).
Δεν το θεωρώ λογικό να ελέγχεις το κάθε τι που κάνεις. Νομίζω ότι αυτά θεωρούνται δεδομένα.

Έτσι τα βλέπω εγώ τουλάχιστον. Αν κάνω λάθος, διόρθωσε με.

Edit:
Πάντως γενικώς στην python είναι εύκολο να βεβαιωθείς για κάτι πριν περάσεις σε κάτι άλλο.
Πχ. στην αρχή μίας συνάρτηση που καλείς με το όρισμα number μπορείς να βεβαιωθείς ότι ο number θα είναι θετικός με:
Κώδικας: Επιλογή όλων
assert number > 0, 'number must be positive'

Αν η βεβαίωση αποτύχει τότε θα υψωθεί assertion error και το πρόγραμμα θα σταματήσει επιτόπου, εκτυπώνοντας το μήνυμα που περνάς μαζί με το Error και που αυτό συνέβη.
Μπορείς να δημιουργήσεις δικές σου εξαιρέσεις επίσης αν δεν θες να χρησιμοποιήσεις την assert.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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

Ilias95 έγραψε:Δεν καταλαβαίνω την απορία. Θεωρώ ότι είναι τόσο εγγυημένο, όσο το ότι η print('hello world') θα εκτυπώσει 'hello world' στην οθόνη.

Δεν ξέρω, για αυτό ρώτησα αν είναι εγγυημένο. Στη C η printf("Hello world"); δεν είναι εγγυημένο πως θα πετύχει πάντως. Αν αποτύχει επιστρέφει αρνητική τιμή, αλλιώς επιστρέφει το πλήθος των χαρακτήρων που τύπωσε.

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

Έτσι τα βλέπω εγώ τουλάχιστον. Αν κάνω λάθος, διόρθωσε με.

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

έγραψε:
Edit:
Πάντως γενικώς στην python είναι εύκολο να βεβαιωθείς για κάτι πριν περάσεις σε κάτι άλλο.
Πχ. στην αρχή μίας συνάρτηση που καλείς με το όρισμα number μπορείς να βεβαιωθείς ότι ο number θα είναι θετικός με:
Κώδικας: Επιλογή όλων
assert number > 0, 'number must be positive'

Αν η βεβαίωση αποτύχει τότε θα υψωθεί assertion error και το πρόγραμμα θα σταματήσει επιτόπου, εκτυπώνοντας το μήνυμα που περνάς μαζί με το Error και που αυτό συνέβη.
Μπορείς να δημιουργήσεις δικές σου εξαιρέσεις επίσης αν δεν θες να χρησιμοποιήσεις την assert.

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

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

Δημοσίευσηαπό migf1 » 03 Φεβ 2012, 21:11

@starlight: δυστυχώς δεν μπορώ να παρακολουθήσω τις απορίες σου, κυρίως διότι επαναλαμβάνονται συνεχώς πάνω στα ίδια πράγματα, όσες φορές κι αν στα εξηγήσω (που το έχω κάνει ήδη περίπου... 200 φορές την κάθεμια :lol:).

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

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

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

migf1 έγραψε:Δεν ξέρω, για αυτό ρώτησα αν είναι εγγυημένο. Στη C η printf("Hello world"); δεν είναι εγγυημένο πως θα πετύχει πάντως. Αν αποτύχει επιστρέφει αρνητική τιμή, αλλιώς επιστρέφει το πλήθος των χαρακτήρων που τύπωσε.

:shock: :shock: :shock: Δεν το ήξερα αυτό. Πρώτη φορά ακούω κάτι τέτοιο. Έχει να κάνει με τον άγραφο νόμο της πληροφορικής "Οτιδήποτε μπορεί να πάει στραβά.";
Μήπως παίζει κάποιο ρόλο ότι η μία γλώσσα γίνεται compile πρώτα ενώ η άλλη είναι διερμηνευόμενη;

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

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

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

Δημοσίευσηαπό migf1 » 03 Φεβ 2012, 21:23

Ηλία, η Python ως interpreted γλώσσα λειτουργεί εξ' ορισμού μέσα σε ελεγχόμενο περιβάλλον: τον interpreter της (η Java στο virtual machine της, κλπ). Η C λειτουργεί απευθείας πάνω στο λειτουργικό της πλατφόρμας, οπότε είναι ελάχιστα (έως μηδενικά) αυτά που μπορείς να θεωρήσεις αυτονόητα... εκτός αν την τρέχεις σε κάποιο πιο high-level περιβάλλον, όπως είναι για παράδειγμα οι C interpreters που κυκλοφορούν.

Για αυτό και σπάνια θα βρεις void συνάρτηση στις στάνταρ συναρτήσεις της γλώσσας... στη συντριπτική τους πλειοψηφία επιστρέφουν κάτι για να δηλώσουν ενδεχόμενη αποτυχία της συνάρτησης.

Btw, ο κώδικας για το swap είναι αυτός...
Κώδικας: Επιλογή όλων

...
typedef enum { FALSE=0, TRUE } Bool;
typedef unsigned int uint;

typedef struct ArrInt {
uint len;
int *data;
} ArrInt;
...
/* -------------------------------------------------------
* Swap two ArrInt structures
* -------------------------------------------------------
*/
Bool arrint_swap( ArrInt *arrint1, ArrInt *arrint2 )
{
ArrInt temp;
size_t size = sizeof(ArrInt);

if ( !arrint1 || !arrint2 )
return FALSE;

memcpy( &temp, arrint1, size );
memcpy( arrint1, arrint2, size );
memcpy( arrint2, &temp, size );

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

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

Δημοσίευσηαπό migf1 » 03 Φεβ 2012, 21:28

Α ξέχασα... και χρησιμοποιείται ως εξής...

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

int main( void )
{
ArrInt arr1, arr2; /* two ArrInt structures */
...
/* init arr1 for N elems & arr2 for M elems and fill them with integer valus */
...
arrint_swap( &arr1, &arr2 );
...
/* release memory occupied by arr1 & arr2 */
}


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

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

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