Αbominable Δημοσ. 7 Ιουνίου 2006 Δημοσ. 7 Ιουνίου 2006 Έχω δυναμικούς πίνακες και εαν γεμισουν, θέλω να τους προσθέτω νέο χώρο.Έχω φτιάξει μια συνάρτηση την resize_Bucket(), αλλά θελω όσο το δυνατον να την αποφύγω και να την χρησιμοποιήσω μόνο όταν δεν μου δουλέψει η realloc(). οπότε έω γράψει κάτι σαν και αυτό: > [color=red] if(!(bucket=realloc(bucket,newsize))){ printf("\nResize_Bucket is called..\n"); bucket=resize_bucket(bucket,nusize); }[/color] Δυστηχώς εαν κληθεί η realloc και δεν δουλέψει, μου πετάει segm fault. Υπάρχει κάποιος τρόπος να μην κολλήσει αλλά να συνεχίσει μέσα στην if ;; Είναι λάθος η σκέψη μου;;
Legionnaire Δημοσ. 7 Ιουνίου 2006 Δημοσ. 7 Ιουνίου 2006 Edit: Η απάντηση του Sta φαίνεται να είναι η πιο σωστή για το πρόβλημά σου. Αν και χωρίς να δούμε τον κώδικα της resize_bucket() δεν μπορούμε να είμαστε ποτέ σίγουροι.
Sta Δημοσ. 7 Ιουνίου 2006 Δημοσ. 7 Ιουνίου 2006 Ο κώδικάς σου φαίνεται γενικά σωστός, αρκεί να έχεις κάνει include <stdlib.h> βέβαια. Αν όντως όμως αποτύχει η realloc() και επιστρέψει NULL, η τιμή αυτή αποθηκεύεται στο bucket, οπότε καλείς τη συνάρτηση resize_bucket με πρώτο όρισμα NULL! (εξού και το Segfault). Η λύση είναι η εξής: > temp = realloc(bucket,newsize); if (!temp) { /* Call resize_bucket */ } else bucket = temp; Σημειωτέον ότι σε κατάλληλο context η σταθερά NULL θεωρείται ίση με τον (ακέραιο) 0, εξού και επιτρέπονται τα if(temp), if(!temp) κ.τλ. αν ο temp είναι δείκτης. Δεν είναι όμως απαραίτητο η σταθερά NULL να είναι 0, δηλαδή όλα τα bits της να είναι 0.
dop Δημοσ. 8 Ιουνίου 2006 Δημοσ. 8 Ιουνίου 2006 @sta: δεν υπάρχει πρόβλημα για τον έλεγχο NULL, δες την ερώτηση 5.3 στο http://c-faq.com/ . Παρόλα αυτά είναι κακό στυλ.
Αbominable Δημοσ. 8 Ιουνίου 2006 Μέλος Δημοσ. 8 Ιουνίου 2006 Καταρχήν ευχαριστώ για τις απαντήσεις σας. Υπέθετα ότι εαν δεν δουλευε η realloc() δεν θα λειτουργούσε κ η ανάθεση.Μου δούλεψε αυτό που μου είχε προτείνει αρχικά ο Legionnaire..
Sta Δημοσ. 8 Ιουνίου 2006 Δημοσ. 8 Ιουνίου 2006 @sta: δεν υπάρχει πρόβλημα για τον έλεγχο NULL, δες την ερώτηση 5.3 στο http://c-faq.com/[/url'] . Παρόλα αυτά είναι κακό στυλ. Δε νομίζω ότι είπα το αντίθετο. Ίσα ίσα αυτό ακριβώς υποστήριξα.
dop Δημοσ. 9 Ιουνίου 2006 Δημοσ. 9 Ιουνίου 2006 Όντως, έχεις δίκιο. Τι εννοείς σε κατάλληλο context; Δεν ισχύει 0==NULL στην C (στην C++ είναι άλλη ιστορία). Το NULL συνήθως ορίζεται σαν ((void*)0) οπότε δεν είναι ίσο με το 0 - εκτός από περίεργες μηχανές που το NULL έχει μια συγκεκριμένη τιμή !0.
Sta Δημοσ. 9 Ιουνίου 2006 Δημοσ. 9 Ιουνίου 2006 Ήθελα να πω ότι μπορείς να γράψεις: if(p==0) και if (p!=0), που ισοδυναμούν με τα if(!p) και if(p) αντίστοιχα. Στην πρώτη έκφραση λοιπόν, αν p==NULL τότε p==0, που φαίνεται να σημαίνει ότι τα 0,NULL είναι ίσα. Για αυτό και είπα στο κατάλληλο context. Ίσως ήταν και ατυχής η έκφραση όμως. Σίγουρα τη χρησιμοποίησα σε αντιδιαστολή προς το ότι σαν σταθερά η NULL δεν είναι κατ' ανάγκη 0.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.