Объявление размера 2D-массива - первое измерение должно быть одним элементом из массива 1D [дубликат]

Невозможность связывания с соответствующими библиотеками / объектными файлами или компиляция файлов реализации

Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.

В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.

g++ -o test objectFile1.o objectFile2.o -lLibraryName

Здесь libraryName - это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so, но вы должны писать только -lfoo. В Windows этот же файл можно назвать foo.lib, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›. Обязательно не записывайте пробел после -l или -L.

Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в

В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы, и будет создан файл lib (в общем использовании). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies. (путь к файлу lib должен быть добавлен в Linker -> General -> Additional Library Directories). При использовании сторонней библиотеки, которая предоставляется с файлом lib, отказ в этом обычно приводит к ошибке.

Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).

В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».

11
задан milancurcic 19 August 2013 в 17:13
поделиться

2 ответа

Да и нет. Сначала no:

Правильные массивы в Fortran, такие как объявленные следующим образом:

integer, dimension(3,3,4) :: an_array

или как это

integer, dimension(:,:,:,:), allocatable :: an_array

являются регулярными; для каждого измерения существует только одна степень.

Но, если вы хотите определить свой собственный тип для оборванного массива, вы можете, и это относительно легко:

type :: vector
    integer, dimension(:), allocatable :: elements
end type vector

type :: ragged_array
    type(vector), dimension(:), allocatable :: vectors
end type ragged_array

С помощью этого вы можете выделить elements для каждого из vectors для другого размера. Например:

type(ragged_array) :: ragarr
...
allocate(ragarr%vectors(5))
...
allocate(ragarr%vectors(1)%elements(3))
allocate(ragarr%vectors(2)%elements(4))
allocate(ragarr%vectors(3)%elements(6))
17
ответ дан High Performance Mark 27 August 2018 в 22:19
поделиться

, смотрящий на первый ответ, кажется, что нет необходимости создавать производный тип vector, который на самом деле является всего лишь распределяемым целым массивом:

    type ragged_array
    integer,allocatable::v(:)
    end type ragged_array
    type(ragged_array),allocatable::r(:)
    allocate(r(3))
    allocate(r(1)%v(5))
    allocate(r(2)%v(10))
    allocate(r(3)%v(15))

это делает запись немного менее громоздкой ..

4
ответ дан agentp 27 August 2018 в 22:19
поделиться
Другие вопросы по тегам:

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