1

голосов
1

ответ
95

Просмотры

Почему модуль «МПИ» Mpich 3.0 в опускаем явные интерфейсы для некоторых процедур?

Я работаю на построение MPI на основе программы молекулярной динамики от нескольких реализаций MPI (отдельно), и я столкнулся корягу с MPICH 3.0: кажется, не предоставлять явные интерфейсы для нескольких процедур MPI. Некоторые из пострадавших процедур MPI_Bcast (), mpi_ssend (), MPI_RECV (), и MPI_Finalize (). MPICH 3.0 действительно обеспечивает явные интерфейсы для некоторых процедур, однако, такие как MPI_INIT (). Этот пример кода демонстрирует проблему: программа mpitest использовать МПИ целое IERR IERR = 0 вызов dummy_implicit (IERR) вызов MPI_Init (IERR), если (IERR / = 0), то написать (*, *) 'MPI_Init () не' стоп ENDIF вызова MPI_FINALIZE (IERR), если (IERR / = 0), то написать (*, *) 'MPI_Finalize () не удалось' ENDIF остановить конец программы Если я строю эту программу на CentOS 7 против MPICH 3.0.4, я получаю этот результат: $, Которые mpif90 / USR / lib64 / MPICH / бен / mpif90 $ mpif90 -Wimplicit-интерфейс -c -o mpitest.o mpitest.f90 mpitest.f90: 6,31: вызов dummy_implicit (IERR) 1 Внимание: Процедура 'dummy_implicit' вызывается с неявный интерфейс в (1) mpitest.f90: 15,29: вызов MPI_FINALIZE (IERR) 1 Внимание: Процедура «MPI_Finalize» вызывается с неявным интерфейсом в (1) $ Предупреждение о процедуре dummy_implicit (), как ожидается, и правильно, но я ожидаю, MPICH обеспечить явный интерфейс для MPI_FINALIZE (), так же, как он, по-видимому делает для MPI_INIT (). Более того, я считаю, что если я построю ту же программу против MPICH 3.2 или OpenMPI 1.10.3 то неявное предупреждение интерфейса излучается только для процедуры dummy_implicit (). Эта проблема имеет некоторое сходство с одной отчётными против MPICH2, но один (1) было сообщено против MPICH 2, а не 3 MPICH, и (2) был закрыт около 5 лет назад. Я хочу, чтобы гарантировать, что у меня есть явные интерфейсы в объеме для всех моих вызовов процедур. Я могу предоставить недостающие вручную, если это необходимо, но, конечно, это не предполагаемая модель использования, а также не требуется для других реализаций MPI. Что я делаю неправильно? Мне действительно нужно, чтобы обеспечить явные интерфейсы вручную?
John Bollinger
12

голосов
4

ответ
5.7k

Просмотры

C function call with too few arguments

Я работаю на некоторый код наследие C. Исходный код был написан в середине 90-х годов, нацеливание Solaris и C компилятор Sun в той эпохи. Текущая версия компилирует под GCC 4 (хотя и со многими предупреждениями), и это, кажется, работает, но я стараюсь, чтобы привести в порядок его - я хочу, чтобы выжать как можно больше скрытых ошибок, как это возможно, как я могу определить, что может быть необходимо адаптировать его к 64-разрядных платформ и компиляторов, кроме того, он был построен для. Одна из моих основных направлений деятельности в этой связи в том, чтобы гарантировать, что все функции имеют полные прототипы (что многие из них не имеют), и в этом контексте я обнаружил некоторый код, который вызывает функцию (ранее не-прототип) с меньшим количеством аргументов, чем функции определение заявляет. Реализация функции действительно использует значение отсутствующего аргумента. Пример: impl.c: INT Foo (INT один, ИНТ два) {если (два) {вернуть один; } Еще {возвращать одно + 1; }} Client1.c: ехЬегп Foo (); ИНТ-бар () {/ * только один аргумент: * / возврат Foo (42); (!) } Client2.c: ехЬегп INT Foo (); INT (* foop) () = Foo; ИНТ Баз () {/ * вызывает ту же функцию, как и бар (), но с двумя аргументами: * / возврата (* foop) (17, 23); } Вопросы: определяется результат вызова функции с отсутствующими аргументами? Если да, то какое значение будет функция приема для неопределенного аргумента? В противном случае, будет ли ВС компилятор Си ок 1996 (для Solaris, не VMS) проявил предсказуемое поведение конкретной реализации, что я могу эмулировать путем добавления определенного значения аргумента затрагиваемых вызовов? ехЬегп INT Foo (); INT (* foop) () = Foo; ИНТ Баз () {/ * вызывает ту же функцию, как и бар (), но с двумя аргументами: * / возврата (* foop) (17, 23); } Вопросы: определяется результат вызова функции с отсутствующими аргументами? Если да, то какое значение будет функция приема для неопределенного аргумента? В противном случае, будет ли ВС компилятор Си ок 1996 (для Solaris, не VMS) проявил предсказуемое поведение конкретной реализации, что я могу эмулировать путем добавления определенного значения аргумента затрагиваемых вызовов? ехЬегп INT Foo (); INT (* foop) () = Foo; ИНТ Баз () {/ * вызывает ту же функцию, как и бар (), но с двумя аргументами: * / возврата (* foop) (17, 23); } Вопросы: определяется результат вызова функции с отсутствующими аргументами? Если да, то какое значение будет функция приема для неопределенного аргумента? В противном случае, будет ли ВС компилятор Си ок 1996 (для Solaris, не VMS) проявил предсказуемое поведение конкретной реализации, что я могу эмулировать путем добавления определенного значения аргумента затрагиваемых вызовов?
John Bollinger
3

голосов
1

ответ
393

Просмотры

Is this Unicode NFC conversion correct?

