τύφλα να 'χει το e-maxx

Συχνά λάθη

Υπάρχουν ορισμένα λάθη (bugs) τα οποία μπορεί να είναι δύσκολα να εντοπιστούν, αλλά προκαλούν το πρόγραμμά μας να μην τρέχει σωστά. Κάποια από αυτά μπορούν να εντοπιστούν με τη χρήση της ρύθμισης -W κατά τη μεταγλώττιση, αλλά πολλές φορές ξεφεύγουν. Εάν παρατηρείτε ότι έχετε πρόβλημα με πολλά bugs, προσπαθήστε να κάνετε εξάσκηση λύνοντας προβλήματα, και να γράφετε πιο αργά έτσι ώστε να τα προσέχετε. Βεβαίως πολλές φορές είναι αναπόφευκτα και για αυτό θα πρέπει να μπορείτε να τα εντοπίζετε. Ακολουθεί μια λίστα με μερικά από τα πιο συνηθισμένα λάθη.

Χρήση άλλης μεταβλητής με παρόμοιο όνομα

Αυτό είναι ένα λάθος που μπορούμε πολλές φορές να αποφεύγουμε χρησιμοποιώντας μεταβλητές με πιο περιγραφικά ονόματα (πχ arr[i] αντί για a[i]), αλλά αυτό πολλές φορές δεν είναι βολικό, όπως στην δομή επανάληψης for.

bool add(int u, int v) {
    return u+u;
}

(συνάρτηση υπολογισμού αθροίσματος)

Σε αυτήν την περίπτωση μπορεί κανείς πολύ εύκολα να μπερδέψει το u και το v, καθώς είναι οπτικά πανομοιότυπα. Για αυτό συστήνεται να αποφεύγετε το συγκεκριμένο ζευγάρι μεταβλητών.

for(int i=1; i<=N; ++i) {
    for(int j=1; j<=M; ++i) {
        scanf("%d", &a[i][j]);
    }
}

(δομή επανάληψης για εισαγωγή δισδιάστατου πίνακα)

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

Τυπογραφικό λάθος σε σύμβολο

Είναι ιδιαίτερα εύκολο κάποια σύμβολα να τα μπερδέψουμε μεταξύ τους όταν γράφουμε, ιδίως όταν βρίσκονται κοντά μεταξύ τους (όπως τα σύμβολα της σύγκρισης (<, >) και της πρόσθεσης ή αφαίρεσης (-, +)). Μια γρήγορη ματιά δεν πρόκειται να τα αποκαλύψει, και συχνά εμφανίζεται το πρόβλημα μόνο σε συγκεκριμένες περιπτώσεις, οπότε μπορεί να μην τα ανακαλύψουμε παρά μόνο όταν είναι πολύ αργά. Άλλο παρόμοιο λάθος που είναι ιδιαίτερα αξιοσημείωτο είναι η χρήση του συμβόλου = σε συγκρίσεις όπου θα έπρεπε να χρησιμοποιήσουμε ==. Για το συγκεκριμένο λάθος δεν προειδοποιεί κανονικά ο μεταγλωττιστής, αλλά με τη ρύθμιση -W είναι εύκολο να εντοπιστεί.

int absolute_value(int val) {
    if(val>0) {
        return -val;
    }
    return val;
}

(συνάρτηση υπολογισμού απόλυτης τιμής μεταβλητής)

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

for(int i=1; i<=N; --i) {
    factorial*=i;
}

(υπολογισμός παραγοντικού)

Σε αυτήν την περίπτωση το λάθος θα γίνει εύκολα αντιληπτό, καθώς θα προκληθεί infinite loop αλλά μπορεί να είναι δύσκολο στον εντοπισμό του.

Σχόλια