Προς το περιεχόμενο

pointers c++


ALLisCHAOS

Προτεινόμενες αναρτήσεις

...

Παρεπιπτόντως, δε ξέρω τι γίνεται σε άλλες σχολές, αλλά στη σχολή που πήγαινα, στον Προγραμματισμό 1 μας έκαναν να συνηθίσουμε με typecasting της επιστρεφόμενης τιμής της malloc. Υπάρχει κάποιος διδακτικός στόχος πίσω από αυτό; Σίγουρα πρέπει να υπάρχει γιατί δεν πιστεύω να μην ήταν ενημερωμένοι. Φαντάζομαι ότι ήθελαν να καταλάβουμε πως περίπου δουλεύει το typecasting.

 

Δεν μπορώ να γνωρίζω, αλλά ίσως επειδή με type-casting δουλεύει και στη C και στη C++ (συν ότι αν ξεχάσεις να κάνεις include τη <stdlib.h> ο compiler θα σου βγάλει warning). Οπότε σου λέει, "με ένα σμπάρο, 2 τρυγόνια" :P

 

Ένας άλλος λόγος μπορεί να είναι, να διαθέτει η σχολή C++ compiler στα εργαστήριά της, οπότε σου λέει "που να τους εξηγώ τώρα, να τα βάζουν πάντα με casting και καθαρίσαμε... χώρια ότι δεν θα χρειαστεί να τα εξηγήσω ούτε στο 2ο 6μηνο που θα κάνουμε C++" :P :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν μπορώ να γνωρίζω, αλλά ίσως επειδή με type-casting δουλεύει και στη C και στη C++ (συν ότι αν ξεχάσεις να κάνεις include τη <stdlib.h> ο compiler θα σου βγάλει warning). Οπότε σου λέει, "με ένα σμπάρο, 2 τρυγόνια" :P

 

Ένας άλλος λόγος μπορεί να είναι, να διαθέτει η σχολή C++ compiler στα εργαστήριά της, οπότε σου λέει "που να τους εξηγώ τώρα, να τα βάζουν πάντα με casting και καθαρίσαμε... χώρια ότι δεν θα χρειαστεί να τα εξηγήσω ούτε στο 2ο 6μηνο που θα κάνουμε C++" :P :P

 

Στο δεύτερο εξάμηνο κάνουμε Java. Στη σχολή υπάρχει μία ιδιαίτερη αγάπη για τη C. Η C++ είναι λίγο ξεχασμένη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στο δεύτερο εξάμηνο κάνουμε Java. Στη σχολή υπάρχει μία ιδιαίτερη αγάπη για τη C. Η C++ είναι λίγο ξεχασμένη.

 

Φοιτητής είσαι;

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

 

Ποιον C compiler είχατε στα εργαστήρια όταν έπαιρνες το σχετικό μάθημα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν ο καθηγητής πάντως είναι μιας κάποιας ηλικίας δεν είναι απίθανο να έμαθε το cast από τα βιβλία της εποχής του και να μην σκέφτηκε ότι ίσως να μην χρειάζεται. πχ ο δικός μου ήταν της εποχής void main(), #include <conio.h>, sizeof(int) == 2 και οι κώδικές του αντικατοπτρίζουν εκείνη την εποχή.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν είσαι σε C++ αλλά θέλεις ντε και καλά να γράφεις κάτι που μοιάζει με C δεν μπορείς να κάνεις και διαφορετικά όμως.

 

FTFY γιατί έτσι που το είπες αρχικά ο operator new στεναχωρέθηκε που δεν του δίνει κανείς σημασία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

FTFY γιατί έτσι που το είπες αρχικά ο operator new στεναχωρέθηκε που δεν του δίνει κανείς σημασία.

 

Δεν ξέρω αν το κάνεις επίτηδες ή όχι με τα offtopic, εμείς πάντως μιλάγαμε για το αν τα malloc/calloc χρειάζονται ή όχι casting στην C και στην C++. Που κολλάει τώρα σε αυτό ο new το γνωρίζεις μόνο εσύ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

FTFY γιατί έτσι που το είπες αρχικά ο operator new στεναχωρέθηκε που δεν του δίνει κανείς σημασία.

Δεν μιλούσαμε για την ομολογουμένως χαζή περίπτωση του να γράφεις c++ και να χρησιμοποιείς malloc αντί για new αλλά για την περίπτωση που είσαι αναγκασμένος για τον χ-ψ λόγο να χρησιμοποιήσεις c++ compiler για τον c κώδικά σου.

 

Αν είσαι σε C++ δεν μπορείς να κάνεις και διαφορετικά όμως.

Δεν ξέρω αν το κάνεις επίτηδες ή όχι με τα offtopic, εμείς πάντως μιλάγαμε για το αν τα malloc/calloc χρειάζονται ή όχι casting στην C και στην C++. Που κολλάει τώρα σε αυτό ο new το γνωρίζεις μόνο εσύ.

Με μια πολύ μικρή δοκιμή που έκανα στο Visual Studio 2010 το συγκεκριμένο μου έπαιξε σωστά. Ενώ το IDE εμφανίζει ένα tilde που όταν πας επάνω τον δρομέα εμφανίζει βοήθεια "an value of void* cannot be copied to an entity of int*" ή κάτι τέτοιο, ο κώδικας γίνεται κανονικά compile χωρίς λάθη (με την προϋπόθεση ότι το αρχείο έχει επέκταση .c ή έχει επιλεγεί ο διακόπτης /tc) οπότε και με το Visual Studio μπορείς να αποφύγεις τελικά το cast. Δεν ξέρω βέβαια πως συμπεριφέρεται στις άλλες διαφορές C-C++.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Με μια πολύ μικρή δοκιμή που έκανα στο Visual Studio 2010 το συγκεκριμένο μου έπαιξε σωστά. Ενώ το IDE εμφανίζει ένα tilde που όταν πας επάνω τον δρομέα εμφανίζει βοήθεια "an value of void* cannot be copied to an entity of int*" ή κάτι τέτοιο, ο κώδικας γίνεται κανονικά compile χωρίς λάθη (με την προϋπόθεση ότι το αρχείο έχει επέκταση .c ή έχει επιλεγεί ο διακόπτης /tc) οπότε και με το Visual Studio μπορείς να αποφύγεις τελικά το cast. Δεν ξέρω βέβαια πως συμπεριφέρεται στις άλλες διαφορές C-C++.

 

Με κατάληξη .c είναι λογικό, με κατάληξη .cpp τι κάνει όμως; Δεν βαράει;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Με κατάληξη .c είναι λογικό, με κατάληξη .cpp τι κάνει όμως; Δεν βαράει;

Λογικά θα βαράει αλλά δεν σε πειράζει αυτό. Η κριτική που δεχόταν το VS ήταν ότι επειδή υλοποιεί βασικά ένα c++ compiler δημιουργεί προβλήματα σε αυτούς που θέλουν να γράψουν C. Αυτός που γράφει C γιατί να αποθηκεύει τα αρχεία με .cpp ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι, δείκτης σε δείκτη είναι. Στο είχα αναφέρει και στην 1η μου απάντηση αν θυμάσαι. Χρησιμότητες υπάρχουν πολλές, αλλά αρκετά συνηθισμένη είναι για να προσομοιώσεις by reference πέρασμα ενός δείκτη σε μια συνάρτηση. Πολύ χρήσιμο π.χ. στις δομές δεδομένων και ιδιαίτερα στο generic programming (π.χ. ADT).

 

Ένα αρκετά πιο απλό παράδειγμα που μου ήρθε τώρα (αλλά και scary για αρχάριο) είναι το παρακάτω:

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

