簡體   English   中英

有沒有一種方法可以使用名稱列表I / O功能讀取具有可分配組件的派生類型?

[英]Is there a way to use the namelist I/O feature to read in a derived type with allocatable components?

有沒有一種方法可以使用名稱列表I / O功能讀取具有可分配組件的派生類型?

我唯一能找到的是https://software.intel.com/zh-cn/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/269585以一個毫無幫助的音符結尾。

編輯:

我有用戶定義的派生類型,需要用輸入文件中的信息填充。 因此,我正在嘗試找到一種方便的方法。 名稱列表似乎是一條不錯的路線,因為它是如此簡潔(基本上是兩行)。 一個創建名稱列表,然后讀取一個名稱列表。 Namelist似乎也是一個不錯的選擇,因為在文本文件中,它迫使您非常清楚地顯示每個值的去向,而我發現最好僅列出編譯器知道確切順序的值列表。 如果我或其他任何人需要知道哪個值對應於哪個變量,這將使工作量增加,並且在不可避免地需要新值時保持清潔的工作量也就增加了。

我正在嘗試做一些基本的形式:

!where myType_T is a type that has at least one allocatable array in it
type(myType_T) :: thing 

namelist /nmlThing/ thing

open(1, file"input.txt")

read(1, nml=nmlThing)

我可能會誤解用戶定義的I / O過程,但是它們似乎不是一個非常通用的解決方案。 似乎我每次需要執行此操作時都需要寫一個新的,而他們似乎並不本地支持

&nmlThing

  thing%name = "thing1"
  thing%siblings(1) = "thing2"
  thing%siblings(2) = "thing3"
  thing%siblings(3) = "thing4"
  !siblings is an allocatable array
/

我認為理想的語法。

我找到了一些解決此問題的方法,但是似乎沒有一個非常簡潔或優雅的方法。 當前,我有一個虛擬的用戶定義類型,該類型的數組很大,而不是可分配的,然后編寫一個函數將信息從虛擬名稱列表友好類型復制到包含該類型的可分配字段。 它可以正常工作,但是很丑陋,我需要在代碼中執行大約4種操作。

因此,試圖找到一個好的解決方案。

如果要使用可分配的組件,則需要為用戶定義的派生類型輸入/輸出過程提供一個可訪問的通用接口(通常由具有此類過程的通用綁定的類型)。 您可以通過帶有此類過程的示例鏈接到線程。

一旦調用,該用戶定義的派生類型輸入/輸出過程便負責讀取和寫入數據。 這可以包括在派生類型的組件上調用名稱列表輸入/輸出。

Fortran 2003還提供帶有長度參數的派生類型。 這些可以提供解決方案,而無需用戶定義派生類型輸入/輸出過程。 但是,將帶有長度參數的派生類型與名稱列表結合使用,相對於當前的編譯器實現,將使您牢牢地處於“高度試驗”類別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM