Forumübersicht - Allgemeines Forum

fortran95

Re: fortran95

warum ist hier dann auch nen umbruch. bei dem program hab ich kein "(I3)" reingeschrieben.


Zum Erfolg führt kein Aufzug. Man muss die Treppe nehmen.

Wir sind die Schüler von heute, die in den Schulen von gestern mit Lehrern von vorgestern und Methoden aus dem Mittelalter auf die Probleme von morgen vorbereitet werden!

Re: fortran95

hat das evtl was mit dem * zu tun? kacke echt. von der syntax halt keinen plan. PL/1 is echt anders

Re: fortran95

okay trotzdem danke^^


Zum Erfolg führt kein Aufzug. Man muss die Treppe nehmen.

Wir sind die Schüler von heute, die in den Schulen von gestern mit Lehrern von vorgestern und Methoden aus dem Mittelalter auf die Probleme von morgen vorbereitet werden!

Re: fortran95

aber ich glaub das es bei dem anderen programm "felder" an der schleife liegt, dass er es untereinander schreibt.
wenn man es immer ausschreiben würde, würde da ja stehen:

print feld(1) -
print feld(2) -
print feld(3) -

und so weiter. und dadurch das immer wieder print dort steht, wird es bestimmt untereinander geschrieben



Zum Erfolg führt kein Aufzug. Man muss die Treppe nehmen.

Wir sind die Schüler von heute, die in den Schulen von gestern mit Lehrern von vorgestern und Methoden aus dem Mittelalter auf die Probleme von morgen vorbereitet werden!

Re: fortran95

am meisten vermute ich ja was in der subroutine in der zeile vom Case(1)

kann man da auch ne Schleife innerhalb der printanweisung schreiben? ist sowas möglich?



Zum Erfolg führt kein Aufzug. Man muss die Treppe nehmen.

Wir sind die Schüler von heute, die in den Schulen von gestern mit Lehrern von vorgestern und Methoden aus dem Mittelalter auf die Probleme von morgen vorbereitet werden!

Re: fortran95

Ich sehe eine Schleife innerhalb der print-anweisung zum ersten mal (was nichts heissen muss)

Also der Fehler kann ja nicht nur im Case(1) liegen, sonst würde er die Zahlen untereinander korrekt darstellen.

Könnte evtl ein Problem sein, dass die Variablen im Unterprogramm zum zweiten Mal deklariert werden. Geb den Variablen in der 'ausgabe' mal andere Namen.

Also:

subroutine ausgabe(zahl_sub, richtung_sub, anzahl_sub)
integer:: zahl_sub, richtung_sub, anzahl_sub, i_sub

......

Re: fortran95

ich hab einfach nur mal den ursprungsquelltext reinkopiert. in dem müssten also genau 5 fehler sein

 PROGRAM main

! Variablendeklaration
INTEGER:: zahl(5), anzahl, i, ios
! CHARACTER::

! Bildschirm säubern
CALL SYSTEM("clear")

! bereits vorhandene Datei öffnen
OPEN(UNIT=10, FILE="zahlen.dat", STATUS="NEW", IOSTAT=ios)

! Fehlermeldung, falls die Datei nicht geöffnet werden kann
IF (ios/=0) THEN
        PRINT*, "Fehler! Datei 'zahlen.dat' existiert nicht."
        ! Leerzeile
        PRINT*
! weiter, falls die Datei existiert
ELSE
        PRINT*, "Willkommen, ich bin ein fehlerhaftes Programm."
        PRINT*, "5 Zahlen werden gelesen. Zum Einlesen bitte drücken."
        PRINT*

        i=1
! maximal 5 Zahlen aus Datei einlesen, solange kein Lesefehler passiert
        DO
                PRINT"(A, I2, A, $)", "Lese ", i, ". Zahl:"
                ! wartet auf Eingabe von
                READ*
                ! Zahl aus Datei einlesen
                READ(UNIT=10, FMT=*, IOSTAT=ios) zahl(i)
                ! Zahl auf Bildschirm ausgeben
                PRINT*, zahl(i)
                i=i+1
        IF (i>=5) EXIT
        ENDDO
        PRINT*

        ! Datei nach dem Lesen schließen
        CLOSE(10)

        DO
                PRINT*, "Wie viele Zahlen sollen angezeigt werden?"
                READ*, anzahl

                ! Fehlermeldung, falls mehr oder weniger als 5 eingegeben wird
