Αποστολέας Θέμα: Πίνακας σαν παράμετρος σε υποπρόγραμμα  (Αναγνώστηκε 3124 φορές)

gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2457
  • I 'm not young enough to know everything
Πίνακας σαν παράμετρος σε υποπρόγραμμα
« στις: 01 Απρ 2005, 08:15:55 πμ »
Καλημέρα

Να θέσω ένα ακόμα ερώτημα:

Όταν περνάμε πίνακα σαν παράμετρο σε υποπρόγραμμα, πιστεύετε ότι πρέπει να περνάμε ή όχι σαν παράμετρο και το πλήθος των στοιχείων του πίνακα;

Τι είναι καλύτερο και γιατί;

Στέργιος

  • Επισκέπτης
Re: Πίνακας σαν παράμετρος σε υποπρόγραμμα
« Απάντηση #1 στις: 01 Απρ 2005, 09:20:40 πμ »
Δεν το βλέπω απαραίτητο.
Εξάλλου και στο τετράδιο (σελ 100 παράδειγμα 1) δεν περνάει το πλήθος του πίνακα. Περνάει όμως το πλήθος των στοιχείων που χρησιμοποιούνται. Το πραγματικό μέγεθος του πίνακα είναι 100 και στις δύο περιπτώσεις και ορίζεται μόνο στις δηλώσεις των μεταβλητών.

gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2457
  • I 'm not young enough to know everything
Re: Πίνακας σαν παράμετρος σε υποπρόγραμμα
« Απάντηση #2 στις: 04 Απρ 2005, 10:12:03 πμ »
Χμμμμμμ διατύπωσα λάθος το ερώτημα. Εννοούσα είναι καλύτερο το να περνάς τον πίνακα μόνο ή να περνάς και το πλήθος των στοιχείων που χρησιμοποιούνται;
Δηλαδή οι 2 τρόποι είναι:

1) Κάλεσε Μέγιστος (Πίνακας)
2) Κάλεσε Μέγιστος(Πίνακας,πλήθος)

Στέργιος

  • Επισκέπτης
Re: Πίνακας σαν παράμετρος σε υποπρόγραμμα
« Απάντηση #3 στις: 04 Απρ 2005, 10:30:18 πμ »
Νομίζω ότι πουθενά το βιβλίο δεν περνά το μέγεθος του πίνακα, άρα γιατί να το κάνουμε εμείς;
Κατά τη γνώμη μου αρκεί το:
ΚΑΛΕΣΕ Μέγιστος (Πίνακας)

Στέργιος

  • Επισκέπτης
Re: Πίνακας σαν παράμετρος σε υποπρόγραμμα
« Απάντηση #4 στις: 04 Απρ 2005, 10:35:28 πμ »
Όταν όμως υπάρχει το πλήθος των στοιχείων που χρησιμοποιούνται, είναι καλό να το περνάμε για να μην γίνονται περιττές ενέργειες πχ η ταξινόμηση να μη γίνει για τα κενά στοιχεία του πίνακα.

gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2457
  • I 'm not young enough to know everything
Re: Πίνακας σαν παράμετρος σε υποπρόγραμμα
« Απάντηση #5 στις: 05 Απρ 2005, 02:53:25 μμ »
Αυτό που με ενδιαφέρει εμένα είναι το να φτιαχτεί ένα υποπρόγραμμα (πχ ταξινόμησης) γενικό που να καλείται από όλα τα προγράμματα ανεξάρτητα από το πλήθος των στοιχείων του πίνακα. Δυστυχώς κάτι τέτοιο νομίζω δε γίνεται. Κι αυτό γιατί το πρόγραμμα περνάει στο υποπρόγραμμα παραμετρικά όλα τα στοιχεία του πίνακα. Αυτό σημαίνει ότι στο υποπρόγραμμα θα πρέπει να ορίζεται ο πίνακας (για να δεσμεύεται ο χώρος) και μάλιστα στις διαστάσεις του πίνακα του προγράμματος.

Αυτό δυστυχώς σημαίνει ότι όποιος καλεί ένα υποπρόγραμμα θα πρέπει να ξέρει λεπτομέρειες από την υλοποίησή του και άρα τα υποπρογράμματα δεν είναι στην πραγματικότητα ανεξάρτητα από το κυρίως πρόγραμμα όπως απαιτεί ο δομημένος προγραμματισμός. Δηλαδή αν και η ΓΛΩΣΣΑ φτιάχτηκε για εκπαιδευτικούς σκοπούς και υποτίθεται ότι προωθεί τις αρχές του δομημένου προγραμματισμού (μάλιστα απαγορεύει τη χρήση καθολικών μεταβλητών) τελικά αυτό δε συμβαίνει. Βέβαια αυτό δεν αφορά τους μαθητές, ούτε τους διδάσκοντες, αλλά μόνο τους δημιουργούς της ΓΛΩΣΣΑΣ.

Κάτι που με απασχολεί είναι το εξής:
Αν δηλωθεί ένας πίνακας στο κυρίως πρόγραμμα σαν πίνακας 100 στοιχείων, θα πρέπει στο υποπρόγραμμα να δηλωθεί επίσης σαν πίνακας 100 στοιχείων ή μπορεί να δηλωθεί και σαν πίνακας πχ 200 στοιχείων;
Πιστεύω ότι θα πρέπει και στις 2 περιπτώσεις να δηλωθεί ακριβώς το ίδιο γιατί περνούν παραμετρικά όλα τα στοιχεία του πίνακα και οι παράμετροι πρέπει να είναι του ιδίου τύπου και πλήθους. Έτσι αυτός που φτιάχνει ένα υποπρόγραμμα και αυτός που φτιάχνει το κυρίως πρόγραμμα θα πρέπει να συνεννοηθούν για τη δήλωση.

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

Με ίδιο μέγεθος πίνακα στις δηλώσεις, το πέρασμα του πλήθους των στοιχείων που χρησιμοποιούνται ωφελεί στο να περιορίζουμε τον αριθμό επαναλήψεων.

Μεγάλο ενδιαφέρον έχει ο τρόπος η υλοποίηση που έχουν κάνει οι Kernighan  και Ritchie στη C. Εκεί περνάς σαν παράμετρο τη διεύθυνση της μνήμης στην οποία βρίσκεται το πρώτο στοιχείο (για να ξέρεις που αρχίζει η σάρωση του πίνακα) και το πλήθος των στοιχείων (για να σταματήσει η σάρωση). Επειδή δεν περνάνε τα στοιχεία του πίνακα αυτά καθαυτά, δε χρειάζεται δέσμευση μνήμης για όλα τα στοιχεία και άρα δε χρειάζεται η «κακή δήλωση του πίνακα» μέσα στη συνάρτηση. Τελικά ένα υποπρόγραμμα είναι γενικής φύσεως. Μπορεί να χρησιμοποιηθεί παντού ανεξάρτητα από το πλήθος των στοιχείων που έχει ο πίνακας.

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