Το παρακάτω πρόγραμμα δημιουργεί έναν πίνακα με τυχαίους μισθούς και βρίσκει το μέσο μισθό, παραλείποντας όσα κελιά έχουν τιμή μικρότερη ή ίση του μηδενός. Όμως το πρόγραμμα δίνει 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;
}
Συμβουλές
Όποτε δουλεύετε με δείκτες στα προγράμματά σας, να έχετε πάντα στο νου σας τα εξής:
char * πρέπει να έχει αρκετό χώρο για να χωρέσει όλους τους
χαρακτήρες που θέλουμε να βάλουμε συν το τελικό \0.Τρέξτε το στον gdb και δείτε σε ποια γραμμή σκάει και πού δείχνει ο wages. Το
segfault είναι μόνο το πρώτο πρόβλημα: ιχνηλατήστε μετά τον βρόχο while (με ποια τιμή
του i ξεκινά, τι κάνει όταν συναντήσει μη θετικό μισθό) και τον υπολογισμό του μέσου
όρου, και μεταγλωττίστε με -Wall για να δείτε τις προειδοποιήσεις.
Αριθμός στον οδηγό: Α11.18
(στο κεφάλαιο) ·
Μόνιμο αναγνωριστικό: lab-lab08-wages ·
Σύνδεσμος: https://progintro.github.io/study/questions/labs/lab-lab08-wages.html ·
Markdown (GitHub)