Я работаю на C проект, который должен генерировать «нечувствительны к регистру» нормированные формы кусков текста Unicode. Я выбрал, чтобы определить, как нормализованное форму, что достигается за счет первого преобразования в нормализации формы NFD, затем применяя случай Unicode алгоритм складывания, и, наконец, преобразование результата к нормализации Unicode формы NFC. Я полагаюсь на C API ICU для его представления и функции полезности Unicode, и это было довольно просто реализовать мою схему с использованием unorm_normalize Icu () и u_strFoldCase () функции. Но один из моих тестов не удается, и я не понимаю, почему. ICU, кажется, генерируя различные формы NFC, чем я ожидал. Входная последовательность состоит из этих точек BMP код: U + 0020, U + 1EA5, U + 0328, U + 1EC4, U + 031C Через отладчик, Я решил, что СИС и я согласен по поводу промежуточного результата после случая складывания: U + 0020 U + 0061 U + 0328 U + 0302 U + 0301 U + 0065 U + 031C U + 0302 U + 0303 Примечание, в частности, что ранее преобразование в образуют NFD переехал символ U + 031C в середине разложения U + 1EC4, в соответствующих случаях, на основе относительных чисел КТС для персонажей, вовлеченных. Это часть того, что я пытаюсь проверить. Теперь хорошая часть: в соответствии с ICU, НФК нормализация сложенной последовательности символов является U + 0020 U + 0105 U + 0302 U + 0301 U + 1ec5 U + 031C, тогда я думаю, что это должно быть U + 0020 U + 0105 U + 0302 U + 0301 U + 0065 U + 031C U + 0302 U + 0303, так как эти три конечные символы, сочетающих уже находятся в каноническом порядке, и не существует никакого канонического состава U + 0065 и U + 031C. Итак, два вопроса: что является правильной формы NFC? Если СИС правильно, то почему? Что является правильной формой NFC? Если СИС правильно, то почему? Что является правильной формой NFC? Если СИС правильно, то почему? U + 0020 U + 0061 U + 0328 U + 0302 U + 0301 U + 0065 U + 031C U + 0302 U + 0303 Обратите внимание, в частности, что ранее преобразования для формирования NFD переехал символов U + 031C в середине разложения U + 1EC4, в соответствующих случаях, на основе относительных чисел КТС для персонажей, вовлеченных. Это часть того, что я пытаюсь проверить. Теперь хорошая часть: в соответствии с ICU, НФК нормализация сложенной последовательности символов является U + 0020 U + 0105 U + 0302 U + 0301 U + 1ec5 U + 031C, тогда я думаю, что это должно быть U + 0020 U + 0105 U + 0302 U + 0301 U + 0065 U + 031C U + 0302 U + 0303, так как эти три конечные символы, сочетающих уже находятся в каноническом порядке, и не существует никакого канонического состава U + 0065 и U + 031C. Итак, два вопроса: что является правильной формы NFC? Если СИС правильно, то почему? U + 0020 U + 0061 U + 0328 U + 0302 U + 0301 U + 0065 U + 031C U + 0302 U + 0303 Обратите внимание, в частности, что ранее преобразования для формирования NFD переехал символов U + 031C в середине разложения U + 1EC4, в соответствующих случаях, на основе относительных чисел КТС для персонажей, вовлеченных. Это часть того, что я пытаюсь проверить. Теперь хорошая часть: в соответствии с ICU, НФК нормализация сложенной последовательности символов является U + 0020 U + 0105 U + 0302 U + 0301 U + 1ec5 U + 031C, тогда я думаю, что это должно быть U + 0020 U + 0105 U + 0302 U + 0301 U + 0065 U + 031C U + 0302 U + 0303, так как эти три конечные символы, сочетающих уже находятся в каноническом порядке, и не существует никакого канонического состава U + 0065 и U + 031C. Итак, два вопроса: что является правильной формы NFC? Если СИС правильно, то почему? Что является правильной формой NFC? Если СИС правильно, то почему? Что является правильной формой NFC? Если СИС правильно, то почему? Что является правильной формой NFC? Если СИС правильно, то почему? Что является правильной формой NFC? Если СИС правильно, то почему? м пытается проверить. Теперь хорошая часть: в соответствии с ICU, НФК нормализация сложенной последовательности символов является U + 0020 U + 0105 U + 0302 U + 0301 U + 1ec5 U + 031C, тогда я думаю, что это должно быть U + 0020 U + 0105 U + 0302 U + 0301 U + 0065 U + 031C U + 0302 U + 0303, так как эти три конечные символы, сочетающих уже находятся в каноническом порядке, и не существует никакого канонического состава U + 0065 и U + 031C. Итак, два вопроса: что является правильной формы NFC? Если СИС правильно, то почему? м пытается проверить. Теперь хорошая часть: в соответствии с ICU, НФК нормализация сложенной последовательности символов является U + 0020 U + 0105 U + 0302 U + 0301 U + 1ec5 U + 031C, тогда я думаю, что это должно быть U + 0020 U + 0105 U + 0302 U + 0301 U + 0065 U + 031C U + 0302 U + 0303, так как эти три конечные символы, сочетающих уже находятся в каноническом порядке, и не существует никакого канонического состава U + 0065 и U + 031C. Итак, два вопроса: что является правильной формы NFC? Если СИС правильно, то почему? Что является правильной формой NFC? Если СИС правильно, то почему? Что является правильной формой NFC? Если СИС правильно, то почему?
John Bollinger
2

голосов
1

ответ
74

Просмотры

Может «с» используется в качестве идентификатора в Python?

Я работаю на адаптацию Python пакета третьей стороной, предназначенной для Python 2.7 (утверждается) для работы с Python 2.6, который, хотя и устаревшее, остается стандартный Python на многих машинах в моей компетенции. Я использовал модуль compileall, чтобы помочь мне определить проблемы совместимости, и я на самом деле объявился очень мало. Только один из них оказался очень устойчиво: код при условии, мне использует «с» в качестве идентификатора в нескольких местах, и в качестве аргумента ключевого слова newitems.append (Data (пункт [:, Numeric.NewAxis], с «линиями» = )) и в качестве имени атрибута self.with = KEYW [ 'с']. Байт-компилятор barfs на этих использований «с», как это кажется, что следует, учитывая, что «с» было ключевым словом, так как Python 2.6. Поскольку модуль в вопросе имеет видимую последнюю дату пересмотра в начале 2010 года, и как это имеет родословную знакомства с гораздо раньше, я склонен думать, что этот модуль никогда не работал в Python 2.7 (как было заявлено), ни даже в Python 2.6. Есть ли другие правдоподобные выводы? Есть ли разумный путь вперед, кроме замены «с» с другим идентификатором в оскорбительных контекстах?
John Bollinger
4

голосов
2

ответ
169

Просмотры

Как можно избежать ошибок, расширения функций убивающих оболочки?

Я столкнулся с удивительным поведением в одном из моих скриптов, на сегодняшний день. Это демонстрируется в следующем примере:!. Test.sh # / бен / Баш do_it () {shopt -s failglob {гт killme * эхо "а затем ..."} 2> / DEV / нуль || эхо «ошибка Глоб» эхо «жизнь продолжается ...»} do_it || эхо «функция не удалось» Идея в оригинальном сценарии, что я хотел, чтобы ошибки расширения Глоб произойти для определенной команды, чтобы избежать выполнения, что одной команды, когда не было никаких аргументов, но обнаружить эту ошибку и принять альтернативное действие. Мое ожидание, что когда killme. * Ничего не найдено, выполнение этого скрипта через ./test.sh || эхо «Сценарий не» излучала бы Glob жизнь ошибка продолжается ... или, может быть, функция не удалось. Это не (с Bash 4.2.46). Вместо этого он напечатан сценарий не удалось. Хотя устранение неполадок вопрос, я обнаружил кое-что еще более любопытно: если упростить сценарий дальше, устраняя функции, изменения поведения. То есть, рассмотреть этот альтернативный сценарий: test2.sh # / бен / Баш shopt -s failglob {. Гт killme * эхо "а затем ..."} 2> / DEV / нуль || эхо «ошибка Глоб» эхо «жизнь продолжается ...» Если я бегу, что через ./test2.sh || эхо «Сценарий не», он печатает жизнь продолжается ... Там, кажется, некоторые другие странные вариации, когда функция, как в первом скрипте вызывается в цикле, но я не полностью охарактеризован, что. Вопросы: Является ли это документально поведение? Моя экспертиза руководства Баш была безрезультатной. Он указывает, что «ошибка расширения» происходит, и это вполне естественно, что это» са ошибка оболочки, а не ошибка в команде, но если есть что-нибудь, по которому я должен быть в состоянии предсказать детали наблюдаемых результатов затем я пропустил его. Я могу решить эту проблему, запустив расширение субоболочке, но есть ли легкий вес обходной путь? Я предполагаю, что я мог бы выполнить расширение заранее, с failglob отключено, и проверить результат, но это неаккуратно и содержит условие гонки.
John Bollinger
5

голосов
1

ответ
359

Просмотры

Почему LD_PRELOAD не вступают в силу с не скрипты, имеющие не притон?

Если, когда я бег сценария, я использую LD_PRELOAD назначить библиотеку для предварительной загрузки, я считаю, что библиотека фактически предустановленный только если сценарий имеет притон линию. Например, если этот сценарий: # Не притон эхо Привет и эта команда: LD_PRELOAD = / путь / к / preload_me.so ./script.sh скрипт работает без библиотеки загружаются на все, что я могу контролировать с помощью ( не) последствия его код инициализации. С другой стороны, если добавить хижину строки: #! / Bin / ш эхо Hello ... тогда библиотека загружается при запуске сценария с помощью той же команды. Это, кажется, не имеет значения, какой именно интерпретатор указан; конечно, я могу также использовать / bin / Баш или любой другой ш-семейной оболочки я пытался. Почему существует разница, и есть ли способ, чтобы убедиться, что данная библиотека поджата перед простой командой данной оболочки, независимо от команды? (Взято из другого вопроса, автор которой противостоял вопросу будучи выдержано в этих условиях.)
John Bollinger
2

голосов
1

ответ
301

Просмотры

Rounding to specified absolute decimal precision in C90/99

Я работаю на программное обеспечение, которое, помимо всего прочего, преобразующий измеренные числа между текстом и внутренней (двойной) представления. Необходимая часть процесса является получение текстовых представлений с правильной десятичной точностью на основе статистической неопределенности измерения. Необходимо точность зависит от количества и наименее значащий разряд в нем может быть где угодно, в том числе и слева от (десятичных) единиц места. Правильное округление имеет важное значение для этого процесса, где «правильные» означает, в соответствии с режимом с плавающей точкой округления в силе в то время, или, по крайней мере, в хорошо определенном округлении режима. Таким образом, мне нужно быть осторожным (следующим образом: во избежании) выполнения арифметических операций над промежуточным числом обрабатываемых, потому округления может быть чувствительно даже к наименее значимому биту во внутреннем представлении числа. Я думаю, что я могу сделать почти все необходимое форматирование достаточно хорошо с PRINTF семейством функций, если я сначала вычислить число значащих цифр в требуемом представлении: Sprintf (буфер, «% * е.», Num_sig_figs - 1, номер); Существует один класс случаев угловых, который до сих пор побежденный меня, однако: один, где наиболее значима (десятичная) цифра измеренного числа одно места справа от младшего разряда желаемой точности представления. В этом случае округления следует давать наименьшее (и только) значащей цифры в желаемый результат как 0 или 1, но я не смог придумать способ, чтобы выполнить округление в портативном (*) способ без риска изменение результата. Это похоже на то, что функция mpfr_prec_round MPFR () может сделать, за исключением того, что она работает в двоичной точности, в то время как мне нужно использовать десятичную точность. Так, например, в стандартном режиме округления (круглый к ближайшим со связями округляется до даже): 0,5 выражается в блок (10 ^ 0) точность должна быть «0» или «0e + 00» 654 выражается в тысячах (10 ^ 3 ) точность должна быть «1e + 03» 0,03125 выражается в десятых долях (10 ^ -1) точность должна быть «0» или «0e-01» или даже «0e + 00» (*) «портативный» здесь означает, что код точно выражает вычисления в стандарте, портативный C99 (или лучше, C90). Понятно, что фактический результат может зависеть от деталей машин, и это должно зависеть (и быть совместимыми с) округление режим с плавающей запятой в силе. Какие варианты у меня есть? 5 выражается в блок (10 ^ 0) точность должна быть "0" или "0e + 00" 654 выражается в тысячах (10 ^ 3) точность должна быть "1e + 03" 0,03125 выражается в десятых (10 ^ -1) точность должна быть «0» или «0e-01» или даже «0e + 00» (*) «портативный» здесь означает, что код точно выражает вычисления в стандарте, портативный C99 (или лучше, C90). Понятно, что фактический результат может зависеть от деталей машин, и это должно зависеть (и быть совместимыми с) округление режим с плавающей запятой в силе. Какие варианты у меня есть? 5 выражается в блок (10 ^ 0) точность должна быть "0" или "0e + 00" 654 выражается в тысячах (10 ^ 3) точность должна быть "1e + 03" 0,03125 выражается в десятых (10 ^ -1) точность должна быть «0» или «0e-01» или даже «0e + 00» (*) «портативный» здесь означает, что код точно выражает вычисления в стандарте, портативный C99 (или лучше, C90). Понятно, что фактический результат может зависеть от деталей машин, и это должно зависеть (и быть совместимыми с) округление режим с плавающей запятой в силе. Какие варианты у меня есть? здесь означает, что код точно выражает вычисления в стандарте, портативный C99 (или лучше, C90). Понятно, что фактический результат может зависеть от деталей машин, и это должно зависеть (и быть совместимыми с) округление режим с плавающей запятой в силе. Какие варианты у меня есть? здесь означает, что код точно выражает вычисления в стандарте, портативный C99 (или лучше, C90). Понятно, что фактический результат может зависеть от деталей машин, и это должно зависеть (и быть совместимыми с) округление режим с плавающей запятой в силе. Какие варианты у меня есть?
John Bollinger
8

голосов
3

ответ
399

Просмотры

What does it mean to POSIX that a thread is “suspended”?

В ходе комментария к недавнему вопросу, филиал возник вопрос о том, в какой момент запрос на отмену для PThreads нити с PTHREAD_CANCEL_DEFERRED принудительного завершения можно ожидать, чтобы принять соответствующие меры. Ссылки на стандартные и немного адвокатской последовало. Я не очень обеспокоен конкретно о ли я ошибаюсь в своих комментариях по этому вопросу, но я хотел бы, чтобы убедиться, что я понимаю положение POSIX в правильно. Наиболее уместный раздел стандарта говорит Всякий раз, когда нить разрешено и запрос на аннулирование был сделана с этой нитью в качестве цели, и поток затем вызывает любую функцию, которая является точкой отмены [...], запрос аннулирования быть действовал на прежде чем функция возвращает. Если нити разрешено и запрос на аннулирование производится с нитью в качестве мишени в то время как поток приостанавливается в момент отмены, поток должен пробудиться и запрос на аннулирование должно принять соответствующие меры. Что, тем не менее, это означает для нити, чтобы быть «приостановлен»? POSIX явно определяет термин для процессов, но, насколько я могу судить, для потоков. С другой стороны, документы POSIX нить подвески, чтобы быть среди поведения нескольких функций, в том числе, но не ограничиваясь этим, некоторые из тех, которые связаны с объектами синхронизации. Если один, то делают вывод, что служат в совокупности в качестве соответствующего определения термина? И как все это относится к вопросу, породившей эту строку запроса, учитывая, что POSIX не определяет нити подвески как часть поведения чтения (), Fread (),
John Bollinger
3

голосов
1

ответ
52

Просмотры

Are un-prefixed string literals concatenated with prefixed ones?

В комментарии к этому ответу, возник спор по поводу того, требуется соответствующая реализация C2011, в процессе перевода, чтобы выполнить конкатенацию неразбитого приставкой строковых литералов с соседними префиксом строковых литералов. Примеры: char16_t ustring [] = и "Unicode" "строка"; wchar_t wstring [] = "Wide" L "строка"; C99 же указать, что такое объединение происходит. C ++ 2011 также довольно ясно по этой теме. Соответствующее положение C2011 имеет различные и более строгие формулировки, чем любые из этих, однако: в фазе перевода 6, в многобайтовой последовательности символов, указанная любой последовательностью смежных символов и одинаково с префиксом строковых литералов маркеров объединяется в одну последовательность многобайтовых символов. [...] (C2011, 6.4.5 / 5; курсив) Конечно префикс строкового литерала и без префикса один не «тождественна приставка», верно? С другой стороны, этот пункт продолжается, [...] Если какие-либо из маркеров имеет префикс кодирования, полученные многобайтовую последовательность символов трактуются как имеющие одинаковый префикс; в противном случае она рассматривается как строка символов буквальным. Будьте по-другому приставку широкой строковые лексемы, могут быть объединены, и, если да, то обработка полученной последовательности символов многобайтном зависит от реализации. Первая часть, которая, кажется, обращаясь к рассматриваемому делу, но и, похоже, зависит от стечения выполняется в первую очередь, не уточнив, что она должна быть выполнена. Возможно, последняя часть предназначена для обеспечения, что в реализации определенных поведения, но это не совсем подходит, потому что, хотя Префиксальные и префиксы литералы, конечно «по-разному с префиксом», они не являются широко. Конечно, кажется, что такое объединение, как я описываю предназначено быть выполнено, для примера приведен в пункте 6.4.5 / 9. Но, как все языковые юристы знают, примеры не являются нормативными. Есть ли правдоподобно способ интерпретации нормативного текста требовать корректных реализаций для выполнения этой конкатенации? Или не хватает одного и того же возможно считать дефектом в стандарте? Является ли это реализация определяется ли выполняется такое concatentations? Конечно, кажется, что такое объединение, как я описываю предназначено быть выполнено, для примера приведен в пункте 6.4.5 / 9. Но, как все языковые юристы знают, примеры не являются нормативными. Есть ли правдоподобно способ интерпретации нормативного текста требовать корректных реализаций для выполнения этой конкатенации? Или не хватает одного и того же возможно считать дефектом в стандарте? Является ли это реализация определяется ли выполняется такое concatentations? Конечно, кажется, что такое объединение, как я описываю предназначено быть выполнено, для примера приведен в пункте 6.4.5 / 9. Но, как все языковые юристы знают, примеры не являются нормативными. Есть ли правдоподобно способ интерпретации нормативного текста требовать корректных реализаций для выполнения этой конкатенации? Или не хватает одного и того же возможно считать дефектом в стандарте? Является ли это реализация определяется ли выполняется такое concatentations? Есть ли правдоподобно способ интерпретации нормативного текста требовать корректных реализаций для выполнения этой конкатенации? Или не хватает одного и того же возможно считать дефектом в стандарте? Является ли это реализация определяется ли выполняется такое concatentations? Есть ли правдоподобно способ интерпретации нормативного текста требовать корректных реализаций для выполнения этой конкатенации? Или не хватает одного и того же возможно считать дефектом в стандарте? Является ли это реализация определяется ли выполняется такое concatentations?
John Bollinger
2

