Οδηγός Μελέτης - Εισαγωγή στον Προγραμματισμό

Α11.18 · Υπολογισμός μισθών

Εργαστήριο 8, Άσκηση 4 · Δυσκολία ★★☆ · debug · Κεφάλαια: 11, 24

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

#include <stdio.h>

#define N 100

int main(int argc, char ** argv) {
  int i = 0, sum = 0;
  int *wages = NULL;
  srand(N);
  for (i = 0 ; i < N ; i++)
    wages[i] = 700 + (rand()%2301) - 1000;
  while (wages[i] > 0 && i < N) {
    sum += wages[i];
    i++;
  }
  printf("Average wage is %0.2f\n", sum/N);
  return 0;
}

Συμβουλές

Όποτε δουλεύετε με δείκτες στα προγράμματά σας, να έχετε πάντα στο νου σας τα εξής:

  1. Ένας δείκτης δεν αρχικοποιείται σε NULL, αλλά δείχνει σε κάποια τυχαία θέση μνήμης. Είναι πολύ σημαντικό όποτε δηλώνουμε ένα δείκτη να του δίνουμε τιμή NULL, έτσι ώστε όποτε χρησιμοποιείται, να ελέγχουμε πρώτα αν η τιμή του είναι NULL.
  2. Κάθε συμβολοσειρά char * πρέπει να έχει αρκετό χώρο για να χωρέσει όλους τους χαρακτήρες που θέλουμε να βάλουμε συν το τελικό \0.
  3. Όποτε χρησιμοποιούμε πίνακες, πάντα προσέχουμε να μη βγούμε έξω από τα όριά τους.

Υπόδειξη

Τρέξτε το στον gdb και δείτε σε ποια γραμμή σκάει και πού δείχνει ο wages. Το segfault είναι μόνο το πρώτο πρόβλημα: ιχνηλατήστε μετά τον βρόχο while (με ποια τιμή του i ξεκινά, τι κάνει όταν συναντήσει μη θετικό μισθό) και τον υπολογισμό του μέσου όρου, και μεταγλωττίστε με -Wall για να δείτε τις προειδοποιήσεις.

Αριθμός στον οδηγό: Α11.18 (στο κεφάλαιο) · Μόνιμο αναγνωριστικό: lab-lab08-wages · Σύνδεσμος: https://progintro.github.io/study/questions/labs/lab-lab08-wages.html · Markdown (GitHub)