Α.Μ. 1375 FAIL 1413 1417 1420 1421 FAIL 1422 FAIL 1424 1425 FAIL 1426 FAIL - Πρώτα να ελέγχετε αν η malloc επέστρεψε NULL και µετά να προσπαθείτε να προσπελάσετε τη δεσµευµένη µνήµη - Όταν διαβάζετε string να προσδιορίζετε µέγεθος στο %s - Λάθος στον υπολογισµό του µήκους. Έπρεπε να αφαιρείτε διευθύνσεις, όχι χαρακτήρες - Τι είναι η le3h και γιατί τι διαβάζετε από το πληκτρολόγιο? - Το πρόγραµµα δεν κάνει τίποτα. - Τι σκοπό εξυπηρετεί η µεταβλητή flag? Θα βοηθούσε πολύ να της είχατε δώσει ένα όνοµα που περιγράφει τη λειτουργία της, ή τουλάχιστον να βάζατε ένα σχόλιο σε εκείνο το σηµείο. Γενικά δε µπορώ να καταλάβω γιατί ελέγχετε κεφαλαία και µικρά γράµµατα. Τι σχέση έχουν µε την άσκηση? - Το πρόγραµµα φαίνεται να µπαίνει σε endless loop. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h. - Το τέλος του string δεν είναι στο LINESIZE αλλά εκεί που βρίσκεται το \0. - Έπρεπε να ελέγχετε για NULL και µετά το realloc. - Στείλατε το backup αρχείο του Kate αντί για το lab9.c - Να χρησιµοποιείτε περιγραφικά ονόµατα µεταβλητών/συναρτήσεων/τύπων. Τι είναι τα t, p? - Δεν πρέπει να ελέγχετε για isalpha. Δεν υπάρχει καµία εγγύηση ότι η πρόταση δεν περιέχει κι άλλου είδους χαρακτήρες (ψηφία, τελείες, κόµµατα, κτλ) - Το τέλος ενός string είναι εκεί που βρίσκεται το \0 κι όχι το LINESIZE. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h - Σωστή διαχείριση δεικτών κατά τα άλλα. - Να κάνετε έλεγχο για NULL µετά από κάθε malloc. - Δεν αποδεσµεύσατε όλη τη δυναµικά δεσµευµένη µνήµη. - Πολύ καλή προσπάθεια - Πόσο µεγάλη θα ήταν η συνθήκη του if σου αν είχαµε 100 διαχωριστικούς χαρακτήρες? Η άσκηση απαιτούσε τη χρήση συναρτήσεων από τη string.h πράγµα που δεν έκανες. - το j έπρεπε να ξεκινάει από 1, γιατί η θέση 0 του πίνακα περιέχει ήδη δεδοµένα. - Δε δικαιολογείται να κάνετε λάθη στη σύνταξη της for! Έπρεπε να είχατε γράψει for ( ; j<=i; j++) και όχι for (j<=i ; j++; ). Γενικά ότι κάνετε σε αυτό το for είναι λάθος. Το *addr είναι πάντα η ίδια τιµή και δεν είναι καν αυτό που πρέπει να εκτυπώνεται. - Το while loop είναι ατέρµονο γιατί στην περίπτωση ι==0 δεν αλλάζετε το addr. - Ακόµη κι αν διορθώσετε αυτό, θα κάνει segfault γιατί όταν το addr γίνει NULL δε βγαίνετε άµεσα από το loop. - Στο sep δεν έπρεπε να περιλαµβάνονται κόµµα/τελεία - Μετά από malloc/realloc, να κάνετε πάντα έλεγχο για NULL - Η strtok καταστρέφει το αρχικό string αλλά και τη χρησιµοποιείτε λάθος.. Γενικά δε χρησιµοποιείτε σωστά τις συναρτήσεις string. Για ποιο λόγο κάνατε strcspn(sentence, "") αντί να χρησιµοποιήσετε απλά την strlen? - Να δίνετε περιγραφικά ονόµατα σε µεταβλητές/τύπους. Τι είναι το v? Δείγµα παπαγαλίας από τις διαφάνειες? Η εκφώνηση σας πρότεινε το όνοµα words για τον πίνακα, δεν υπήρχε λόγος να το αγνοήσετε. - Δεν έχετε κάνει κάτι άλλο πέρα από δέσµευση µνήµης. - Καλή δουλειά όσον αφορά ζητήµατα µνήµης, αλλά δε χρησιµοποιείτε συναρτήσεις από τη string.h όπως απαιτούσε η εκφώνηση. Page 1
1428 FAIL 1429 FAIL 1430 1431 FAIL 1433 1435 1436 - Η strtok δεν είναι καλή επιλογή γιατί καταστρέφει την αρχική πρόταση. - Ποιος ο λόγος για τον έλεγχο isalpha? Δεν είναι απαραίτητο να αποτελείται µόνο από γράµµατα ή διαχωριστικά η πρόταση. - Τι είναι το temp? Να δίνετε περιγραφικά ονόµατα σε µεταβλητές - Στη γραµµή 49, αντί για &sentence[0] µπορούσατε να είχατε γράψει απλά sentence. Είναι ακριβώς το ίδιο πράγµα. - Δεν αλλάζετε το µέγεθος του words (µε realloc) - Δεν εκτυπώνετε τίποτα - Δεν απελευθερώνετε τη δυναµικά δεσµευµένη µνήµη - Το όνοµα του αρχείου έπρεπε να είναι lab9.c - Έπρεπε και η απόσταση και οι διευθύνσεις να υπολογιστούν µε χρήση συναρτήσεων strings και όχι διατρέχοντας το string ένα-ένα χαρακτήρα - Το µέγεθος στο %s στο scanf έπρεπε να είναι 99 κι όχι 100! - Να ελέγχετε για NULL µετά από κάθε malloc. - Είστε σε καλό δρόµο αλγοριθµικά, αλλά θέλει δουλειά ακόµη. - Το όνοµα του αρχείου έπρεπε να είναι lab9.c - Δε χρησιµοποιείτε συναρτήσεις από τη string.h όπως απαιτούσε η άσκηση - Όταν ένα string έχει µέγεθος LINESIZE, ο τελευταίος χαρακτήρας είναι στη θέση LINESIZE-1. Έπρεπε να το ξέρετε αυτό! Επιπλέον, ο τελευταίος χρήσιµος χαρακτήρας του string είναι ο αµέσως προηγούµενος του \0, οπότε σε κάθε περίπτωση ΔΕΝ πρέπει να διατρέχετε µέχρι το LINESIZE. - Δεν υπολογίζετε την απόσταση. - Να διαβάζετε προσεκτικά την εκφώνηση. Σας έλεγε ότι το βήµα 6 έπρεπε να γίνει ξεχωριστά από τα προηγούµενα βήµατα. - Στο sep δεν έπρεπε να περιλαµβάνονται κόµµα/τελεία - Μετά από malloc/realloc, να κάνετε πάντα έλεγχο για NULL - Η strtok καταστρέφει το αρχικό string αλλά και τη χρησιµοποιείτε λάθος.. Γενικά δε χρησιµοποιείτε σωστά τις συναρτήσεις string. Για ποιο λόγο κάνατε strcspn(sentence, "") αντί να χρησιµοποιήσετε απλά την strlen? - Να δίνετε περιγραφικά ονόµατα σε µεταβλητές/τύπους. Τι είναι το v? Δείγµα παπαγαλίας από τις διαφάνειες? Η εκφώνηση σας πρότεινε το όνοµα words για τον πίνακα, δεν υπήρχε λόγος να το αγνοήσετε. - Για το sentence προσδιορίσατε µέγεθος 20, οπότε έπρεπε να το διαβάζετε µε %19s κι όχι µε %20s. - Να διαβάζετε ΟΛΟΚΛΗΡΗ την εκφώνηση. Το LINESIZE έπρεπε να είναι 100. - Να κάνετε έλεγχο για NULL µετά από κάθε malloc. - Στη συνθήκη του while συγκρίνετε το sentence που είναι δείκτης µε το '\0' που είναι χαρακτήρας! - Το printf είναι λάθος. Έπρεπε να διατρέχετε ολόκληρο πίνακα! Page 2
1438 FAIL 1440 FAIL 1442 FAIL 1444 FAIL 1445 FAIL 1447 1448 FAIL 1453 FAIL 1454 - Δε δικαιολογείται να κάνετε λάθη στη σύνταξη της for! Έπρεπε να είχατε γράψει for ( ; j<=i; j++) και όχι for (j<=i ; j++; ). Γενικά ότι κάνετε σε αυτό το for είναι λάθος. Το *addr είναι πάντα η ίδια τιµή και δεν είναι καν αυτό που πρέπει να εκτυπώνεται. - Το while loop είναι ατέρµονο γιατί στην περίπτωση ι==0 δεν αλλάζετε το addr. - Ακόµη κι αν διορθώσετε αυτό, θα κάνει segfault γιατί όταν το addr γίνει NULL δε βγαίνετε άµεσα από το loop. - Καλή δουλειά όσον αφορά ζητήµατα µνήµης, αλλά δε χρησιµοποιείτε συναρτήσεις από τη string.h όπως απαιτούσε η εκφώνηση. - Η strtok δεν είναι καλή επιλογή γιατί καταστρέφει την αρχική πρόταση. - Ποιος ο λόγος για τον έλεγχο isalpha? Δεν είναι απαραίτητο να αποτελείται µόνο από γράµµατα ή διαχωριστικά η πρόταση. - Τι είναι το temp? Να δίνετε περιγραφικά ονόµατα σε µεταβλητές - Στη γραµµή 49, αντί για &sentence[0] µπορούσατε να είχατε γράψει απλά sentence. Είναι ακριβώς το ίδιο πράγµα. - Δεν αλλάζετε το µέγεθος του words (µε realloc) - Δεν εκτυπώνετε τίποτα - Δεν απελευθερώνετε τη δυναµικά δεσµευµένη µνήµη - Όταν διαβάζετε string να προσδιορίζετε µέγεθος στο %s - Να χρησιµοποιείτε περιγραφικά ονόµατα µεταβλητών. Τι σηµαίνει v? - Δεν έπρεπε καν να υπάρχει το v. Τα δεδοµένα αποθηκεύονται στον πίνακα arxi. - Το πρόγραµµα δεν κάνει πολλά πέρα των malloc/free - Να κάνετε έλεγχο για NULL µετά από χρήση malloc - Το πρόγραµµα δεν κάνει πολλά πράγµατα πέρα του malloc και free - Δεν υπάρχει καµία εγγύηση ότι θα χρησιµοποιηθούν όλα τα κελιά του words. Το loop δεν έπρεπε να πηγαίνει µέχρι LINESIZE/2. - Την ανάθεση στα πεδία του words έπρεπε να την κάνετε µέσα σε loop όχι απέξω. Θα βοηθούσε αν είχατε καλή στοίχιση - Το πρόγραµµα δεν εκτυπώνει αποτελέσµατα και τα printf που έχετε σε σχόλια δε δείχνουν να έχετε καταλάβει τι έπρεπε να εκτυπωθεί και πώς. - Να κάνετε έλεγχο για NULL µετά από χρήση malloc - Το πρόγραµµα δεν κάνει πολλά πράγµατα πέρα του malloc και free - Το όνοµα του αρχείου έπρεπε να είναι lab9.c - Δε χρησιµοποιείτε συναρτήσεις από τη string.h όπως απαιτούσε η άσκηση - Όταν ένα string έχει µέγεθος LINESIZE, ο τελευταίος χαρακτήρας είναι στη θέση LINESIZE-1. Έπρεπε να το ξέρετε αυτό! Επιπλέον, ο τελευταίος χρήσιµος χαρακτήρας του string είναι ο αµέσως προηγούµενος του \0, οπότε σε κάθε περίπτωση ΔΕΝ πρέπει να διατρέχετε µέχρι το LINESIZE. - Άσχηµη στοίχιση - Μετά από χρήση strncpy πρέπει να θέτετε πάντα το '\0' - Πολύ καλή προσπάθεια Page 3
1456 1457 FAIL 1458 FAIL 1459 1460 FAIL 1461 FAIL 1462 1463 1464 - Δεν υπάρχει καµία εγγύηση ότι θα χρησιµοποιηθούν όλα τα κελιά του words. Το loop δεν έπρεπε να πηγαίνει µέχρι LINESIZE/2. - Την ανάθεση στα πεδία του words έπρεπε να την κάνετε µέσα σε loop όχι απέξω. Θα βοηθούσε αν είχατε καλή στοίχιση - Το πρόγραµµα δεν εκτυπώνει αποτελέσµατα και τα printf που έχετε σε σχόλια δε δείχνουν να έχετε καταλάβει τι έπρεπε να εκτυπωθεί και πώς. - Δεν έχετε κάνει κάτι άλλο πέρα από δέσµευση µνήµης. - Να προσδιορίζεις πάντα µέγεθος στο %s όταν διαβάζεις string. - Η άσκηση δεν κάνει πολλά πράγµατα πέρα της δέσµευσης µνήµης - Τι είναι το adr2 και γιατί δεσµεύετε µνήµη γι'αυτό? Για το words έπρεπε να είχατε δεσµεύσει µνήµη δυναµικά. - Η συνθήκη στο while είναι λάθος. Δεν υπάρχει εγγύηση ότι θα γεµίσουν όλες οι θέσεις του πίνακα words. Ακόµη χειρότερα, πάτε µέχρι και LINESIZE/2 το οποίο σηµαίνει ότι βγαίνετε εκτός ορίων του words. - Το πρόγραµµα δεν εκτυπώνει τίποτα όσον αφορά τον αλγόριθµο εύρεσης των θέσεων - Να αποδεσµεύετε πάντα τη δυναµικά δεσµευµένη µνήµη του προγράµµατος. - Καλή δουλειά όσον αφορά ζητήµατα µνήµης, αλλά δε χρησιµοποιείτε συναρτήσεις από τη string.h όπως απαιτούσε η εκφώνηση. - Όταν διαβάζετε string να προσδιορίζετε µέγεθος στο %s - Να χρησιµοποιείτε περιγραφικά ονόµατα µεταβλητών. Τι σηµαίνει v? - Δεν έπρεπε καν να υπάρχει το v. Τα δεδοµένα αποθηκεύονται στον πίνακα arxi. - Το πρόγραµµα δεν κάνει πολλά πέρα των malloc/free - Αν η malloc επιστρέψει NULL, το πρόγραµµα δεν πρέπει να συνεχίζει την εκτέλεση! - Μετά από χρήση strncpy πρέπει να θέτετε το '\0'. - Καλά σκεφτήκατε να ελέγχετε για NULL κατά την εκτύπωση, αλλά ελέγχετε τη λάθος ποσότητα. - Να προσδιορίζεις πάντα µέγεθος στο %s όταν διαβάζεις string - Να ελέγχεις για NULL µετά από κάθε malloc - Τρέξε το πρόγραµµα µέσω gdb για να βρεις το λάθος - Να αποδεσµεύεις όλη τη δυναµικά δεσµευµένη µνήµη - Έπρεπε να διαβάζετε το διαχωριστικό από το πληκτρολόγιο, κι όχι να χρησιµοποιείτε το "HIC" - Βρίσκετε µόνο την πρώτη λέξη και µετά το loop δεν ανανεώνει τις τιµές των µεταβλητών για να µπορέσετε να βρείτε και τις υπόλοιπες. - Μετά τη χρήση strncpy πρέπει πάντα να θέτετε το '\0' - Δεν υπάρχει καµία εγγύηση ότι ο πίνακας words θα έχει γεµισµένα όλα τα κελιά του. Τα loops δεν έπρεπε να πηγαίνουν µέχρι LINESIZE. - Δεν απελευθερώνετε όλη τη δυναµικά δεσµευµένη µνήµη. Page 4
1465 FAIL 1466 FAIL 1467 1468 FAIL 1469 FAIL 1470 - Το πρόγραµµα δεν κάνει compile. Προσθέτετε pointer σε pointer, πράγµα που απαγορεύεται. - Τι είναι αυτό? : while (words->word < (words->word + LINESIZE)) Δε συγκρίνουµε ποτέ string µε <, αλλά µε strcmp. Στη συγκεκριµένη άσκηση δεν έπρεπε καν να συγκρίνετε strings. - Το words είναι πίνακας. Το words->word αναφέρεται πάντα στο πρώτο στοιχείο του, οπότε οι αναθέσεις που κάνετε στο loop γίνονται πάντα στο ίδιο στοιχείο. - Μετά από χρήση strncpy να θέτετε πάντα το '\0' - Μη γράφετε ποτέ τόσο πολύ κώδικα χωρίς να τον τεστάρετε κάθε τόσο για να βεβαιώνεστε ότι δουλεύει σωστά. - Δεν αποδεσµεύετε σωστά τη δυναµικά δεσµευµένη µνήµη -Μετά από malloc να κάνετε πάντα έλεγχο για NULL - Το µέγεθος στο %s έπρεπε να είναι 99 κι όχι 100. - Γιατί έχετε βάλει ολόκληρη πρόταση στο scanf? Άλλο ζητούσε η εκφώνηση. - Τι σκοπό εξυπηρετούν τα δύο for? - Δεν έχετε κάνει κάτι ιδιαίτερο πέρα των malloc/free - Αν η malloc επιστρέψει NULL, το πρόγραµµα δεν πρέπει να συνεχίζει την εκτέλεση! - Μετά από χρήση strncpy πρέπει να θέτετε το '\0'. - Καλά σκεφτήκατε να ελέγχετε για NULL κατά την εκτύπωση, αλλά ελέγχετε τη λάθος ποσότητα. - Τι είναι το g? Να χρησιµοποιείς περιγραφικά ονόµατα µεταβλητών - Λάθος format specifier στο τελευταίο printf. Έπρεπε να εκτυπώνεις το *words[j].point το οποίο είναι χαρακτήρας. Να διαβάζεις προσεκτικά τα warnings του compiler - Δε χρησιµοποιείς σωστά το malloc. Πρέπει να πολλαπλασιάζεις το πλήθος των θέσεων που θες να δεσµεύσεις µε το µέγεθός τους. - Μετά από malloc/realloc, να ελέγχεις πάντα για NULL - Να προσδιορίζεις πάντα µέγεθος στο %s όταν διαβάζεις strings - Πρόσεχε τη στοίχιση! - Γιατί κάνεις παντού typecast? στον αλγόριθµο - Σωστό το struct αλλά φαίνεται να παπαγαλίσατε τις διαφάνειες. Αλλάζετε το όνοµα του struct µε typedef αλλά µετά δεν το χρησιµοποιείτε παντού. Τι όνοµα είναι το b??? Να δίνετε περιγραφικά ονόµατα! - Λάθος µέγεθος στο %s. Έπρεπε να είναι %99s, όχι %100s - Μετά από malloc να ελέγχετε πάντα για NULL - Λάθος λογική. Το i σας λέει πού είναι ο διαχωριστικός χαρακτήρας, όχι πού είναι η λέξη. Έπρεπε να το αυξάνετε κατά 1 µετά την strcspn. Επίσης, αφού το υπολογίζετε (έστω και µε λάθος) γιατί δε θέτετε και το πεδίο len? - Το j πηγαίνει µέχρι LINESIZE και το χρησιµοποιείτε για να διατρέξετε το words το οποίο όµως έχει µέγεθος LINESIZE/2! - Μην κολλάτε στη διάτρεξη των strings κατά ένα χαρακτήρα τη φορά! Επίσης, το τέλος του string είναι εκεί που βρίσκεται το \0 κι όχι στο LINESIZE. - Το πρόγραµµα δεν εκτυπώνει αποτελέσµατα και δε δείχνετε αν ξέρετε να προσπελάσετε τα πεδία που struct για εκτύπωση. - Δεν έχετε διατυπώσει καλά τον έλεγχο για NULL µετά τη malloc. Έτσι όπως το κάνατε (µε εµφωλευµένα if), αν είχατε καµια 10αριά malloc, πόσα tab πιο µέσα θα κατέληγε ο κώδικάς σας? Καλύτερα να ελέγχετε αν είναι NULL, κι αν ναι, να τερµατίζετε το πρόγραµµα ή τη συνάρτηση. - Μπράβο που αποδεσµεύετε τη µνήµη και για τα.word, αλλά προσέξτε: δεν έχουν γεµίσει όλα τα κελιά του pinakas_words, οπότε δεν έπρεπε να πηγαίνετε µέχρι LINESIZE. Page 5
1472 FAIL 1474 1478 FAIL 1479 FAIL 1483 1484 FAIL 1485 1486 - Πρώτα να ελέγχετε αν η malloc επέστρεψε NULL και µετά να προσπαθείτε να προσπελάσετε τη δεσµευµένη µνήµη - Όταν διαβάζετε string να προσδιορίζετε µέγεθος στο %s - Λάθος στον υπολογισµό του µήκους. Έπρεπε να αφαιρείτε διευθύνσεις, όχι χαρακτήρες - Τι είναι η le3h και γιατί τι διαβάζετε από το πληκτρολόγιο? - Το πρόγραµµα δεν κάνει τίποτα. - Δεν υπολογίζετε την απόσταση. - Να διαβάζετε προσεκτικά την εκφώνηση. Σας έλεγε ότι το βήµα 6 έπρεπε να γίνει ξεχωριστά από τα προηγούµενα βήµατα. - Μην αγνοείτε τα warnings. Δεν έχετε κάνει #include το string.h - Απαράδεκτη στοίχιση! - Συγκρίνετε θέση πίνακα (i) µε περιεχόµενα ('\0'). Δε δικαιολογούνται τέτοια λάθη! - Πολλά προβλήµατα στην άσκηση. - Μην αγνοείτε τα warnings. Δεν έχετε κάνει #include το string.h - Απαράδεκτη στοίχιση! - Συγκρίνετε θέση πίνακα (i) µε περιεχόµενα ('\0'). Δε δικαιολογούνται τέτοια λάθη! - Πολλά προβλήµατα στην άσκηση. - Δεν έχετε διατυπώσει καλά τον έλεγχο για NULL µετά τη malloc. Έτσι όπως το κάνατε (µε εµφωλευµένα if), αν είχατε καµια 10αριά malloc, πόσα tab πιο µέσα θα κατέληγε ο κώδικάς σας? Καλύτερα να ελέγχετε αν είναι NULL, κι αν ναι, να τερµατίζετε το πρόγραµµα ή τη συνάρτηση. - Μπράβο που αποδεσµεύετε τη µνήµη και για τα.word, αλλά προσέξτε: δεν έχουν γεµίσει όλα τα κελιά του pinakas_words, οπότε δεν έπρεπε να πηγαίνετε µέχρι LINESIZE. - Το πρόγραµµα δεν κάνει compile - Το µέγεθος στο %s έπρεπε να είναι 99, κι όχι 100 - Να ελέγχετε για NULL µετά από κάθε malloc - Δεν κάνετε πολλά πράγµατα στο αλγοριθµικό κοµµάτι - Η αρχικοποίηση του characters θα µπορούσε να είχε γίνει πιο απλά: char characters[]="!@#$%^&*" - Μετά από malloc να ελέγχετε πάντα για NULL - Στην κλήση της strpbrk έχετε βάλει ανάποδα τις παραµέτρους - Λάθος λογική. Μην κολλάτε στη διάτρεξη των string κατά ένα χαρακτήρα τη φορά! Το i έπρεπε να αυξάνεται µε βάση το µήκος της λέξης που εντοπίστηκε κι όχι µε ++. Επίσης, αν δε βρεθούν οι διαχωριστικοί χαρακτήρες στο string, πρέπει να τερµατίζει το loop. Τέλος, µην ξεχνάτε ότι το string ουσιαστικά τελειώνει εκεί που είναι το \0 κι ΟΧΙ στο LINESIZE. - Στο realloc, γιατί κάνατε typecast το words σε (void*)? Είναι λάθος. - Ο αλγόριθµος έχει κάποια σωστά στοιχεία αλλά θέλει δουλειά ακόµη. Page 6
1487 1489 1490 1491 FAIL 1492 FAIL 1493 FAIL 1497 1498 1501 FAIL - Έπρεπε να διαβάζετε το διαχωριστικό από το πληκτρολόγιο, κι όχι να χρησιµοποιείτε το "HIC" - Βρίσκετε µόνο την πρώτη λέξη και µετά το loop δεν ανανεώνει τις τιµές των µεταβλητών για να µπορέσετε να βρείτε και τις υπόλοιπες. - Μετά τη χρήση strncpy πρέπει πάντα να θέτετε το '\0' - Δεν υπάρχει καµία εγγύηση ότι ο πίνακας words θα έχει γεµισµένα όλα τα κελιά του. Τα loops δεν έπρεπε να πηγαίνουν µέχρι LINESIZE. - Δεν απελευθερώνετε όλη τη δυναµικά δεσµευµένη µνήµη. - Στο τέλος έπρεπε να εκτυπώνετε το χαρακτήρα στη διεύθυνση (words+i)->beg κι όχι το string. - Το µέγεθος στο %s στο scanf έπρεπε να είναι 99 κι όχι 100! - Να ελέγχετε για NULL µετά από κάθε malloc. - Είστε σε καλό δρόµο αλγοριθµικά, αλλά θέλει δουλειά ακόµη. - Δεν κατασκευάσατε φάκελο για να βάλετε µέσα το lab9.c. Να ακολουθείτε τις οδηγίες. - Λάθος στη σύνταξη της malloc. Τι σχέση έχει το (int *)? Μην παπαγαλίζετε τις διαφάνειες. - Δεν έχετε κάνει κάτι πέρα της δέσµευσης µνήµης. - Το πρόγραµµα δεν κάνει compile. Μην περιµένετε µέχρι τελευταία στιγµή για να κάνετε compile! Το λάθος που δεν προλάβατε να διορθώσετε ήταν τα άγκιστρο από if που ελέγχουν το αποτέλεσµα του malloc. - Το πρόγραµµα δεν κάνει compile. Προσθέτετε pointer σε pointer, πράγµα που απαγορεύεται. - Τι είναι αυτό? : while (words->word < (words->word + LINESIZE)) Δε συγκρίνουµε ποτέ string µε <, αλλά µε strcmp. Στη συγκεκριµένη άσκηση δεν έπρεπε καν να συγκρίνετε strings. - Το words είναι πίνακας. Το words->word αναφέρεται πάντα στο πρώτο στοιχείο του, οπότε οι αναθέσεις που κάνετε στο loop γίνονται πάντα στο ίδιο στοιχείο. - Μετά από χρήση strncpy να θέτετε πάντα το '\0' - Μη γράφετε ποτέ τόσο πολύ κώδικα χωρίς να τον τεστάρετε κάθε τόσο για να βεβαιώνεστε ότι δουλεύει σωστά. - Δεν αποδεσµεύετε σωστά τη δυναµικά δεσµευµένη µνήµη - Το αρχείο έπρεπε να λέγεται lab9.c - Η παράµετρος της strcspn δεν έπρεπε να είναι κάθε φορά η ίδια, γιατί τότε θα βρίσκει σε κάθε επανάληψη το ίδιο αποτέλεσµα. - Μην κολλάτε στη διάτρεξη των string ένα χαρακτήρα τη φορά! Χρησιµοποιείστε έξυπνα τα αποτελέσµατα των συναρτήσεων για strings για να βρείτε πότε να τερµατίσει η επανάληψη. - Τι σκοπό εξυπηρετεί η µεταβλητή flag? Θα βοηθούσε πολύ να της είχατε δώσει ένα όνοµα που περιγράφει τη λειτουργία της, ή τουλάχιστον να βάζατε ένα σχόλιο σε εκείνο το σηµείο. Γενικά δε µπορώ να καταλάβω γιατί ελέγχετε κεφαλαία και µικρά γράµµατα. Τι σχέση έχουν µε την άσκηση? - Το πρόγραµµα φαίνεται να µπαίνει σε endless loop. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h. Μην κολλάτε στη διάτρεξη strings κατά ένα χαρακτήρα τη φορά! - Το τέλος του string δεν είναι στο LINESIZE αλλά εκεί που βρίσκεται το \0. - Έπρεπε να ελέγχετε για NULL και µετά το realloc. - Το πρόγραµµα δεν κάνει compile. Μην περιµένετε µέχρι τελευταία στιγµή για να κάνετε compile! Το λάθος που δεν προλάβατε να διορθώσετε ήταν τα άγκιστρο από if που ελέγχουν το αποτέλεσµα του malloc. Page 7
1502 - Μετά από malloc να κάνετε πάντα έλεγχο για NULL. - Το wordadd είναι char *. Γιατί έχετε sizeof(struct infot) στο malloc του? - Δεδοµένου ότι το sentence δεν αλλάζει µέσα στο loop, η συνθήκη του while θα είναι πάντα αληθής και η επανάληψη δε θα τερµατίσει ποτέ. πάντως... 1503 1504 1505 1506 1508 1510 FAIL 1511 FAIL - Το αρχείο έπρεπε να λέγεται lab9.c - Η παράµετρος της strcspn δεν έπρεπε να είναι κάθε φορά η ίδια, γιατί τότε θα βρίσκει σε κάθε επανάληψη το ίδιο αποτέλεσµα. - Μην κολλάτε στη διάτρεξη των string ένα χαρακτήρα τη φορά! Χρησιµοποιείστε έξυπνα τα αποτελέσµατα των συναρτήσεων για strings για να βρείτε πότε να τερµατίσει η επανάληψη. - Στείλατε το backup αρχείο του Kate αντί για το lab9.c - Να χρησιµοποιείτε περιγραφικά ονόµατα µεταβλητών/συναρτήσεων/τύπων. Τι είναι τα t, p? - Δεν πρέπει να ελέγχετε για isalpha. Δεν υπάρχει καµία εγγύηση ότι η πρόταση δεν περιέχει κι άλλου είδους χαρακτήρες (ψηφία, τελείες, κόµµατα, κτλ) - Το τέλος ενός string είναι εκεί που βρίσκεται το \0 κι όχι το LINESIZE. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h - Σωστή διαχείριση δεικτών κατά τα άλλα. - Να χρησιµοποιείτε περιγραφικά ονόµατα µεταβλητών. Τι σηµαίνει a? - Μετά από κάθε malloc να κάνετε έλεγχο για NULL - Μετά από χρήση strncpy να θέτε πάντα το '\0' - Το τελευταίο for στο πρόγραµµα είναι τραγικό... - Να χρησιµοποιείτε περιγραφικά ονόµατα µεταβλητών. Τι σηµαίνει a? - Μετά από κάθε malloc να κάνετε έλεγχο για NULL - Μετά από χρήση strncpy να θέτε πάντα το '\0' - Το τελευταίο for στο πρόγραµµα είναι τραγικό... - Να χρησιµοποιείτε περιγραφικά ονόµατα µεταβλητών. Τι σηµαίνει temp? - Μετά από χρήση strncpy να θέτετε πάντα το '\0'. - Μη σκέφτεστε ότι τα strings τα διατρέχουµε πάντα ένα-ένα χαρακτήρα. Στη συγκεκριµένη περίπτωση δε θέλουµε να το κάνουµε αυτό, οπότε η συνθήκη σας είναι λάθος. - Δεν αποδεσµεύετε τη δυναµικά δεσµευµένη µνήµη, - Το πρόγραµµα δεν κάνει compile - Το µέγεθος στο %s έπρεπε να είναι 99, κι όχι 100 - Να ελέγχετε για NULL µετά από κάθε malloc - Δεν κάνετε πολλά πράγµατα στο αλγοριθµικό κοµµάτι - Τι είναι τα c, s? Να δίνετε περιγραφικά ονόµατα στις µεταβλητές σας. - Το words->address είναι πάντα το πρώτο στοιχείο του πίνακα. Φαίνεται να µην έχετε καταλάβει καλά τη µορφή της δοµής. Page 8
1512 FAIL 1514 - Πολύ καλή προσπάθεια 1515 FAIL - Στείλατε το lab8 1516 1517 - Πολύ καλή προσπάθεια 1519 FAIL - Στείλατε το lab8 1524 1528 1529 FAIL - Σωστό το struct αλλά φαίνεται να παπαγαλίσατε τις διαφάνειες. Αλλάζετε το όνοµα του struct µε typedef αλλά µετά δεν το χρησιµοποιείτε παντού. Τι όνοµα είναι το b??? Να δίνετε περιγραφικά ονόµατα! - Λάθος µέγεθος στο %s. Έπρεπε να είναι %99s, όχι %100s - Μετά από malloc να ελέγχετε πάντα για NULL - Λάθος λογική. Το i σας λέει πού είναι ο διαχωριστικός χαρακτήρας, όχι πού είναι η λέξη. Έπρεπε να το αυξάνετε κατά 1 µετά την strcspn. Επίσης, αφού το υπολογίζετε (έστω και µε λάθος) γιατί δε θέτετε και το πεδίο len? - Το j πηγαίνει µέχρι LINESIZE και το χρησιµοποιείτε για να διατρέξετε το words το οποίο όµως έχει µέγεθος LINESIZE/2! - Μην κολλάτε στη διάτρεξη των strings κατά ένα χαρακτήρα τη φορά! Επίσης, το τέλος του string είναι εκεί που βρίσκεται το \0 κι όχι στο LINESIZE. - Το πρόγραµµα δεν εκτυπώνει αποτελέσµατα και δε δείχνετε αν ξέρετε να προσπελάσετε τα πεδία που struct για εκτύπωση. - Καλά σκέφτηκες να ελέγχεις για NULL κατά την εκτύπωση, αλλά ελέγχεις τη λάθος ποσότητα. - Καλό είναι να εκτυπώνεις κι ένα µήνυµα λάθους όταν η malloc επιστρέφει NULL - Μετά από malloc να κάνετε πάντα έλεγχο για NULL. - Στο strstr έπρεπε να χρησιµοποιείτε το diaxwristiko αντί για "HIC" - Μετά από χρήση strncpy πρέπει να θέτετε πάντα το '\0' - Στο τελικό for δεν πρέπει να πηγαίνετε µέχρι LINESIZE - δεν έχει απαραίτητα τόσα γεµισµένα κελιά ο πίνακας. - Να κάνετε έλεγχο για NULL µετά από κάθε malloc. - Δεν αποδεσµεύσατε όλη τη δυναµικά δεσµευµένη µνήµη. - Να χρησιµοποιείτε περιγραφικά ονόµατα µεταβλητών. Τι σηµαίνει temp? - Μετά από χρήση strncpy να θέτετε πάντα το '\0'. - Μη σκέφτεστε ότι τα strings τα διατρέχουµε πάντα ένα-ένα χαρακτήρα. Στη συγκεκριµένη περίπτωση δε θέλουµε να το κάνουµε αυτό, οπότε η συνθήκη σας είναι λάθος. - Δεν αποδεσµεύετε τη δυναµικά δεσµευµένη µνήµη, - Η αρχικοποίηση του characters θα µπορούσε να είχε γίνει πιο απλά: char characters[]="!@#$%^&*" - Μετά από malloc να ελέγχετε πάντα για NULL - Στην κλήση της strpbrk έχετε βάλει ανάποδα τις παραµέτρους - Λάθος λογική. Μην κολλάτε στη διάτρεξη των string κατά ένα χαρακτήρα τη φορά! Επίσης, αν δεν υπάρχουν πια οι χαρακτήρες στο string, πρέπει να τερµατίζει το loop. Μην ξεχνάτε ότι το string ουσιαστικά τελειώνει εκεί που είναι το \0 κι ΟΧΙ στο LINESIZE. - Στο realloc, γιατί κάνατε typecast το words σε (void*)? Είναι λάθος. - Δε θέτετε την απόσταση - Δεν απελευθερώνετε τη δυναµικά δεσµευµένη µνήµη Page 9
1531 1532 - Στο τέλος έπρεπε να εκτυπώνετε το χαρακτήρα στη διεύθυνση (words+i)->beg κι όχι το string. - Μετά από malloc να κάνετε πάντα έλεγχο για NULL. - Το wordadd είναι char *. Γιατί έχετε sizeof(struct infot) στο malloc του? - Δεδοµένου ότι το sentence δεν αλλάζει µέσα στο loop, η συνθήκη του while θα είναι πάντα αληθής και η επανάληψη δε θα τερµατίσει ποτέ. πάντως... 1533 1534 FAIL 1537 FAIL 1539 1540 FAIL 1541 FAIL 1542 1543 - Άσχηµη στοίχιση - Μετά από χρήση strncpy πρέπει να θέτετε πάντα το '\0' - Πολύ καλή προσπάθεια - Τι είναι τα c, s? Να δίνετε περιγραφικά ονόµατα στις µεταβλητές σας. - Το words->address είναι πάντα το πρώτο στοιχείο του πίνακα. Φαίνεται να µην έχετε καταλάβει καλά τη µορφή της δοµής. - Καλή δουλειά όσον αφορά ζητήµατα µνήµης, αλλά δε χρησιµοποιείτε συναρτήσεις από τη string.h όπως απαιτούσε η εκφώνηση. - Ο αλγόριθµος έχει κάποια σωστά στοιχεία αλλά θέλει δουλειά ακόµη. -Μετά από malloc να κάνετε πάντα έλεγχο για NULL - Το µέγεθος στο %s έπρεπε να είναι 99 κι όχι 100. - Γιατί έχετε βάλει ολόκληρη πρόταση στο scanf? Άλλο ζητούσε η εκφώνηση. - Τι σκοπό εξυπηρετούν τα δύο for? - Δεν έχετε κάνει κάτι ιδιαίτερο πέρα των malloc/free - Δε θέτετε την απόσταση - Δεν απελευθερώνετε τη δυναµικά δεσµευµένη µνήµη - Μετά από malloc να κάνετε πάντα έλεγχο για NULL. - Στο strstr έπρεπε να χρησιµοποιείτε το diaxwristiko αντί για "HIC" - Μετά από χρήση strncpy πρέπει να θέτετε πάντα το '\0' - Στο τελικό for δεν πρέπει να πηγαίνετε µέχρι LINESIZE - δεν έχει απαραίτητα τόσα γεµισµένα κελιά ο πίνακας. - Για το sentence προσδιορίσατε µέγεθος 20, οπότε έπρεπε να το διαβάζετε µε %19s κι όχι µε %20s. - Να διαβάζετε ΟΛΟΚΛΗΡΗ την εκφώνηση. Το LINESIZE έπρεπε να είναι 100. - Να κάνετε έλεγχο για NULL µετά από κάθε malloc. - Στη συνθήκη του while συγκρίνετε το sentence που είναι δείκτης µε το '\0' που είναι χαρακτήρας! - Το printf είναι λάθος. Έπρεπε να διατρέχετε ολόκληρο πίνακα! Page 10
1547 1548 FAIL 1550 FAIL - Τι είναι το adr2 και γιατί δεσµεύετε µνήµη γι'αυτό? Για το words έπρεπε να είχατε δεσµεύσει µνήµη δυναµικά. - Η συνθήκη στο while είναι λάθος. Δεν υπάρχει εγγύηση ότι θα γεµίσουν όλες οι θέσεις του πίνακα words. Ακόµη χειρότερα, πάτε µέχρι και LINESIZE/2 το οποίο σηµαίνει ότι βγαίνετε εκτός ορίων του words. - Το πρόγραµµα δεν εκτυπώνει τίποτα όσον αφορά τον αλγόριθµο εύρεσης των θέσεων - Να αποδεσµεύετε πάντα τη δυναµικά δεσµευµένη µνήµη του προγράµµατος. - Δεν κατασκευάσατε φάκελο για να βάλετε µέσα το lab9.c. Να ακολουθείτε τις οδηγίες. - Λάθος στη σύνταξη της malloc. Τι σχέση έχει το (int *)? Μην παπαγαλίζετε τις διαφάνειες. - Να προσδιορίζετε πάντα µέγεθος στο %s - Δεν έχετε κάνει κάτι πέρα της δέσµευσης µνήµης. - Το όνοµα του αρχείου έπρεπε να είναι lab9.c - Έπρεπε και η απόσταση και οι διευθύνσεις να υπολογιστούν µε χρήση συναρτήσεων strings και όχι διατρέχοντας το string ένα-ένα χαρακτήρα Page 11