голосов
1

ответ
44

Просмотры

Как установить программу GNU Fortran / OpenMP и получить STACKSIZE-Var, ICV?

Я пытаюсь создать программу OpenMP третьей стороной с gfortran / libgomp, но я бегу в проблемы с его использованием расширений для извлечения и установки STACKSIZE-Var, ICV. Источник поставляется с альтернативами для Intel Fortran (kmp_get_stacksize () и kmp_set_stacksize ()) и для компилятора Portland Group (omp_get_stack_size () и omp_set_stack_size ()), но как один сделать то же самое с GNU Fortran и libgomp? Я отдаю себе отчет в OMP_STACKSIZE и переменных окружения GOMP_STACKSIZE, но это мое понимание того, что фактическое ICV отдельно, так что программно установки одного из них после запуска программы не будет влиять на ICV, и что чтение одной только отчеты об этой переменной среды, не на ICV. Это приемлемо для решения быть специфическими для gfortran и / или libgomp работает на Linux. Я'
John Bollinger
7

голосов
3

ответ
2.6k

Просмотры

Лучший способ переносимо присвоить результат fgetc () к полукоксу в C

Может быть, я overthinking это, как мне кажется, что это должно быть намного проще. Я хочу взять значение типа Int, например, возвращается fgetc (), и записать его в буфер полукокса, если это не код конца из-файла. Например: символ ЬиЕ; с = INT fgetc (STDIN); если (с <0) {/ * ручка с истекшим файла * /} еще {ЬиЕ = (символ) с; / * Не совсем правильно * /} Тем не менее, если платформа подписал символы по умолчанию, то значение, возвращаемое fgetc () может быть вне диапазона полукокса, в этом случае отливки или назначение его (подпись) голец производит определенное реализацией поведение (право?). Конечно, хотя, есть тонны кода, что там делает именно эквивалент примера. Является ли все это, опираясь на осуществление определенных поведения и / или при условии, 7-битные данные? Мне кажется, что если я хочу быть уверен, что поведение моего кода определяется C, то, что я хочу, то мне нужно сделать что-то вроде этого: ЬиЕ = (Char) ((с> CHAR_MAX) (с? - (UCHAR_MAX + 1)): с); Я думаю, что производит определенное, правильное поведение, являются ли символы по умолчанию знака или без знака, и независимо даже от размера полукокса. Это правильно? И это действительно необходимое, чтобы сделать это, чтобы обеспечить мобильность?
John Bollinger
5

голосов
1

ответ
536

Просмотры

Что НКУ -D_REENTRANT реально сделать?

Я пишу Java привязки для библиотеки C, и поэтому работать с JNI. Oracle определяет, разумно, что нативные библиотеки для использования с Java должны быть скомпилированы с многопоточных-Aware составителей. Документы JNI дать конкретный пример, что для GCC, это требование многопоточного осознания должно быть удовлетворено путем определения одного из _REENTRANT макросов или _POSIX_C_SOURCE. Это кажется странным для меня. _REENTRANT и _POSIX_C_SOURCE являются функционально тестовые макросы. GCC и POSIX документации описывают их последствия с точки зрения определения символов и декларациями видимы, так же, как я бы ожидать для любого функционально тестового макроса. Если я не нужны дополнительные символы или функции, то эти макросы на самом деле сделать что-нибудь полезное для меня? Есть ли одна или обе причины НКУ, чтобы генерировать другой код, чем он в противном случае был бы? У них может быть причиной моего кода» ые вызовы к стандартным функциям библиотеки, которые будут связаны с различными реализациями? Или Oracle просто говорить из своей преисподней? Edit: Кроме того, это происходит со мной, что Реентерабельность отдельного рассмотрения от многопоточности. Non-Реентерабельность может быть проблемой даже для однопоточных программ, поэтому предложение Oracle о том, что определение _REENTRANT делает НКУ многопоточный-известно теперь, кажется, еще более сомнительными.
John Bollinger