Передача массива в Fortran: разница между `DIMENSION (:)` и `DIMENSION X (*)` [duplicate]

В дополнение к другим ответам, я рекомендую эту онлайн-службу open source jsonschema2pojo.org для быстрого генерации Java-классов из json или json-схемы для GSON, Jackson 1.x или Jackson 2.x. Например, если у вас есть:

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    }
    "posts": [
         {
              "post_id": "123456789012_123456789012",
              "actor_id": 1234567890,
              "picOfPersonWhoPosted": "http://example.com/photo.jpg",
              "nameOfPersonWhoPosted": "Jane Doe",
              "message": "Sounds cool. Can't wait to see it!",
              "likesCount": 2,
              "comments": [],
              "timeOfPost": 1234567890
         }
    ]
}

jsonschema2pojo.org для генерируемого GSON:

@Generated("org.jsonschema2pojo")
public class Container {
    @SerializedName("pageInfo")
    @Expose
    public PageInfo pageInfo;
    @SerializedName("posts")
    @Expose
    public List posts = new ArrayList();
}

@Generated("org.jsonschema2pojo")
public class PageInfo {
    @SerializedName("pageName")
    @Expose
    public String pageName;
    @SerializedName("pagePic")
    @Expose
    public String pagePic;
}

@Generated("org.jsonschema2pojo")
public class Post {
    @SerializedName("post_id")
    @Expose
    public String postId;
    @SerializedName("actor_id")
    @Expose
    public long actorId;
    @SerializedName("picOfPersonWhoPosted")
    @Expose
    public String picOfPersonWhoPosted;
    @SerializedName("nameOfPersonWhoPosted")
    @Expose
    public String nameOfPersonWhoPosted;
    @SerializedName("message")
    @Expose
    public String message;
    @SerializedName("likesCount")
    @Expose
    public long likesCount;
    @SerializedName("comments")
    @Expose
    public List comments = new ArrayList();
    @SerializedName("timeOfPost")
    @Expose
    public long timeOfPost;
}

19
задан DilithiumMatrix 3 July 2014 в 01:48
поделиться

2 ответа

Форма

real, dimension(:) :: arr

объявляет массив предполагаемой формы , а форма

real :: arr(*)

объявляет предполагаемый размер .

И, да, между их использованием существуют различия. Различия возникают из-за того, что, примерно, компилятор «знает» форму массива предполагаемой формы, но не массива предполагаемого размера. Дополнительная информация, доступная компилятору, означает, что, помимо прочего, массивы предполагаемых форм могут использоваться в выражениях всего массива. Массив предполагаемого размера может использоваться только в выражениях целого массива, когда он является фактическим аргументом в ссылке на процедуру, которая не требует формы массива. О, а также в вызове внутреннему lbound - но не в вызове внутреннего ubound. Существуют и другие тонкие, и не очень тонкие различия, которые обнаруживают ваше близкое чтение стандарта или хорошей книги Fortran.

Некоторые советы для новых программистов Fortran - использовать массивы предполагаемой формы, когда возможное. Они не были доступны до Fortran 90, поэтому вы увидите множество массивов предполагаемого размера в старом коде. Предполагаемые формы массивов лучше в новом коде, потому что функции shape и size могут использоваться для запроса их размеров, чтобы избежать ошибок за пределами границ и allocate массивов, размеры которых зависят от размеров входных массивов .

36
ответ дан francescalus 23 August 2018 в 18:25
поделиться

Ответ высокой производительности Mark объясняет разницу между двумя утверждениями - короче говоря: да, есть разница; только один объявляет массив предполагаемого размера - и последствия.

Однако, как и dimension(:), но упоминается, казалось бы, против not dimension(*), я добавлю одно.

real, dimension(:) :: arr1
real, dimension(*) :: arr2

эквивалентно

real :: arr1(:)
real :: arr2(*)

или даже с помощью операторов dimension. [Я не хочу этого поощрять, поэтому я не буду выписывать этот пример.]

Важное различие в вопросе заключается в использовании * и :, а не dimension ,

Возможно, было некоторое слияние предполагаемого размера с фиктивным аргументом ? Это как фиктивный аргумент, где этот выбор наиболее распространен.

13
ответ дан Community 23 August 2018 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: