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

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

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

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

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 12:39

migf1 έγραψε:Α, αυτή είναι η list_destroy() βρε συ... είπες list_print() και μπερδεύτηκα.

Στο 5ο μέρος έχω αλλάξει την δομή της λίστας, όπως αναλύω και στο tutorial. Οπότε η list δεν είναι πια δείκτης σε Node, αλλά είναι μια μεταβλητή τύπου List. Άρα όταν την περνάμε by reference της έχουμε έναν μόνο αστέρι στο σώμα της συνάρτησης.

Ουπς, κοσάνα μου ::opps::
Δηλαδή μπορώ να το σκεφτώ ότι μιας και το header που χρησιμοποιείται είναι δείκτης, όταν βάλω αστερίσκο και στο list είναι σαν να προσθέτω τους 2 αστερίσκους;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 21 Ιούλ 2011, 12:46

stamatiou έγραψε:
migf1 έγραψε:Α, αυτή είναι η list_destroy() βρε συ... είπες list_print() και μπερδεύτηκα.

Στο 5ο μέρος έχω αλλάξει την δομή της λίστας, όπως αναλύω και στο tutorial. Οπότε η list δεν είναι πια δείκτης σε Node, αλλά είναι μια μεταβλητή τύπου List. Άρα όταν την περνάμε by reference της έχουμε έναν μόνο αστέρι στο σώμα της συνάρτησης.

Ουπς, κοσάνα μου ::opps::
Δηλαδή μπορώ να το σκεφτώ ότι μιας και το header που χρησιμοποιείται είναι δείκτης, όταν βάλω αστερίσκο και στο list είναι σαν να προσθέτω τους 2 αστερίσκους;

Όχι, όχι!

Αν ο list είναι περασμένος by value τότε για να αναφερθείς στον head (που είναι μέσα στον list) γράφεις:
Κώδικας: Επιλογή όλων
list.head


Αν ο list είναι περασμένος by reference τότε για να αναφερθείς στον head (που είναι μέσα στον list) γράφεις:
Κώδικας: Επιλογή όλων
list->head


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

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

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 12:48

migf1 έγραψε:
stamatiou έγραψε:
migf1 έγραψε:Α, αυτή είναι η list_destroy() βρε συ... είπες list_print() και μπερδεύτηκα.

Στο 5ο μέρος έχω αλλάξει την δομή της λίστας, όπως αναλύω και στο tutorial. Οπότε η list δεν είναι πια δείκτης σε Node, αλλά είναι μια μεταβλητή τύπου List. Άρα όταν την περνάμε by reference της έχουμε έναν μόνο αστέρι στο σώμα της συνάρτησης.

Ουπς, κοσάνα μου ::opps::
Δηλαδή μπορώ να το σκεφτώ ότι μιας και το header που χρησιμοποιείται είναι δείκτης, όταν βάλω αστερίσκο και στο list είναι σαν να προσθέτω τους 2 αστερίσκους;

Όχι, όχι!

Αν αν ο list είναι περασμένος by valueτότε για να αναφερθείς στον head (που είναι μέσα στον list) γράφεις: list.head
Αν αν ο list είναι περασμένος by reference τότε για να αναφερθείς στον head (που είναι μέσα στον list) γράφεις: list->head

Δεν ξέρω αν είναι αυτό που ρωτάς. Αν είναι κάτι άλλο, ρώτα λίγο πιο συγκεκριμένα για να καταλάβω.

Εννοώ πώς μπορώ να το σκέφτομαι ότι είναι by reference, ότι το head μιας και είναι ήδη δείκτης έχω ένα αστερίσκο μπροστά του και προσθέτω και άλλον ένα επειδή στην παρένθεση πέρασα ώς List *list.
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 12:52

:idea: Ά, άσε κατάλαβα!
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 21 Ιούλ 2011, 12:53

Μπορείς να μου γράψεις ένα μικρό κομματάκι κώδικα με αυτό που ρωτάς, γιατί δεν καταλαβαίνω την ερώτηση.

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

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

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 13:01

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

ΥΓ. ο head στο 5ο μέρος είναι μεν δείκτης, αλλά δεν είναι αυτόνομη μεταβλητή. Είναι πεδίο της μεταβλητής list, η οποία είναι αυτόνομη μεταβλητή. Χμ, μήπως ρωτάς πως μπορείς να περάσεις by reference μόνο τον δείκτη head μέσα σε μια συνάρτηση;

Απλά επειδή είχα συνηθίση και έβλεπα περισσότερο δείκτες να περνιούνται by reference μπερδεύτηκα και νόμιζα για λίγο πως και η μεταβλητές θέλουν 2 αστερίσκους, χαζομάρα μου :oops:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 21 Ιούλ 2011, 13:55

