Προς το περιεχόμενο
  • 0

Από fortran σε c++


Vasilis89

Ερώτηση

έχω έναν κώδικα fortran που πρέπει να μετατρέψω σε c++

Με μια πρώτη αναζήτηση βρήκα ένα πρόγραμμα (f2c) στο οποίο όμως βάζω τον κώδικα και βγάζει πολλά λάθη.

Μπορεί κάποιος που ξέρει και έχει τα εργαλεία να δει αν ο κώδικας σε fortran τρέχει σωστά ή να με βοηθήσει κάπως στο convertion?

 

βάζω μια υπορουτίνα που επίσης δεν μετατρέπεται

SUBROUTINE CONVAL(LL)
   IMPLICIT DOUBLE PRECISION ( A-H , O-Z )
   COMMON/FILTERLENGTHS/NS,NFILTERA,NFILTERD
   COMMON/CONV/       cA1(100000),cA2(100000),cA3(100000),cA4(100000),cA5(100000),cA6(100000),cA7(100000),cA8(100000),cA9(100000)
   COMMON/LENGTH/     L1,L2,L3,L4,L5,L6,L7,L8,L9
   m=NFILTERA;
   n=NS;
   k=m+n-1;
   j=max(1,k+1-n):min(k,m);
   DO 10 f=1,k
   sumb=0
   DO 20 ff=1,f
    if ff>m then  s(ff)=0
   CONTINUE     
    if f+1-ff>n then w(f+1-ff)=0
   CONTINUE     
   20 CONTINUE
   cA(LL)=cA(LL)+(X(ff)*FILA(f+1-ff))
   10 CONTINUE
   RETURN
   END 

βρήκα και κάτι ακόμα που δεν ξέρω πως να το τρέξω.. νομίζω χρειάζεται python, που την έχω

http://cci.lbl.gov/fable/

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

8 απαντήσεις σε αυτή την ερώτηση

Προτεινόμενες αναρτήσεις

  • 0

δεν ξέρω ακριβώς γιατί δεν είναι όλο το πρόγραμμα.. δηλαδή οι εξισώσεις υπολογισμού δεν είναι μέσα. Πρέπει δηλαδή απλά να κάνω μετάφραση/αλλαγή συντακτικού.. αλλά δεν έχω ιδέα από fortran

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

H fortran είναι πανεύκολη στο βασικό επίπεδο και δεν θα δυσκολευτείς να καταλάβεις τι κάνουν οι εντολές,

έστω κι αν δεν ξέρεις τον σκοπό της ρουτίνας.

Ωστόσο, το παραπάνω απόσπασμα είναι από κάποιο παλαιολιθικό πρόγραμμα και η σύνταξή του είναι κακή ή λαθεμένη.

Π.χ. η γραμμή

j=max(1,k+1-n):min(k,m);

είναι (απ' όσο ξέρω) λάθος.

Το : στη fortran χρησιμοποιείται για να δηλώσει εύρος τιμών σε πίνακες, δεν έχει καμιά δουλειά εδώ.

Επίσης οι βρόχοι είναι γραμμένοι με ασαφή τρόπο (εκείνα τα continue δεν είναι σαφές σε τι αναφέρονται).

 

Αν είναι τσεκαρισμένο ότι ο κώδικας τρέχει συνολικά σωστά,

και είναι μεγάλος σε έκταση είναι προτιμότερο να συνδέσεις fortran με C++ (καλείς τις ρουτίνες από την C++)

παρά να δοκιμάσεις αυτόματη μετατροπή. Είναι απίθανο να δουλέψει αυτόματη μετατροπή χωρίς καμιά αλλαγή,

- και δεν θα μπορείς να είσαι και σίγουρος ότι δουλεύει σωστά - άρα πάλι θα μπλέξεις με τον κώδικα θέλοντας και μη.

Η χειροκίνητη μεταγραφή είναι πολύ καλύτερη λύση αλλά η C (ή C++) θα σε παιδέψει διότι

δεν υποστηρίζει ενδογεννώς αριθμητικά μητρώα, ούτε μιγαδικούς αν χρησιμοποιούνται αλλού...

 

-

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

απ ότι καταλαβαίνω το common είναι εντολή που κάνει την μεταβλητή διαθέσιμη για όλες τις υπορουτίνες. Πιο είναι το ανάλογο για την c++?

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

Το common κάνει "διαφανή" μια ομάδα μεταβλητών μεταξύ διαφόρων ρουτινών ή του κυρίου προγράμματος.

Είναι παλαιά ορολογία. Στις εκδόσεις από την 90 και εντεύθεν γίνεται πολύ κομψότερα.

 

Στη  C++ δες τα σχετικά με την εμβέλεια (scope) των μεταβλητών (static, global κλπ).

Περιληπτικά, δηλώνεις (declare) τις μεταβλητές ως extern σε ένα *.h (include) αρχείο.

To include αρχείο το προσάπτεις στις υπορουτίνες που θέλεις να είναι ορατές οι μεταβλητές.

Σε κάποιο σημείο του κώδικα που τις χρειάζεσαι, τις ορίζεις (define) και είναι ορατές από εκεί και εκατέρωθεν

σε όλα τα τμήματα του κώδικα που έχει προσαχθεί το include αρχείο.

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

 

-

Επεξ/σία από V.I.Smirnov
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

υπάρχει σε κάποιο σημείο του κώδικα που θέλω να μεταφράσω από fortran η εντολή read (arxeio.*) metavliti(es).. to arxeio exei metrisei xorismenes me κόμμα.. ποιο είναι το ανάλογο σε c++?

 

τι θα πάρω με την getline se c++ από ένα αρχείο το οποίο έχει πχ 12123,123123,23455,35345,34534,234.....

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

για να το κάνω πιο απλό έχω ένα αρχείο με μετρήσεις "123,12312,123123,123123123,123..." και θέλω με c++ βάλω τις μετρήσεις σε έναν πίνακα..

και έχω και ένα αρχείο με 4 νούμερα πχ "45,45,65,76" και θέλω να τα βάλω σε 4 διαφορετικές μεταβλητές

πως γίνετε?

 

μπορώ να έχω παράλληλα πολλά ifstream ανοιχτά?

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε έναν λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι εύκολο!

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.