Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

Ποια ειναι η γνωμη σας για τον κώδικα;

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Ποια ειναι η γνωμη σας για τον κώδικα;

Δημοσίευση από stesia » 06 Φεβ 2008 00:06

Ενώ τρέχει την πρώτη φορά εμφανίζει τα εξής προβλήματα:
Δεν γράφει τίποτα μέσα στο αρχείο file.txt
Μετά και το δεύτερο loop βγάζει "Να μην αποσταλεί" και κλείνει

Τι προβλήματα μπορείτε να εντοπίσετε;
Ευχαριστώ για το χρόνο σας
Συνημμένα
atmosfairiki_rypansi.zip
ολόκληρο το project με την εκφώνηση της άσκησης
(4.04 KiB) Μεταφορτώθηκε 356 φορές

Άβαταρ μέλους
MannyCalavera
Δημοσιεύσεις: 13
Εγγραφή: 11 Δεκ 2007 23:00
Επικοινωνία:

Ποια ειναι η γνωμη σας για τον κώδικα;

Δημοσίευση από MannyCalavera » 06 Φεβ 2008 16:53

Καταρχάς στην περιγραφή του προβλήματος δεν ήσουν ξεκάθαρη.
Όταν γράφεις:
Μετά και το δεύτερο loop βγάζει "Να μην αποσταλεί" και κλείνει
νόμισα πως το "Να μην αποσταλεί " ήταν μήνυμα του προγράμματός σου. Στην πραγματικότητα είναι μήνυμα των windows, που βγαίνει σε όλα τα προγράμματα όταν "κρεμάνε", και στην ουσία σου λέει πως το πρόγραμμά σου έκανε κάτι πολύ "στραβό" (προκάλεσε όπως λέμε εξαίρεση-exception) :wink:

Το "στραβό" λοιπόν εντοπίζεται στο εξής σημείο του κώδικα:

Κώδικας: Επιλογή όλων

stathmos *Bardaris[24], *Panepisthmio[24], *Nomarxia[24], *BiPeth[24], *Deisodos[24];
Εδώ δηλώνεις πίνακες 24 δεικτών τύπου stathmos. Ωραία μέχρι εδώ (αν και δεν καταλαβαίνω γιατί να χρησιμοποιήσεις πίνακες δεικτών-ίσως δεν ήθελες να κάνεις αυτό).
Πουθενά όμως στον κώδικά σου δεν αρχικοποιείς αυτούς τους δείκτες, δηλαδή δεν τους λες ΠΟΥ να "δείχνουν", και αυτό είναι που σου δημιουργεί το πρόβλημα:

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

Κώδικας: Επιλογή όλων

Bardaris[wra]->setO3(erwtisi_O3());
αυτό που κάνεις είναι να γράφεις την τιμή σε μια από τις τυχαίες διευθύνσεις, οι οποίες Α)μπορεί να μην είναι έγκυρες, Β)μπορεί να χρησιμοποιούνται από τα windows ή από άλλο πρόγραμμα, Γ)μπορεί και να μη χρησιμοποιούνται. Στην ουσία έχεις στα χέρια σου μια "ωρολογιακή βόμβα" η οποία θα "σκάσει" μόλις συμβεί ένα από τα (Α) ή (Β).

Το καλύτερο που έχεις να κάνεις είναι δηλώσεις ένα δείκτη σε πίνακα 24 στοιχείων, δεσμεύοντας μνήμη με την εντολή new:

Κώδικας: Επιλογή όλων

stathmos *Bardaris=new stathmos[24];
...
...
Bardaris[wra].setO3(erwtisi_O3());
Bardaris[wra].setNO2(erwtisi_NO2());
...
...
//μην ξεχνάς να αποδεσμεύσεις τη μνήμη, όταν πλέον δεν τη χρειάζεσαι άλλο
delete [] Bardaris;
Επίσης οι συναρτήσεις elegxos1, elegxos2, κλπ., θα πρέπει να αλλάξουν από

Κώδικας: Επιλογή όλων

void elegxos1(stathmos Bardaris[24], int wra, int c)
σε

Κώδικας: Επιλογή όλων

void elegxos1(stathmos *Bardaris, int wra, int c)
και όταν τις καλείς θα πρέπει να γράφεις

Κώδικας: Επιλογή όλων

elegxos1(Bardaris, wra, c);
Έχεις κι άλλα λαθάκια (π.χ. οι fout<<..., θα σου χτυπήσουν λάθος) αλλά διορθώνονται πιο εύκολα,αρκεί να το ψάξεις λίγο :D

Διόρθωσε τον κώδικά σου και πες μου αν κολλήσεις κάπου.
The living still give me the creeps

stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Ποια ειναι η γνωμη σας για τον κώδικα;

Δημοσίευση από stesia » 06 Φεβ 2008 19:05

Ναι έχεις δίκιο αυτό εννοούσα με το "Να μη αποσταλεί"
Έκανα τις διορθώσεις και το πρόγραμμα τρέχει κανονικά αλλά χωρίς την εγγραφή σε αρχείο.
Το πρόβλημα είναι ότι το γράφω όπως ακριβώς το λέει και στο βιβλίο, δηλαδή
ofstream fout("file1.txt");
fout<<"....";
Δοκίμασα να το γράψω και έτσι:
fstream fout;
fout.open("file1.txt", ios::app);
fout<<"....";
αλλά και πάλι δεν γράφει τίποτα.
Μήπως το πρόβλημα είναι στο
while(1);
{
fout.close();
} ?????
Απ'ότι ξέρω η close() πριν κλείσει το αρχείο σβήνει ότι υπάρχει μέσα σ'αυτό. Δοκίμασα επίσης να σβήσω εντελώς το while αλλά χτυπάει ο compiler και βγάζει αυτό:
expected 'while' before "system"
expected '(' before "system"
expected ')' before ';' token

