freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

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


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [6 Μηνύματα]      Bookmarks Tags: κώδικα Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
stesia


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 06 Φεβ 2008 00:06    Θέμα: Ποια ειναι η γνωμη σας για τον κώδικα;
Περιγραφή θέματος: Εχουμε την εκφώνηση της άσκησης. Θα μπορούσε να δοθεί άλλη λύση;
Απάντηση με παράθεση  Mark this post and the followings unread

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

Τι προβλήματα μπορείτε να εντοπίσετε;
Ευχαριστώ για το χρόνο σας



atmosfairiki_rypansi.zip
 Description:
ολόκληρο το project με την εκφώνηση της άσκησης

Download
 Filename:  atmosfairiki_rypansi.zip
 Filesize:  4.04 KB
 Downloaded:  351 Time(s)

MannyCalavera


Μέλος από: 11 Δεκ 2007
Μηνύματα: 13

View users profile Visit posters website
ΜήνυμαΣτις: 06 Φεβ 2008 16:53    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Καταρχάς στην περιγραφή του προβλήματος δεν ήσουν ξεκάθαρη.
Όταν γράφεις:
παράθεση:
Μετά και το δεύτερο loop βγάζει "Να μην αποσταλεί" και κλείνει

νόμισα πως το "Να μην αποσταλεί " ήταν μήνυμα του προγράμματός σου. Στην πραγματικότητα είναι μήνυμα των windows, που βγαίνει σε όλα τα προγράμματα όταν "κρεμάνε", και στην ουσία σου λέει πως το πρόγραμμά σου έκανε κάτι πολύ "στραβό" (προκάλεσε όπως λέμε εξαίρεση-exception)

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

κώδικας:
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<<..., θα σου χτυπήσουν λάθος) αλλά διορθώνονται πιο εύκολα,αρκεί να το ψάξεις λίγο

Διόρθωσε τον κώδικά σου και πες μου αν κολλήσεις κάπου.

_________________
The living still give me the creeps
stesia


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 06 Φεβ 2008 19:05    Θέμα: Πώς γίνεται τελικά η εγγραφή σε αρχεία?
Περιγραφή θέματος: Έκανα τις αλλαγές αλλά όπως είπες κολάει στα fout. Κατά τα άλλα δουλεύει μια χαρά!
Απάντηση με παράθεση  Mark this post and the followings unread

Ναι έχεις δίκιο αυτό εννοούσα με το "Να μη αποσταλεί"
Έκανα τις διορθώσεις και το πρόγραμμα τρέχει κανονικά αλλά χωρίς την εγγραφή σε αρχείο.
Το πρόβλημα είναι ότι το γράφω όπως ακριβώς το λέει και στο βιβλίο, δηλαδή
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


Μέλος από: 11 Δεκ 2007
Μηνύματα: 13

View users profile Visit posters website
ΜήνυμαΣτις: 06 Φεβ 2008 19:56    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

κώδικας:
do
{
//blah blah
}while(condition);


Εσύ γράφεις:
κώδικας:
do
{
...
while(c==6); //Αυτή η γραμμή ουσιαστικά δεν κάνει τίποτα...
}
while(1);
{
fout.close();
}


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[wra][0]<<Bardaris1[wra][1]<<Bardaris1[wra][2]<<Bardaris[wra];

θα σου γράψει αυτομάτως χρόνο, μήνα, μέρα, ώρα και τις τιμές των μετρήσεων.

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

Πρέπει να του δώσεις ξεχωριστά κάθε μέλος του αντικειμένου:
κώδικας:
fout<<...Bardaris[wra].getO3()<<Bardaris[wra].getNO2()...κλπ


PS.
Καλό θα είναι να βάλεις κενά ανάμεσα στους αριθμούς για να μην είναι κολλητά και να διαβάζονται:
κώδικας:
fout<<Bardaris1[wra][0]<<" "<<Bardaris1[wra][1]<<" "<<...κλπ

_________________
The living still give me the creeps
stesia


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 06 Φεβ 2008 20:55    Θέμα: και κάτι ακόμα Απάντηση με παράθεση  Mark this post and the followings unread

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

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


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 06 Φεβ 2008 20:59    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Αααα γράψε λάθος!
Τελικά το ανοίγει το αρχείο και γράφει κανονικά! Ευχαριστώ πολύ!
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [6 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 19 Ιαν 2017 19:01 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos