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.
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!