Αν καταλαβαίνεις πως και γιατί δουλεύει ο παρακάτω κώδικας, τότε είσαι σε καλό δρόμο ;)

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

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
int data;
struct node *next;
} Node;

typedef struct list {
Node *head;
} List;

// -------------------------------------
void head_assign_byValue( Node *head, Node *p )
{
head = p;
return;
}

// -------------------------------------
void head_assign_byReference( Node **head, Node *p )
{
*head = p;
return;
}

// -------------------------------------
int main( void )
{
List list;
Node *p;

// create a node for p
p = calloc( 1, sizeof(Node) );
p->data = 100;
p->next = NULL;

// create a node for list.head
list.head = calloc( 1, sizeof(Node) );
list.head->data = 0;
list.head->next = NULL;

// try to make list.head pointing to p, using pass by value
printf("list.head->data before head_assign_byValue(): %d\n", list.head->data);
head_assign_byValue( list.head, p );
printf("list.head->data after head_assign_byValue(): %d\n\n", list.head->data);

// try to make list.head pointing to p, using pass by reference
printf("list.head->data before head_assign_byReference(): %d\n", list.head->data);
head_assign_byReference( &(list.head), p );
printf("list.head->data after head_assign_byReference(): %d\n", list.head->data);

free( p );
free( list.head );

exit( EXIT_SUCCESS );
}

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

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

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 14:17

migf1 έγραψε:
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
int data;
struct node *next;
} Node;

typedef struct list {
Node *head;
} List;

// -------------------------------------
void head_assign_byValue( Node *head, Node *p )
{
head = p;
return;
}

// -------------------------------------
void head_assign_byReference( Node **head, Node *p )
{
*head = p;
return;
}

// -------------------------------------
int main( void )
{
List list;
Node *p;

// create a node for p
p = calloc( 1, sizeof(Node) );
p->data = 100;
p->next = NULL;

// create a node for list.head
list.head = calloc( 1, sizeof(Node) );
list.head->data = 0;
list.head->next = NULL;

// try to make list.head pointing to p, using pass by value
printf("list.head->data before head_assign_byValue(): %d\n", list.head->data);
head_assign_byValue( list.head, p );
printf("list.head->data after head_assign_byValue(): %d\n\n", list.head->data);

// try to make list.head pointing to p, using pass by reference
printf("list.head->data before head_assign_byReference(): %d\n", list.head->data);
head_assign_byReference( &(list.head), p );
printf("list.head->data after head_assign_byReference(): %d\n", list.head->data);

free( p );
free( list.head );

exit( EXIT_SUCCESS );
}


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

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

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 14:28

1.Έχω παρατηρήσει ότι στο Geany όταν έχω 2 source files ανοιχτά ταυτόχρονα (με tabs) όταν γράφω πχ μια function μου δείχνει πως μπορώ να βάλω και άλλες από αυτές που έχω κάνει στα άλλα ανοιχτά αρχεία! Γιατί;
2.Επίσης όταν έχω ένα πρόγραμμα και το κάνω compile (από το compiler του Geany) μου λέει πως είναι όλα οκ. Μετά όταν φτιάχνω πχ μια εξτρά function και ξανακάνω compile μου βγάζει errors και από αυτά που είχε ήδη ελέγξει! Και ο κώδικας που προσθέτω είναι τελείως ανεξάρτητος :eh: ! Τι γίνεται;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 21 Ιούλ 2011, 14:49

stamatiou έγραψε:
Χωρίς παρεξήγηση αλλά μου φάνηκε αρκετά εύκολο! :eh:

Γιατί παρεξήγηση βρε συ; Ίσα-ίσα είναι πολύ καλό το ότι σου φάνηκε αρκετά εύκολο! Και χαίρομαι κιόλας :)

Δοκίμασες να φτιάξεις για εξάσκηση τις συναρτήσεις που προτείνω στο 6ο μέρος;

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

Μερικές καλές ασκήσεις για να τεστάρουμε τις μέχρι τώρα γνώσεις μας είναι να φτιάξουμε συναρτήσεις για την αναζήτηση ή/και διαγραφή του πρώτου κόμβου που θα βρεθεί να έχει την τιμή: value μέσα στη λίστα, π.χ.: list_del1st( List *list, int value ) και list_find1st( List *list, int value ). Τις αφήνω να τις κάνετε μόνοι σας για εξάσκηση, ενώ αν θέλετε μπορείτε να τις επεκτείνετε σε πιο γενικές, π.χ. να βρίσκουν ή/και να διαγράφουν όλους του κόμβους που περιέχουν την τιμή: value ( list_delete( List *list, int value ) και list_search( List *list, int value ) ).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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