Χαρακτηριστικά υποπρογραμμάτων

Ξεκίνησε από EleniK, 17 Μαρ 2006, 10:48:18 ΠΜ

« προηγούμενο - επόμενο »

EleniK

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

Στα βασικά χαρακτηριστικά των υποπρογραμμάτων λέει ότι 'κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο'.

Δεν μπορεί να γίνει συνάρτηση που να υπολογίζει το εμβαδόν τριγώνου;  Τότε έχουμε 2 εισόδους.
Δεν μπορεί να γίνει διαδικασία που να υπολογίζει το άθροισμα και το γινόμενο 2 αριθμών; 2 είσοδοι, 2 έξοδοι.

Έτσι όπως εξηγείται στο βιβλίο καταλαβαίνω το πώς ενεργοποιείται ή απενεργοποιείται ένα υποπρόγραμμα, αλλά μόνο μία είσοδο και μία έξοδο;
Τι λέτε;

Ευχαριστώ
Ελένη Κοκκίνου
Καθηγήτρια Πληροφορικής, ΠΕ19

P.Tsiotakis


Με τη φράση "μια είσοδος", εννοεί οτι η είσοδος πραγματοποείται σε ΕΝΑ σημείο, δηλαδή στο τμήμα παραμέτρων του υποπρογράμματος. Όμοια και για την έξοδο

alkisg

#2
Διαφωνώ, νομίζω ότι το "μία είσοδος" και "μία έξοδος" εννοούν το ΑΡΧΗ και το ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ ή ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ ή ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ. Δηλαδή όχι είσοδος/έξοδος από το πληκτρολόγιο, την οθόνη ή τη λίστα παραμέτρων, είσοδος/έξοδος από τη ροή εκτέλεσης του προγράμματος.

Αυτό για να είναι πιο κατανοητός ο κώδικας (αντίστοιχα με την αποφυγή της GOTO) και να αποφεύγονται παραδείγματα του τύπου:
int search(int s, int A[])
{
  ...
  for (i = 0; i < 10; i++) {
    ...
    if (s == A[i])
      return i; //σε αυτό το σημείο προκαλείται έξοδος αλλά δεν είναι "σωστό", αντιστοιχεί με goto
    ...
  }
  ...
  return i; //αυτή είναι η κανονική έξοδος, δε θα έπρεπε να υπάρχει άλλη
}

P.Tsiotakis


Σε μια διαδικασία άλλωστε, είσοδος μπορεί να πραγματοποιηθεί και με την εντολή ΔΙΑΒΑΣΕ. Άλκη, έχεις δίκιο (θα πρόσθετα την έννοιας της εισόδου ως πολλά δεδομένα μαζί) ...

Πέτρος

το "είσοδος" και  "εξοδος" έχει να κάνει με τη στοίβα χρόνου εκτέλεσης (execution time stack)  (σ219)

alkisg

#5
Πέτρο αυτό νομίζω δεν έχει νόημα, όπως και να καλέσεις ή να βγεις από μια διαδικασία το τι θα γίνει push ή pop από τη στοίβα θα είναι το ίδιο...

Π.χ. στο παραπάνω παράδειγμα που έδωσα, και η πρώτη και η δεύτερη return τα ίδια πράγματα θα κάνουν pop από τη στοίβα.

Αν κάποιος έκανε goto μέσα σε ή έξω από μια διαδικασία (παρακάμπτοντας έτσι το call stack) τότε στην επόμενη return ο instruction pointer θα πήγαινε σε απροσδιόριστη θέση και θα κολλούσε το πρόγραμμα.

Σωκράτης

Καλημέρα σε όλους,

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

soc_h

alkisg

Όχι. Το παράδειγμά σου είναι αντίστοιχο του "όταν καλώ μια διαδικασία από το κυρίως πρόγραμμα, τότε αυτό είναι σημείο εξόδου;"

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

Επίσης, το καλών υποπρόγραμμα είναι ακόμα "ενεργό", οι μεταβλητές του υπάρχουν ακόμα στη στοίβα, αν και στη ΓΛΩΣΣΑ δεν μπορούμε να τις προσπελάσουμε λόγω εμβέλειας.