void pswap( void **p1, void **p2 )
{
	void *temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main( void )
{
	char *s1 = "Hello cruel cold world";
	char *s2 = "To be or not to be";

	puts( "Before: " );
	puts( s1 );
	puts( s2 );

	pswap( (void **)&s1, (void **)&s2 );

	puts( "\nAfter: " );
	puts( s1 );
	puts( s2 );

	/* ----------------------------------- */

	int   n = 10,   *pn = &n;
	float f = 1.5f, *pf = &f;

	puts( "\nBefore: " );
	printf( "%d | %g\n", *pn, *pf );

	pswap( (void **)&pn, (void **)&pf );

	puts( "After: " );
	printf( "%g | %d\n", *(float *)pn, *(int *)pf );

	return 0;
}
/*
Έξοδος:

Before:
Hello cruel cold world
To be or not to be

After:
To be or not to be
Hello cruel cold world

Before:
10 | 1.5
After:
1.5 | 10
 */

'Oπως το πες scary για αρχαριο :P

edit: ναι έχω κάτσει κ έχω δει τις σημειώσεις σου , γενικά απ όλα αυτά αρχίζω πέρνω μια ιδέα για το τι εστί pointer

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λογικά θα βαράει αλλά δεν σε πειράζει αυτό. Η κριτική που δεχόταν το VS ήταν ότι επειδή υλοποιεί βασικά ένα c++ compiler δημιουργεί προβλήματα σε αυτούς που θέλουν να γράψουν C. Αυτός που γράφει C γιατί να αποθηκεύει τα αρχεία με .cpp ?

 

Εγώ δεν έχω ακούσει κάτι τέτοιο ως κριτική για το VS (όχι ότι ασχοληθεί και ιδιαίτερα όμως). Η βασική κριτική που έχω ακούσει είναι πως δεν υποστηρίζει πολλά από τα past C90 features της C.

 

Ανεξάρτητα από IDE, ο βασικός λόγος για να κάνει κανείς cast τα malloc()/calloc() στη C είναι όταν έχει κάποιο λόγο να θέλει ο κώδικάς του να γίνεται compiled και με C++  compilers.

 

@ALLisCHAOS: Ναι, το περίμενα κάτι τέτοιο. Απλά ήταν πολύ γενική η ερώτηση που έκανες περί χρησιμότητας των διπλών δεικτών, οπότε σου έβαλα ένα παράδειγμα που να έχει και χρηστικό νόημα ( δηλαδή την pswap() ) και που το θεωρώ σχετικά βατό

 

Το μεγάλο ζόρι νομίζω είναι τα cast της 2ης περίπτωσης, παρά η pswap().

 

Ελπίζω αν κάνεις πιο συγκεκριμένες ερωτήσεις να μπορώ να φανώ περισσότερο χρήσιμος.

 

ΥΓ. Α να μην το ξεχάσω, τα malloc() και new δεν κάνουν την ίδια δουλειά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φοιτητής είσαι;

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

 

Ποιον C compiler είχατε στα εργαστήρια όταν έπαιρνες το σχετικό μάθημα;

 

Είμαι φοιτητής αλλά έχουν περάσει 4 χρόνια από τότε. Είχαμε το gcc. Όπως είπα γενικά υπάρχει μία αγάπη προς τη C στο τμήμα. :P

 

Υ.Γ.: Ευχαριστώ για τα καλά σου λόγια :)

 

Αν ο καθηγητής πάντως είναι μιας κάποιας ηλικίας δεν είναι απίθανο να έμαθε το cast από τα βιβλία της εποχής του και να μην σκέφτηκε ότι ίσως να μην χρειάζεται. πχ ο δικός μου ήταν της εποχής void main(), #include <conio.h>, sizeof(int) == 2 και οι κώδικές του αντικατοπτρίζουν εκείνη την εποχή.

 

Νέος είναι. Απλά μπορεί να μας το είπαν για δικούς του λόγους.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...