Σε παρακαλώ φώτισε με :-?

Άβαταρ μέλους
MannyCalavera
Δημοσιεύσεις: 13
Εγγραφή: 11 Δεκ 2007 23:00
Επικοινωνία:

Ποια ειναι η γνωμη σας για τον κώδικα;

Δημοσίευση από MannyCalavera » 06 Φεβ 2008 19:56

Το πρόβλημά σου εντοπίζεται σε δύο επίπεδα: 1) Στα while loops, 2) Στην fout

(1) Η σύνταξη της do...while έχει ως εξής:

Κώδικας: Επιλογή όλων

do
&#123;
//blah blah
&#125;while&#40;condition&#41;;
Εσύ γράφεις:

Κώδικας: Επιλογή όλων

do
&#123;
...
while&#40;c==6&#41;; //Αυτή η γραμμή ουσιαστικά δεν κάνει τίποτα...
&#125;
while&#40;1&#41;;
&#123;
fout.close&#40;&#41;;
&#125;
Tο πρώτο while λέει: Αν το c είναι 6 μην κάνεις τίποτα και πάνε στην επόμενη γραμμή, αν το c δεν είναι 6 πάνε στην επόμενη γραμμή, συνεπώς δεν έχει λόγο ύπαρξης...
Το δεύτερο while ολοκληρώνει το do και λέει: μείνε στη λούπα μέχρι να μας βγάλουν από κει με το ζόρι (με break, ή με exit - όπως κάνεις εσύ).
Το fout.close() είναι εκτός loop και εφ'όσον από το loop βγαίνεις με exit, δηλαδή τερματίζεις το πρόγραμμα, δεν εκτελείται ποτέ.

Δεν ξέρω ποιος ήταν ο αρχικός σου σκοπός, αλλά όλο αυτό δε μου φαίνεται λογικό. Το λογικό, για μένα, θα ήταν:
do
{
switch(c)
{
case 1:
.....
case 6:
cout<<"\n\nTelos Programmatos";
fout.close(); // Κλείνουμε το αρχείο
exit(0); // Τερματίζουμε το πρόγραμμα
}
}while(1); // Τρέχε συνέχεια μέχρι να μας βγάλουν με το ζόρι


(2) Στην fout κάνεις ένα λάθος που το'χα κάνει κι εγώ κάποτε (κι άλλοι φαντάζομαι) όταν μάθαινα c++. Δεν ξέρω ποιο βιβλίο έχεις -απ'το πανεπιστήμιο φαντάζομαι- αλλά μάλλον δεν το εξηγεί καλά, ή δεν το γράφει καθόλου.

Η fout (μαζί με τη cout και τα άλλα streams) μπορεί να πάρει ως παραμέτρους οποιοδήποτε αριθμό και οποιοδήποτε string. ΔΕΝ παίρνει όμως αντικείμενα (class, struct). Αυτό που έκανες, φαντάζομαι, είναι να νομίσεις πως βάζοντας

Κώδικας: Επιλογή όλων

fout<<Bardaris1&#91;wra&#93;&#91;0&#93;<<Bardaris1&#91;wra&#93;&#91;1&#93;<<Bardaris1&#91;wra&#93;&#91;2&#93;<<Bardaris&#91;wra&#93;; 
θα σου γράψει αυτομάτως χρόνο, μήνα, μέρα, ώρα και τις τιμές των μετρήσεων.

Ενώ όμως καταλαβαίνει τα Bardaris1[wra][0->2] αφού είναι αριθμοί, δε μπορεί να καταλάβει το Bardaris[wra] που είναι αντικείμενο (καλά θα ήταν, αλλά δεν το κάνει :D ).

Πρέπει να του δώσεις ξεχωριστά κάθε μέλος του αντικειμένου:

Κώδικας: Επιλογή όλων

fout<<...Bardaris&#91;wra&#93;.getO3&#40;&#41;<<Bardaris&#91;wra&#93;.getNO2&#40;&#41;...κλπ
PS.
Καλό θα είναι να βάλεις κενά ανάμεσα στους αριθμούς για να μην είναι κολλητά και να διαβάζονται:

Κώδικας: Επιλογή όλων

fout<<Bardaris1&#91;wra&#93;&#91;0&#93;<<" "<<Bardaris1&#91;wra&#93;&#91;1&#93;<<" "<<...κλπ
The living still give me the creeps

stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Ποια ειναι η γνωμη σας για τον κώδικα;

Δημοσίευση από stesia » 06 Φεβ 2008 20:55

Και πάλι με αυτές τις διορθώσεις δεν γράφει τίποτα μέσα στο αρχείο. Δεν μπορώ να καταλάβω δεν ανοίγει καθόλου το αρχείο? Δεν το δημιουγεί ή γράφει και με την close() τα σβήνει όλα?

Ευχαριστώ πολύ πάντως για τις διορθώσεις, δεν το συζητώ για τη do while δεν το πιστεύω ότι τόσο καιρό είχα λάθος την αγκύλη.
Έχω τη βιβλίο "C++ Θεωρία και Πράξη" του Κων/νου Λάζου και όπως είπε δεν το γράφει μέσα αυτό την fout.

stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Ποια ειναι η γνωμη σας για τον κώδικα;

Δημοσίευση από stesia » 06 Φεβ 2008 20:59

Αααα γράψε λάθος!
Τελικά το ανοίγει το αρχείο και γράφει κανονικά! Ευχαριστώ πολύ! :-)

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες