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

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

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

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

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

Star_Light έγραψε:
...
Και απο που θα διαβασω για το line buffering ?

google is your friend :lol:

έγραψε: εχεις καμια καλη πηγη??? Οχι δυσνοητη

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

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

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

@migf1 οκ θα τα κοιτάξω! Φχαριστώ :D

btw εδω -> http://en.wikipedia.org/wiki/Bubble_sort

δεν υπάρχει ενα θέμα με το παράδειγμα της φωτογραφίας με τις κοκκινες και τις μαυρες σημάνσεις
καθως σου δειχνει τον αλγοριθμο ειναι λες και ουσιαστικα σταματάει η σύγκριση σε αυτα που έχουν ταξινομηθεί στην ουρά
ενω κατι τετοιο δεν ισχυει συμφωνα με τα 3 περάσματα στην λίστα

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


12 συγκρίσεις κανει και στα 3 περάσματα συνολικα.
Εγω πιστευω οτι η φωτογραφια που έχει σε μπερδεύει. Ποια η γνώμη σας?
Γνώσεις ⇛ 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 » 28 Ιαν 2012, 17:14

Να με και εγώ!
Να κάνω μια ερώτηση εκτός θέματος; (Ρητορική ερώτηση :lol: )
Ξαναδιάβασα το tutorial σου migf1 για λίστες και έχω μια απορρία εδώ
Κώδικας: Επιλογή όλων
void list_prepend( Node **list, int value )
{
Node *new = calloc(1, sizeof(Node) );
if ( !new )
return;

new->value = value;
new->next = (*list);
(*list) = new;

return;
}

με το new->next = (*list) θέτουμε ότι το επόμενο του new είναι το list σωστά;
με το (*list) = new δεν βάζουμε το list να δείχνει στο new;
Ουσιαστικά βάζουμε το επόμενο του new να είναι το ίδιο του new;

BTW: Καλό τριήμερο σε όσους ισχύει :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 28 Ιαν 2012, 17:30

ΕΕΕΕΕΕΕΕΕΕΕΕλα ρε σταματίου εσυ μας έλειπες για να συμπληρωθεί το τριώδιο :D

περνάς διπλό δείκτη μεσα στην συνάρτηση επομένως ο μονος αστερίσκος ειναι η μεταβλητή δείκτη σου.
Ενω ο διπλος αστερισκος ειναι ουσιαστικα το περιεχόμενο του διπλού δείκτη

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


#include<stdio.h>

int main()

{
int **p , a=2 ;


*p=&a;

printf("%d", **p);

return 0;
}


Αν και μου πετάει ενα warning ενω σε ένα παράδειγμα που είχα φτιάξει πριν καιρο δεν μου πετάει τιποτα

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


#include<stdio.h>

int main()
{
int x=2;
int y=3;
int *px , **py;

px=&x;
py=&px;


printf("\n%d",**py);

*py=&y;

printf("\n%d",**py);




return 0;
}


btw ειναι πονοκεφαλος μεγαλος η C μεταξυ μας ετσι?

Οσο για τον bubble sort τελικα η φωτογραφιουλα σε ξεγελάει οπως ειπα και πριν.

EDIT : Τωρα κατάλαβα.... κρατησε το 2ο παράδειγμα και άσε το 1ο. Τον διπλο δεικτη θα πρεπει αρχικα να τον αρχικοποιήσεις να δειχνει σε εναν αλλον δεικτη και μετα να πας να κανεις προσπέλαση με τον τελεστή διακοπής αναφοράς , τον αστερίσκο σου δηλαδη. Στην συνάρτηση του migf1 για τις λίστες ο new απο αριστερά μαζι με τον *list ειναι και οι 2 δείκτες. Απλα τωρα ψαχνω να βρω στο παράδειγμα που έδωσα πως μπορω να αρχικοποιώ τον *py = &y ενω στο 1ο παράδειγμα δεν μπορώ επειδη πετάει warning αν και εκτυπώνει κανονικα την τιμή 2 του a.
Γνώσεις ⇛ 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 » 28 Ιαν 2012, 18:18

stamatiou έγραψε:
με το new->next = (*list) θέτουμε ότι το επόμενο του new είναι το list σωστά;
με το (*list) = new δεν βάζουμε το list να δείχνει στο new;
Ουσιαστικά βάζουμε το επόμενο του new να είναι το ίδιο του new;

Είναι συχνή απορία αυτό! Για να το ξεδιαλύνεις, φαντάσου τους δείκτες σαν σκέτα βέλη που δείχνουν σε κουτιά που περιέχουν δεδομένα μέσα τους.

Οπότε αν έχουμε π.χ. την παρακάτω λίστα ...

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

*list -> [ data1 | next ] -> [ data2 | next ] -> NULL

και δημιουργήσουμε κάπου στη μνήμη ένα ξέμπαρκο, νέο κουτί με τον δείκτη new να δείχνει σε αυτό ( μέσω του malloc/calloc γίνεται αυτό) ...

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

*list -> [ data1 | next ] -> [ data2 | next ] -> NULL
new -> [ data3 | next ]

τότε με το: new->next = (*list); παίρνουμε αυτό το σχήμα:

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

*list
|
v
new -> [ data3 | next ] -> [ data1 | next ] -> [ data2 | next ] -> NULL

και με το: (*list) = new; παίρνουμε το εξής σχήμα:

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

*list
|
v
new -> [ data3 | next ] -> [ data1 | next ] -> [ data2 | next ] -> NULL


το οποίο είναι ακριβώς αυτό που θέλαμε να κάνουμε, να προσθέσουμε δηλαδή το new στην αρχή της λίστας μας. Ο δείκτης new από εδώ και πέρα μας είναι εν πολλοίς άχρηστος, γιατί έχουμε τον *list ;)

έγραψε:BTW: Καλό τριήμερο σε όσους ισχύει :D

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

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

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

Star_Light έγραψε:
...
btw ειναι πονοκεφαλος μεγαλος η C μεταξυ μας ετσι?
...

Αφού σ' αρέσει, τι παραπονιέσαι;
Είναι αυτό που λένε... "πονάω αλλά μου αρέσει" :lol:

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

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

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

Α ναι! Απλα βάζεις τον *list να δειχνει εκει που δειχνει και ο new και μετα κανεις free ξερω γω τον new.

Θα καθομουν να ξεσκονισω λιγο τους διπλους δεικτες αλλα τωρα έχω άλλη έγνοια. Θελω να καταφερω να τρεξω τον bubble sort
με δικο μου καταλληλο και σωστο εμφωλιασμένο for loop. ;) Καταλαβα τον αλγοριθμο απο την Wikipedia αρχικα πιστευα οτι το προβλημα
υπάρχει στην εισοδο και θα επρεπε να την περναω σαν string και μετα να την μετατρέπω μεσω της atoi αλλα τελικα το προβλημα μαλλον έγκειται στον ηδη υπάρχοντα αλγοριθμο που έχω και οχι τοσο στην εισοδο .

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


#include<stdio.h>
int n;
void bubble_sort(int x[n]);

int main()

{
int x[n];
int i;

printf("\nGive the elements?\n");
scanf("%d",&n);


for(i=0; i<n; i++)
{
printf("\nGive a number\n");
scanf("%d",&x[i]);
}

puts("\n");
printf("===============");
printf("After sorting: ");
printf("===============");

bubble_sort(x); // This is the address of array x[n] .

for(i=0; i<n; i++)
printf("\n %d",x[i]);

return 0;
}
//----------------------------------------------------------------------
void bubble_sort(int x[n])
{
int i,j;

for(i=0; i<n; i++)
{
for(j=0; j<n-1; j++)
{

if(x[j]>x[j+1])
{
int tmp=x[j+1];
x[j+1]=x[j];
x[j]=tmp;
}

}

}
return;
}

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


Στον παραπανω τρωω και Segm Fault βεβαια για παραπανω απο 4 στοιχεια :/
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 » 28 Ιαν 2012, 18:38

@stamatiou: Ένας άλλος τρόπος για να σε βοηθήσει να το θυμάσαι είναι όταν έχεις εκχώρηση ενός δείκτη σε έναν άλλον, π.χ...

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

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

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

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

Star_Light έγραψε:Α ναι! Απλα βάζεις τον *list να δειχνει εκει που δειχνει και ο new και μετα κανεις free ξερω γω τον new.

Όχι, δεν τον κάνεις free τον new στο παραπάνω παράδειγμα, γιατί θα καταστρέψεις το κουτί (κόμβο) στο οποίο δείχνει (που είναι το ίδιο κουτί με αυτό που δείχνει ο *list). Μπορείς όμως να τον κάνεις NULL ή να τον βάλεις να δείχνει κάπου αλλού.

Αν θες όντως να καταστρέψεις το κουτί, πρέπει πριν το κάνεις free να εξασφαλίσεις πρόσβαση στο επόμενο κουτί.
Π.χ. για το παραπάνω παράδειγμα, αν θέλεις στο καπάκι να καταστρέψεις το κουτί που πρόσθεσες στην αρχή της λίστας, θα μπορούσες να συνεχίσεις με κάτι σαν κι αυτό...

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

*list = (*list)->next;
free( new );

ή έστω αυτό το πιο... πολυλογάδικο:

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

new = (*list)->next; // ή new = new->next;
free( *list );
*list = new;


ΥΓ. Την κάνω για σπίτι, θα τον κοιτάξω άλλη στιγμή τον κώδικα της bubble sort που σου βγάζει seg-fault.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Α ναι σωστος!

Ναι μολις τον δεις και εσυ... αν εχεις χρονο ελα να τον συζητησουμε... δεν θελω πχ
να μου ποσταρεις ετοιμη λυση ! Αν δεν θυμασαι τον αλγοριθμο πως δουλευει αν και νομιζω πως με μια ματια
θα τον καταλαβεις αμεσως τοτε πες μου να παραθέσω ενα παράδειγμα! Απλα θελω να γινει μια συζητηση γυρω απο αυτο.

Οσο για τον πόνο με την C μια ειναι η απαντησή μου :

Εικόνα

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

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

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

cron