PDA

Επιστροφή στο Forum : Γλώσσα C εντολή άμμεσου τερματισμού



CITRO
01-04-10, 20:16
Γράφω σε C ένα πρόγραμμα ελένχου αρκετά πολύπλοκο με αρκετους εσωτερικούς βρόνχους.Το διάγραμμα ροής μου λέει οτι σε ένα κλειστό βρόνχο σε μια συνθήκη if πρέπει επειγόντος να εκτελέσω κάποιοες προτάσεις και να μεταφερθώ κατευθείαν έξω απο όλους τουσ βρόνχους να αφοπλίσω ένα ρελλέ να κάνω reset τον επεξεργαστή και να τερματίσω το πρόγραμμα.

Θέλω να αποφύγω την GOTO.Ξέρω οτι υπάρχει και η break; αλλα αυτη με βγάζει έχω την εντύπωση έξω απο το loop που βρίσκομαι είδη δεν με πάει στο τέλος.Υπάρχει κάποια άλλη δυνατότητα η τεχνική η υποχρεωτικά με GOTO?
Το εξωτερικό loop είναι ατέρμονο! (while(1))

Μπορώ να βάλω και flags αλλα μην γεμίσω μεταβλητές να είναι ευανάγνοστος ο κώδικας

tasosmos
01-04-10, 20:22
Πρεπει να αλλαξεις το while(1) και να χρησιμοποιησεις αντιστοιχα τις συνθηκες που χρειαζεσαι.
Η break σε βγαζει εξω απο 1 μονο loop οπως ειπες κ εσυ.
Η goto γενικα χρησιμοποιειται μονο σε πολυ ειδικες περιπτωσεις, αποφευγεται η χρηση της.

CITRO
01-04-10, 20:39
Για να καταλάβεις οτι αυτή η συνθήκη πρέπει να εκτελεστεί αμέσως μετα απο μια δειγματοληψία που βρίσκεται σε σιγκεκριμένο σημείο του κώδικα και δεν μπορώ να της αλλάξω θέση.ΣΕ καμία περίπτωση δεν πρέπει να εκτλεστούν οι υπόλοιπες προτάσεις και τα πάντα πρεπει να σβήσουν.Είναι εντολή ασφαλείας και θα ενεργοποιηθεί μόνο οταν κατι πάει στραβά.ΔΕν μπορώ να περιμένω να εκτελεστεί η συνθήκη.Αν δεν υπάρχει κάποια τέτοια εντολή θα φτιάξω flag.

Επ'ισεις μπορώ να βάλω μια συνθήκη στην πάνω While που θα ισχύει πάντα και όταν τα πράγματα δεν πανε καλά και ενερφοποιηθεί η if να χρησιμοποιήσω την continue να με παει στην αρχη του βρόνχου και μετα απο κει να σηκωθώ να φύγω και να τερματίσω και να τα μηδενίσω όλα

Βασικά σε ΄θεματα software τίθονται τεχνικές αξιοποιστίας?Για παραδειγμα ποια τεχνική είναι πιο αξιόπιστη?Μια άμεση με ένα goto μια με σημαιες? μια με δείκτες μια με συνθήκες θέλω να είναι όσο πιο αξιόπιστη γίνεται!!

CITRO
01-04-10, 20:43
αλλα αθτο που μου κάνει εντύπωση είναι οτι και να κάνω εκτος απο μια goto κάνει τον κώδικα πολύ πιο πολύπλοκο και δυσανάγνωστο.Με μια Goto όλα απλουστεύουν!!Γιατι λοιπόν οι σοφτγουεραδες έχουν φάει κόλλημα με την απαγόρευση τέτοιων εντολών άμμεσης μετάβασης!!:001_huh:

kopla
01-04-10, 21:18
Καταρχήν δεν εχω καταλαβει τι είναι εμφωλευμένο που! Αλλά δεν πειράζει.
Απ'ότι γνωριζω η "C" γενικά μιλάω, εχει τις εντολές break και continue. Αυτες ομως μπορούν να συνδυαστούν και με ετικέτα, δλδ να πεις οτι θελεις να κανεις break και που να παει. Αυτό υποκαθιστά τη χρήση του goto.
Το ερώτημα ειναι, εχει τετοια δυνατότητα ο compiler σου? Ναι μεν "C" αλλά όχι C για υπολογιστές.

Το μαυρο πρόβατο εν'ονόματι GOTO αποφεύγεται γιατί δεν προάγει το δομημένο προγραμματισμό.

CITRO
01-04-10, 21:38
1)Προγραμματιζω έναν dspic 30f4011 me με το mplab v7.5 με εναν compiler c30.Πως μπορω να καταλάβω αν δέχεται και τι εντολές δέχεται ο επεξεργαστής?

2)Στον software σχεδιασμο υπάρχει θέμα αξιπιστίας λειτουργίας η όλα γίνονται για να είναι δομημένος ο κώδικας και ευανάγνωστος?Και υπάρχει κόστος στη διαχείριση μνήμης και στην ταχύτητα?δηλαδή κερδίζω σε αξιοπιστία χάνω σε μνήμη και ταχύτητα εκτέλεσης.Σιγουρα αυτα κάπος συνδέονταιΓενικός εκεί τι πρέπει να μπαλαντζάρεις?(Αυτη είναι γενική δεν με απασχολεί τόσο στην εφαρμογή που φτίαχνω αλλα είναι ερ'ωτηση για σοφτγουεραδες)

kopla
01-04-10, 22:01
Πως θα το καταλαβεις... δύο τροποι, θα δεις καποιο manual του compiler ή trial and error τεχνική. Καντο δλδ και αν πετύχει, πέτυχε. C30 δεν εχω χρησιμοποιήσει (μονο C18 αλλά δεν χρειάστηκα goto).
Όταν κατι ειναι δομημενο τοτε γινεται πιο εύκολο στο debugging. Όλα συνδέονται. Τα goto αλλαζουν τον program counter επομένως ειναι μια μικρή καθυστέρηση και χαμένη θεση στη flash. Αλλά είναι περιττά αυτά. Πιο πολύ μας απασχολεί ο compiler για τον κώδικα που παράγει και τι "optimizations" μπορεί να κανει στο σύνολο του κωδικα.
Συνηθως πρωτα σκεφτόμαστε το τι δυσκολια εχει το project μας. Σίγουρα μια γλώσσα υψηλού επιπέδου ειναι πιο φιλική προς τον προγραμματιστή. Επειδή η assembly παράγει συνήθως λιγότερο κώδικα (εκτός αν ο προγραμματιστής δεν εχει εμπειρία), αυτό μας βολέυει αν εχουμε πρόβλημα με τη διαθέσιμη μνήμη flash. Αλλα οι μΕ της microchip εχουν αρκετή. Εαν θέλουμε και μεγαλη ακρίβεια όσον αφορα το χρόνο (πχ χρόνος εκτελεσης, καθυστερήσεις, κτλ) η assembly ειναι καλύτερη.


PS: Το MPLAB 7.50 ειναι πολύ παλιό. Στο 8.46 είναι αυτή τη στιγμή ...