pbp Δημοσ. 23 Ιουνίου 2011 Δημοσ. 23 Ιουνίου 2011 Γεια σας, Μήπως μπορεί κανείς να μου εξηγήσει τη διαφορά ανάμεσα στις συναρτήσεις swap1 kai swap2 παρακάτω ? >#include<iostream> using namespace std; void swap1(int **a,int ** { int *t; t=*a; *a=*b; *b=t; } void swap2(int *a,int * { int *t; t=a; a=b; b=t; } main() { int *a,*b,A=5,B=10; a=&A; b=&B; cout<<A<<" "<<B<<endl; cout<<*a<<" "<<*b<<endl; swap1(&a,&; cout<<*a<<" "<<*b<<endl; cout<<A<<" "<<B<<endl; swap2(a,; cout<<*a<<" "<<*b<<endl; cout<<A<<" "<<B<<endl; system("PAUSE"); } Οι συναρτήσεις κάνουν ακριβώς το ίδιο πράγμα αλλά το κάνουν με ίδιο ή διαφορετικό τρόπο ? Ευχαριστώ. to B Κάντε το b στα ορίσματα και στο swap2 στη main(). Δεν ξέρω γιατί τα δείχνει κεφαλαία... Εγώ μικρά τα είχα γράψει και δεν διορθώνονται...
migf1 Δημοσ. 23 Ιουνίου 2011 Δημοσ. 23 Ιουνίου 2011 Στο συγκεκριμένο παράδειγμα το ίδιο πράγμα κάνουν, αλλά με διαφορετικό τρόπο. Η διαφορά είναι πως η swap1 μπορεί να σου εναλλάξει και δείκτες που δείχνουν στην αρχή 2 πινάκων από int, ενώ η swap2 όχι (αυτή εναλλάσσει τις τιμές απλών μεταβλητών τύπου int).
pbp Δημοσ. 23 Ιουνίου 2011 Μέλος Δημοσ. 23 Ιουνίου 2011 Στο συγκεκριμένο παράδειγμα το ίδιο πράγμα κάνουν, αλλά με διαφορετικό τρόπο. Η διαφορά είναι πως η swap1 μπορεί να σου εναλλάξει και δείκτες που δείχνουν στην αρχή 2 πινάκων από int, ενώ η swap2 όχι (αυτή εναλλάσσει τις τιμές απλών μεταβλητών τύπου int). Δηλαδή για να καταλάβω... Οι δύο τρόποι έχουν διαφορά μόνο όταν δουλεύω με πίνακες ?
migf1 Δημοσ. 23 Ιουνίου 2011 Δημοσ. 23 Ιουνίου 2011 Συνήθως ναι. Στο παρακάτω παράδειγμα η swap2 δεν εναλλάσσει τους p1, p2 ενώ η swap1 το κάνει... > #include<stdio.h> // ------------------------------------------------------------------------------ void swap1(int **pp1,int **pp2) { int *t; t = *pp1; *pp1 = *pp2; *pp2 = t; } // ------------------------------------------------------------------------------ void swap2(int *p1, int *p2) { int *t; t = p1; p1 = p2; p2 = t; } // ------------------------------------------------------------------------------ void print_array( int *arr, const int max ) { register int i; for (i=0; i < max; i++) printf("%d ", arr[i]); putchar('\n'); return; } // ------------------------------------------------------------------------------ int main(void) { int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int arr2[10] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; int *p1 = arr1; int *p2 = arr2; print_array(p1, 10); print_array(p2, 10); swap1( &p1, &p2 ); print_array(p1, 10); print_array(p2, 10); swap2(p1, p2); print_array(p1, 10); print_array(p2, 10); fflush(stdin); getchar(); return 0; } EDIT1: όντως κάποια b τα κάνει B το φόρουμ. EDIT2: άλλαξα στον κώδικα τα ονόματα των μεταβλητών EDIT3: έσβησα μια εναλλακτική main() που μάλλον θα σε μπέρδευε χειρότερα Για να στο πω με πιο απλά λόγια, η swap1 εναλλάσσει δείκτες, ενώ η swap2 απλές μεταβλητές.
pbp Δημοσ. 23 Ιουνίου 2011 Μέλος Δημοσ. 23 Ιουνίου 2011 Συνήθως ναι. Στο παρακάτω παράδειγμα η swap2 δεν εναλλάσσει τους p1, p2 ενώ η swap1 το κάνει... > #include<stdio.h> // ------------------------------------------------------------------------------ void swap1(int **pp1,int **pp2) { int *t; t = *pp1; *pp1 = *pp2; *pp2 = t; } // ------------------------------------------------------------------------------ void swap2(int *p1, int *p2) { int *t; t = p1; p1 = p2; p2 = t; } // ------------------------------------------------------------------------------ void print_array( int *arr, const int max ) { register int i; for (i=0; i < max; i++) printf("%d ", arr[i]); putchar('\n'); return; } // ------------------------------------------------------------------------------ int main(void) { int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int arr2[10] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; int *p1 = arr1; int *p2 = arr2; print_array(p1, 10); print_array(p2, 10); swap1( &p1, &p2 ); print_array(p1, 10); print_array(p2, 10); swap2(p1, p2); print_array(p1, 10); print_array(p2, 10); fflush(stdin); getchar(); return 0; } EDIT1: όντως κάποια b τα κάνει B το φόρουμ. EDIT2: άλλαξα στον κώδικα τα ονόματα των μεταβλητών EDIT3: έσβησα μια εναλλακτική main() που μάλλον θα σε μπέρδευε χειρότερα Για να στο πω με πιο απλά λόγια, η swap1 εναλλάσσει δείκτες, ενώ η swap2 απλές μεταβλητές. Σε ευχαριστώ πάρα πολύ φίλε μου! Να σαι καλά
nilosgr Δημοσ. 23 Ιουνίου 2011 Δημοσ. 23 Ιουνίου 2011 Σαν "χρήστης" του προγράμματος δεν αντιλαμβάνεσαι καποοια διαφορά...
migf1 Δημοσ. 23 Ιουνίου 2011 Δημοσ. 23 Ιουνίου 2011 Τίποτα, happy C-ing Σε ευχαριστώ πάρα πολύ φίλε μου! Να σαι καλά
pbp Δημοσ. 24 Ιουνίου 2011 Μέλος Δημοσ. 24 Ιουνίου 2011 Όπα! παρατήρησα το σύμφωνα με το παράδειγμα σου το δικό μου καλύτερα και ανακάλυψα το εξής: >#include<iostream> using namespace std; void swap1(int **a,int ** { int *t; t=*a; *a=*b; *b=t; } void swap2(int *a,int * { int *t; t=a; a=b; b=t; } main() { int *a,*b,A=5,B=10; a=&A; b=&B; cout<<A<<" "<<B<<endl; cout<<*a<<" "<<*b<<endl; //swap1(&a,&; (!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!) cout<<*a<<" "<<*b<<endl; cout<<A<<" "<<B<<endl; swap2(a,; cout<<*a<<" "<<*b<<endl; cout<<A<<" "<<B<<endl; system("PAUSE"); } H swap2 δεν λειτουργεί ούτε εδώ... Το θέμα είναι γιατί? Είναι τελείως λάθος ο τρόπος ?? *** Συνέβει πάλι το ίδιο με το Β κεφαλαίο για ανεξήγητους λόγους. SORRY! Αυτό το παράδειγμα που έκανα το έκανα για να κατανοήσω μια διαφάνεια του καθηγητή μου. Δείτε... Έστω ότι Υλοποιούμε μία δομή στοίβας με απλά συνδεδεμένες λίστες. Η συνάρτηση push() είναι: > //push() χωρίς καθολικές μεταβλητές struct person { char name[10]; int age; struct person *next; }; int push (char nname[10], int nage, struct person **head) //(!) { struct person *data; data=(struct person *) malloc(sizeof(struct person)); if (data==NULL) return 0; data->age=nage; strcpy(data->name,nname); data->next=*head; *head=data; } int main(void) { struct person *stack=NULL,*k; push("Dimitris",31,&stack); //(!) ενώ η συνάρτηση gettop() ειναι: > //gettop() χωρίς καθολικές μεταβλητές struct person { char name[10]; int age; struct person *next; }; int gettop(struct person *head, struct person *p) //(!) { if (*head==NULL) return 0; p->age=head->age; strcpy(p->name,head->name); return 1; } int main(void) { struct person *stack=NULL,k; … gettop(stack,&k); //(!) printf("%s, %d\n",k->name,k->age); Παρατηρήστε πως περνάει στη συνάρτηση την πρώτη φορά το head & πως στην δεύτερη... Το πρώτο μου φαίνεται απόλυτα λογικό αλλά το δεύτερο το χάνω Ειδικά εκείνο το if(*head==NULL) στη συνάρτηση gettop(); δεν μου κάθετε καθόλου ... Δεν υφίσταται αυτό το πράγμα ¨/
migf1 Δημοσ. 24 Ιουνίου 2011 Δημοσ. 24 Ιουνίου 2011 Είμαι πολύ κουρασμένος τώρα για να το δω. Αν δεν με προλάβει άλλο παιδί, θα το κοιτάξω αύριο διεξοδικά. Πες μου κάτι όμως, τον κώδικα των swap1 και swap2 τον έγραψες εσύ ή σας τον έδωσε ο καθηγητής; Μήπως η swap2 πρέπει να είναι έτσι... > void swap2(int *p1, int *p2) { int t; t = *p1; *p1 = *p2; *p2 = t; } Όπως και να έχει, αυτό που ρωτάς για τις στοίβες, το struct person **head είναι pass by reference του δείκτη head μέσα στην συνάρτηση push, ενώ το struct person *head είναι pass by value του δείκτη head μέσα στη συνάρτηση gettop(). Συμπτωματικά είχα μια παρόμοια συζήτηση σήμερα το μεσημέρι, σε άλλο φόρουμ. Νομίζω θα σε βοηθήσει: http://forum.ubuntu-gr.org/viewtopic.php?p=194525#p194525 (ειδικά ο κώδικας στο τέλος εκείνου του ποστ)
pbp Δημοσ. 24 Ιουνίου 2011 Μέλος Δημοσ. 24 Ιουνίου 2011 Είμαι πολύ κουρασμένος τώρα για να το δω. Αν δεν με προλάβει άλλο παιδί, θα το κοιτάξω αύριο διεξοδικά. Πες μου κάτι όμως, τον κώδικα των swap1 και swap2 τον έγραψες εσύ ή σας τον έδωσε ο καθηγητής; Μήπως η swap2 πρέπει να είναι έτσι... > void swap2(int *p1, int *p2) { int t; t = *p1; *p1 = *p2; *p2 = t; } Όπως και να έχει, αυτό που ρωτάς για τις στοίβες, το struct person **head είναι pass by reference του δείκτη head μέσα στην συνάρτηση push, ενώ το struct person *head είναι pass by value του δείκτη head μέσα στη συνάρτηση gettop(). Συμπτωματικά είχα μια παρόμοια συζήτηση σήμερα το μεσημέρι, σε άλλο φόρουμ. Νομίζω θα σε βοηθήσει: http://forum.ubuntu-gr.org/viewtopic.php?p=194525#p194525 (ειδικά ο κώδικας στο τέλος εκείνου του ποστ) Όχι αυτό με το swap το εφτιαξα μόνος μου γιατί επηρεάστηκα από αυτό με τις στοίβες (και είναι λάθος το swap2)(sry για αυτο)... Μπορείς να δεις αύριο σε παρακαλώ αυτό με το if(*head==NULL) που αναφέρω στο τέλος γιατί αυτό μου τα χαλάει πιο πολύ και πιστεύω πως το έχει λάθος ο καθηγητής? Πάω να κοιτάξω το λινκ που μου έστειλες ... Σε ευχαριστώ για το χρόνο σου! θα περιμένω απάντηση αυριο Καλή σου νύχτα!
migf1 Δημοσ. 24 Ιουνίου 2011 Δημοσ. 24 Ιουνίου 2011 Δεν το χει λάθος ο καθηγητής, σωστά το έχει... περνάει τον δείκτη head by reference στην push()... δες το link και τα λέμε από αύριο πάλι, που θα έχω καθαρό μυαλό γιατί τώρα έχει γίνει... ζουμί ΥΓ. Α, οκ για τη swap2... οπότε ο σωστός της κώδικας είναι αυτός που οου έγραψα τώρα στο τέλος. Καλά, ότι να 'ναι γράφω (καλά λέω έχει γίνει ζουμί το μυαλό μου ). Όντως, το: if ( *head == NULL ) στην gettop() είναι άκυρο, αφού το όρισμα head το έχει δηλωμένο ως μονό pointer... if ( head == NULL ) έπρεπε να είναι.
migf1 Δημοσ. 24 Ιουνίου 2011 Δημοσ. 24 Ιουνίου 2011 Καλημέρα, επειδή έχω χάσει λίγο τη μπάλα με το ποιος κώδικας είναι δικός σου και ποιος του καθηγητή, σου παραθέτω σωστό κώδικα για τη στοίβα, σύμφωνα με αυτά που έχεις γράψει μέχρι τώρα... > #include <stdio.h> #include <string.h> #include <stdlib.h> struct person { char name[10]; int age; struct person *next; }; // ------------------------------------------------------------------------------ int push (char nname[10], int nage, struct person **head) //(!) { struct person *p; p = (struct person *) malloc( sizeof(struct person) ); if ( p == NULL ) return 0; p->age = nage; strcpy(p->name, nname); p->next = *head; *head = p; return 1; } // ------------------------------------------------------------------------------ int gettop(struct person *head, struct person *p) //(!) { if (head == NULL) return 0; p->age = head->age; strcpy( p->name, head->name); return 1; } // ------------------------------------------------------------------------------ void stack_destroy( struct person **stack) { // Εδώ κάνε free() όλους τους κόμβους της stack return; } // ------------------------------------------------------------------------------ int main(void) { int success = 0; struct person k, *stack = NULL; success = push("Dimitris", 31, &stack); //(!) if ( success ) { success = gettop( stack, &k ); if ( success ) printf("TOS: name = %s, age = %d\n", k.name, k.age); else puts("gettop() failed"); } else puts("push() failed"); /* * ΣΗΜΑΝΤΙΚΟ: * Πριν τερματίσεις το πρόγραμμά σου γράψε μια συνάρτηση που θα κάνει free() * ΟΛΟΥΣ ΤΟΥΣ ΚΟΜΒΟΥΣ της stack! */ fflush(stdin); getchar(); return 0; } Τον κώδικα της stack_destroy() που θα κάνει free στο τέλος όλους τους κόμβους της στοίβας πρόσθεσέ τον εσύ
pbp Δημοσ. 24 Ιουνίου 2011 Μέλος Δημοσ. 24 Ιουνίου 2011 Καλημέρα, επειδή έχω χάσει λίγο τη μπάλα με το ποιος κώδικας είναι δικός σου και ποιος του καθηγητή, σου παραθέτω σωστό κώδικα για τη στοίβα, σύμφωνα με αυτά που έχεις γράψει μέχρι τώρα... Σε ευχαριστώ πολύ! να σαι καλα Τα κατάλαβα
migf1 Δημοσ. 24 Ιουνίου 2011 Δημοσ. 24 Ιουνίου 2011 Τέλος καλό, όλα καλά. Οπότε τώρα η αρχική μου απάντηση και λάθος έχει την swap2 και αντίκρισμα δεν έχει, αλλά βαριέεεεεεεεεεεεεεεμαι να τη διορθώσω τώρα
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.