לדלג לתוכן

מבוא לתכנות של קבוצת בטא/המדריך המהיר של עופר לשפת פורטרן/המדריך המהיר של עופר לFortran מודרנית

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

קישקושים מקדימים

[עריכה]

מי בכלל משתמש בפורטרן מודרנית?

[עריכה]

מאגרי הקוד הענקיים שמכוני מחקר אקדמיים בעולם משתפים ביניהם, מדענים וכו'.

למשל:

איך הקהילה של פורטרן שרדה כל הזמן הזה?

[עריכה]

האמת, לא כל כך שרדה. אבל מ2017 ועד 2021 כמה אנשים, ובעיקר אונדריי צ'רטיק, החליטו להחיות את הקהילה של Fortran, כולל אתר, כולל כנס. והצליח להם לא רע. אז עכשיו יש קהילה של משהו כמו 70 איש, שהם הגרעין לכל נושא הפורטרן המודרני.

לומדים פורטרן

[עריכה]

--צריך להשלים.--

הערות

[עריכה]

בפורטרן 66 הגיעו למסקנה שהערות זה מועיל. אז כל שורה שמתחילה בc עם רווח היא הערה.

PROGRAM FOO
C A COMMENT
END

בפורטרן 90 קלטו שבעצם ככה לא ניתן לעשות משתנה שנקרא c, ולא ניתן לשים הערות בסוף שורות. אז זרקו את הc מהחלון, ועכשיו סימן קריאה (!) מתחיל הערה, גם אם זה באמצע השורה.

program foo
! a comment
integer :: bar !another comment
end program foo

מערכים

[עריכה]

--צריך להשלים.--

מחרוזות

[עריכה]

--צריך להשלים.--

תת-מחרוזות

[עריכה]

בדיוק כמו חיתוך מערכים:

program foo
    implicit none
    
    character(10) :: str
	integer :: array1(10)
	
    str = "lorem ipsu"
	array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] !This is fortran2003 notation for arrays
	
    print *, str(2:5)
	print *, array1(2:5)

end program foo
 orem
           2           3           4           5

עד שזה מגיע לקפיצות. שם לא כמו מערכים. לא יודע למה.

!Would not compile.
print *, str(2:10:2)

!Would happily compile.
print *, array1(2:10:2)

!wtf

המכוער - מוקשים בפורטרן

[עריכה]

חשבתם שהשארנו את ההפתעות בשנת 77? מה פתאום, פורטרן תדאג שלעולם לא ישעמם לך עם באגים סבירים. ארץ הפלאות זה פה.

רווחים בסטנדרט

[עריכה]

אז הרצתם gfortran והתוכנה התקמפלה. יופי. ועכשיו הוספתם דרישה להיצמד לסטנדרט החביב עליכם, נגיד לFortran2018:

gfortran test.f90 -o test.exe -std=f2018

הופ, לא מתקמפל. מה קרה?
זה מה שקרה:

Warning: Nonconforming tab character at (1) [-Wtabs]

כברירת מחדל gfortran משתמש בסטנדרט שנקרא gnu, שהוא לא סטנדרט אלא סתם מה שהיה כיף לאנשי פרויקט גנו.
אבל פורטרן סטנדרטית אמיתית לא באמת בקטע של טאבים. רק רווחים. הטאב אפילו לא נמצא בסט התוים של פורטרן.

כיף עד עכשיו? לפחות כאן הקומפיילר סיפר לנו מה הבעיה. קלטו את החוכא ואיטלולא הבא.

אז תשנו את כל התוכנה שלכם להשתמש עכשיו ברווחים במקום טאבים.

או שתשתמשו בדגל Wtabs- של gfortran כמו שכתוב בשגיאה. אה, לא רגע, הם שינו את זה בגירסה 5 של gfortran: עכשיו הדגל Wno-tabs- מונע שגיאות טאבים וWtabs- דווקא גורם לשגיאות באגים. אה, לא רגע, כשמשתמשים בסטנדרטים של פורטרן הקומפיילר מתעלם בכל מקרה מדרישות בענייני טאבים ודורש רווחים, תצעקו עד מחר. יודעים מה, תשכחו מזה, פשוט תחליפו הכל לרווחים.

IO רקורסיבי

[עריכה]

בואו נסתכל על תוכנה לגיטימית לגמרי שקוראת לפונקציה שמדפיסה משהו, ואז מדפיסה את הערך המוחזר של הפונקציה:

program main
	implicit none
	
	integer :: foo
	integer :: bar
	
	foo = bar(3)
	
	write (*, '(I0)') foo
end program main
  
function bar(num)
	implicit none
	
	integer, intent(in) :: num
	integer :: bar
	
	bar = num + 3
	write (*, '(A)') "dandy"
end function bar

יחשוב הבטאי הסביר ויגיד "רגע, למה שנבזבז פה זיכרון על משתנה מתווך, בואו נחסוך את המשתנה ונעשה את הקריאה לפונקציה ישירות מתוך הprint." ככה:

program main
	implicit none
	
	integer :: bar
	
	write (*, '(I0)') bar(3)
end program main

פורטרן בתגובה:

כי אם אתה בפונקציה שמשתתפת בהדפסה למסך, ואז אתה עושה מתוכה הדפסה למסך יוצא "IO רקורסיבי" שיגרום לתוכנה שלך לרוץ לנצח נצחים בלי להוציא שום פלט. על זה נאמר מקום רע מאוד: מקום לחכות.

אל תחכו. תעשו איזה CTRL-C ותתקנו את הקוד כך שישתמש במשתנה מתווך.

אגב, האגדות מספרות שבFortran2018 יש טריקים לעקוף את זה, אבל עדיין לא יצא לי לקמפל את האגדות האלו, אז בהצלחה עם זה.

מקורות

[עריכה]