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

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

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

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

Δημοσίευσηαπό Star_Light » 31 Ιαν 2012, 00:00

σου ξέφυγε ενας αστερίσκος στο y.

Κώδικας: Επιλογή όλων
*y=temp;


Το

Κώδικας: Επιλογή όλων
if (!x || !y)


τι εξετάζει? αν υπάρχουν τα x & y ?
Γνώσεις ⇛ 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 » 31 Ιαν 2012, 00:08

Star_Light έγραψε:σου ξέφυγε ενας αστερίσκος στο y.

Το πήρα χαμπάρι έγκαιρα και το διόρθωσα, αλλά εσύ ακόμα πιο έγκαιρα :lol:

έγραψε:
Το
Κώδικας: Επιλογή όλων
if (!x || !y)

τι εξετάζει? αν υπάρχουν τα x & y ?

Ναι, μιας και η συνάρτηση δέχεται δείκτες, αυτός ο έλεγχος προστατεύει από την περίπτωση που κάποιος από αυτούς ή και οι 2 περαστούν με τιμή NULL... έστω και κατά λάθος.

Χωρίς αυτόν τον έλεγχο, αν περαστεί στη συνάρτηση οποιοδήποτε από τα 2 ορίσματά της με τιμή NULL θα παραχθεί seg-fault.

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

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

Δημοσίευσηαπό Star_Light » 31 Ιαν 2012, 00:23

migf1 έγραψε:
Το πήρα χαμπάρι έγκαιρα και το διόρθωσα, αλλά εσύ ακόμα πιο έγκαιρα :lol:


Eιμαι το λαγωνικό της C για αυτο :D

Εικόνα

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

Χωρίς αυτόν τον έλεγχο, αν περαστεί στη συνάρτηση οποιοδήποτε από τα 2 ορίσματά της με τιμή NULL θα παραχθεί seg-fault.

ΥΓ. Κάνε το swap των πινάκων... είναι καλή άσκηση.


Δηλαδη τι τιμη μπορει να δοθει? απο τον χρηστη? Γιατι δινω και αρνητικους και 0 και δεν καταλαβαινει τιποτα... συνεχιζει ...

swap πινακων εννοεις αν εχω εναν πινακα ας πουμε

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


τελικα να παρω τον

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

?
Γνώσεις ⇛ 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 » 31 Ιαν 2012, 00:40

Βάλε NULL αντί για x ή για y όταν καλείς την swap... π.χ. int_swap( NULL, NULL); ... χωρίς το sanity check στην καλύτερη θα φας seg-fault, στη χειρότερη θα σου χακέψουν το πρόγραμμα.

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

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

Δημοσίευσηαπό Star_Light » 31 Ιαν 2012, 00:56

migf1 έγραψε:Βάλε NULL αντί για x ή για y όταν καλείς την swap... π.χ. int_swap( NULL, NULL); ... χωρίς το sanity check στην καλύτερη θα φας seg-fault, στη χειρότερη θα σου χακέψουν το πρόγραμμα.

Με το swap πινάκων εννοώ αν π.χ. έχεις 2 πίνακες arr1 και arr2, μετά το swap ο arr1 να έχει πάρει τα στοιχεία του arr2, και ο arr2 του arr1.


aha μαλιστα. Αρχικα νομισα swap μεσα στον ιδιο πινακα ο πονηρος :lol: :lol:

ενταξει... θα το προσπαθησω... απο αυριο :)

αποψε λεω να την αραξω λιγο ή να διαβασω λιγο για το line buffering που απο προχθες ηθελα
αλλα δεν βρηκα χρονο.
Γνώσεις ⇛ 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 » 31 Ιαν 2012, 02:25

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

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

Δημοσίευσηαπό Star_Light » 31 Ιαν 2012, 03:02

migf1 έγραψε:Και μένα με βλέπω να σταματάω για σήμερα, τα 'παιξα ( η τεκμηρίωση είναι πιο δύσκολη από τον κώδικα :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++

Δημοσίευσηαπό stamatiou » 31 Ιαν 2012, 18:24

Star_Light έγραψε:
migf1 έγραψε:Oh yes!!!!!!!!!!!!!!!!!!
Άξιος !!!!!!!!!!!!!!!

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


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


//----------------------------------------------------------------------

#include<stdio.h>
void single_p(int *p2);
void double_p(int **p);

int main()

{

int **p , a=1 ;
int *p2;

p2=&a;
p=&p2;

printf ("%d\n", **p); // before change
printf("%p", p2);

puts("\n");

printf("%p", *p); // same adress with p2

printf("\n%p", &a);


puts("\n");

**p=1;

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

puts("\n");

single_p(p2); // call by reference simulation with one pointer
double_p(p); // call by reference simulation with double pointer


return 0;
}//---------------------------------------------------------------------
void single_p(int *p3)
{
*p3= 2;

printf("After change in single_p function : %d " , *p3);

return ;
}
//----------------------------------------------------------------------

void double_p(int **p)
{
**p=3;

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

return ;
}
//----------------------------------------------------------------------



Αυτο μπορεις να μου πεις πως καταφερε και ετρεξε τελικα? :lol: :lol: :lol:

νομιζω ο τριτος δεικτης δεν χρειαζεται απλα τον εβαλα στα γρηγορα επειδη μου πετουσε σφαλματα

χωρις να καλω την συναρτηση με τον p3 αλλα με τον p2 μου τρεχει... αλλο παλι και τουτο.

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

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

Δημοσίευσηαπό Star_Light » 31 Ιαν 2012, 18:42

Χιονίζει !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

@stamatiou επειδη την συνάρτηση την καλώ με τον p2 και οχι με τον p3 οπως
κανονικα θα επρεπε . Τσεκαρε την καλυτερα με την παραμετρο της. Αυτο το πραγμα
δουλεψε κατα τυχη!
Γνώσεις ⇛ 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 » 31 Ιαν 2012, 18:43

Και μιας και το ριξαμε στους δεικτες και χθες αλλο ενα παράδειγμα

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


#include<stdio.h>
int main()
{
int **p2 , a=2;
int *p;
int *p3;

p=&a;

p2=&p;

printf("%d", *p);

printf("\t%d", **p2);

printf("\n%p", p); //address of a

printf("\n%p", &a); // address of a

printf("\n%p", &p); // address of p pointer

p3=p; // Indicating to the same variable

printf("\n %d", *p3); // print a = 2

return 0;
}
Γνώσεις ⇛ 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
Εκτύπωση

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

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