! verkürzte Verzweigung bei genau einer Anweisung im True-Pfad
                IF (anzahl<1.AND.anzahl>5) PRINT*, "Fehler! Zahl zwischen 1 und 5 eingeben."
                PRINT*
        ! Abfrage wiederholen, bis die Benutzereingabe gültig ist
        IF (anzahl>=1.AND.anzahl<=5) EXIT
        ENDDO

        DO
                PRINT*, "Sollen die Zahlen (h)intereinander oder (u)ntereineander angezeigt werden?"
                READ*, wahl
                PRINT*

                ! Mehrfachverzweigung I
                IF (wahl=='h') THEN
                                ! Aufruf des Unterprogramms mit Parameter für Anzeige nebeneinander
                                CALL ausgabe(zahl,1,anzahl)
                ELSEIF (wahl=='u') THEN
                                ! Aufruf des Unterprogramms mit Parameter für Anzeige untereinander
                                CALL ausgabe(zahl,2,anzahl)
                ELSE
                                ! Fehlermeldung bei ungültiger Benutzereingabe
                                PRINT*, "Fehler! Bitte nur 'h' oder 'u' eingeben!"
                ENDIF


                PRINT*
        ! Abfrage wiederholen, bis die Benutzereingabe gültig ist
        IF (wahl=='h'.OR.wahl=='u') EXIT
        ENDDO
ENDIF

PRINT*, "Und Tschüss..."
PRINT*

! Ende des Hauptprogramms
END PROGRAM



Zum Erfolg führt kein Aufzug. Man muss die Treppe nehmen.

Wir sind die Schüler von heute, die in den Schulen von gestern mit Lehrern von vorgestern und Methoden aus dem Mittelalter auf die Probleme von morgen vorbereitet werden!

Re: fortran95

bisher gefundene fehler:
1. beim ersten start, sagt er: "Fehler. Zahlen.dat existiert nicht"
Auslöser:

OPEN(UNIT=10, FILE="zahlen.dat", STATUS="NEW", IOSTAT=ios)
geändert in
OPEN(UNIT=10, FILE="zahlen.dat", STATUS="OLD", IOSTAT=ios)

2. er liest nur 4 anstatt 5 Zahlen ein
Auslöser: in der Austrittsbedingung der ersten DO-Schleife:

IF (i>=5) EXIT
geändert in
IF (i>5) EXIT

3. wenn er fragt wie viele Zahlen angezeigt werden sollen um man dort nichts zwischen 1 und 5 eingetippt, also zum beispiel 9, dann fragt er einfach nach ner neuen eingabe ohne ne fehlermeldung auszugeben.
Auslöser: in der Einfachverzweigung innerhalb der 2. DO-Schleife

IF (anzahl<1.AND.anzahl>5) PRINT*, "Fehler! Zahl zwischen 1 und 5 eingeben."
geändert in
IF (anzahl<1.OR.anzahl>5) PRINT*, "Fehler! Zahl zwischen 1 und 5 eingeben."

4. in der 3. DO-Schleife in der Mehrfachverzweigung  überprüft er die Variable "wahl". diese ist aber nicht deklariert.

! CHARACTER::
geändert in
CHARACTER:: wahl*1

also soweit hoffe ich ist es richtig.
fehlt also nur noch ein fehler denk ich mal

fehlerbeschreibung: wenn ich h oder u eingebe als wahl, dann schreibt er nicht die Zahlen h.. oder u.. sondern gibt nen Fehler aus.
Außerdem denke ich mal, dass der Fehler doch wahrscheinlich in der ausgabe.f stecken wird.



Zum Erfolg führt kein Aufzug. Man muss die Treppe nehmen.

Wir sind die Schüler von heute, die in den Schulen von gestern mit Lehrern von vorgestern und Methoden aus dem Mittelalter auf die Probleme von morgen vorbereitet werden!

Re: fortran95

unbearbeiteter quelltext von ausgabe.f

SUBROUTINE ausgabe(zahl, richtung, anzahl)

! Variablendeklaration
IMPLICIT NONE
INTEGER:: zahl, richtung, anzahl, i

PRINT*, "Dies sind die Zahlen:"

! Mehrfachverzweigung Variante II
SELECT CASE(richtung)
        CASE(1)
                ! implizite Zählschleife für Ausgabe nebeneinander
                PRINT*, (zahl(i), i=1,anzahl)
        CASE(2)
                ! explizite Zählschleife für Ausgabe untereinander
                DO i=1,anzahl
                        PRINT"(I3)", zahl(i)
                ENDDO
        CASE DEFAULT
                PRINT*, "Fehler! Das hätte nicht passieren sollen!"
END SELECT

! Ende des Unterprogramms
END SUBROUTINE



Zum Erfolg führt kein Aufzug. Man muss die Treppe nehmen.

Wir sind die Schüler von heute, die in den Schulen von gestern mit Lehrern von vorgestern und Methoden aus dem Mittelalter auf die Probleme von morgen vorbereitet werden!

Re: fortran95

außerdem fällt mir grad auf, dass in der main.f folgendes deklariert ist

INTEGER:: zahl(5)

in der ausgabe.f ist folgendes deklariert.

INTEGER:: zahl

also ohen die 5 mit den klammern. vielleicht liegt es ja daran.



Zum Erfolg führt kein Aufzug. Man muss die Treppe nehmen.

Wir sind die Schüler von heute, die in den Schulen von gestern mit Lehrern von vorgestern und Methoden aus dem Mittelalter auf die Probleme von morgen vorbereitet werden!