English프랑스어스페인어

온웍스 파비콘

PDL::APIp - 클라우드의 온라인

Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터를 통해 OnWorks 무료 호스팅 제공업체에서 PDL::APIp 실행

Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터와 같은 여러 무료 온라인 워크스테이션 중 하나를 사용하여 OnWorks 무료 호스팅 공급자에서 실행할 수 있는 PDL::APIp 명령입니다.

프로그램:

이름


PDL::API - Perl 및 C/XS 코드에서 piddle 만들기

기술


수동으로 피들을 만드는 방법에 대한 간단한 요리책입니다. Perl과 C/XS를 모두 다룹니다.
수준. 또한 다른 서버에서 액세스할 수 있는 PDL 핵심 루틴에 대해 설명합니다.
모듈. 이러한 루틴은 기본적으로 PDL API를 정의합니다. 에서 piddle에 액세스해야 하는 경우
C/XS는 아마도 이러한 기능에 대해 알아야 할 것입니다.

개요


PDL 사용;
하위 mkmypiddle {
...
}

만들기 a 피들 수동으로


때때로 당신은 피들을 만들고 싶습니다 수동으로 이진 데이터에서. 당신은 할 수 있습니다
펄 수준. 배포판의 예에는 일부 IO 루틴이 포함됩니다. 코드
아래 스니펫은 필요한 단계를 보여줍니다.

잉어를 사용하십시오.
하위 mkmypiddle {
내 $class = 시프트;
내 $pdl = $class->new;
$pdl->set_datatype($PDL_B);
내 @dims = (1,3,4);
내 $크기 = 1;
for (@dims) { $크기 *= $_ }
$pdl->setdims([@dims]);
내 $dref = $pdl->get_dataref();

# 파일에서 직접 데이터 읽기
내 $file 열기, '
내 $len = $size*PDL::Core::howbig($pdl->get_datatype);
croak "충분한 데이터를 읽을 수 없습니다"
읽기( $file, $$dref, $len) != $len;
닫기 $file;
$pdl->upd_data();

반환 $pdl;
}

만들기 a 피들 in C


다음 예제에서는 C 수준에서 piddle을 만듭니다. 우리는 "인라인" 모듈을 사용합니다.
요즘 Perl과 C를 인터페이스하는 방법입니다. "PDL_INCLUDE" 사용에 유의하십시오.
에서 가져온 "PDL_TYPEMAP", "PDL_AUTO_INCLUDE" 및 "PDL_BOOT" 기능
"PDL::코어::개발자". Inline Config 호출과 함께 사용되어 다음을 보장합니다.
PDL typemap, PDL 포함 파일 및 PDL Core 루틴은
컴파일 및 이후 런타임 실행.

PDL::LiteF 사용;
PDL::Core::Dev 사용;

$a = myfloatseq(); # 우리의 C 피들 생성자를 실행

print $a->info,"\n";

# 이 구성 호출의 이유는 아래에 설명되어 있습니다.
인라인 C 사용 => 구성 =>
INC => &PDL_INCLUDE, # pdlcore.h 등을 찾는지 확인
TYPEMAPS => &PDL_TYPEMAP, # PDL 타입맵 사용
AUTO_INCLUDE => &PDL_AUTO_INCLUDE, # 전역 선언 및 포함
부트 => &PDL_BOOT; # Core 구조체를 로드하기 위한 부팅 코드

인라인 C를 사용하십시오.
인라인->초기화; # 이 스크립트를 '실행'-로드할 수 있기를 원할 때 유용합니다.

__데이터__

__씨__

정적 pdl* new_pdl(int 데이터 유형, PDL_Indx dims[], int ndims)
{
pdl *p = PDL->pdlnew();
PDL->setdims(p, dims, ndims); /* 희미하게 설정 */
p->데이터 유형 = 데이터 유형; /* 및 데이터 유형 */
PDL->allocdata(p); /* 데이터 청크 할당 */

반환 p;
}

pdl* myfloatseq()
{
PDL_Indx 희미함[] = {5,5,5};
pdl *p = new_pdl(PDL_F,dims,3);
PDL_Float *dataf = (PDL_Float *) p->데이터;
PDL_Indx i; /* 차원은 64비트일 수 있음 */

for (i=0;i<5*5*5;i++)
dataf[i] = i; /* 데이터를 초기화해야 합니다! */
반환 p;
}

포장 your 자신의 데이터 으로 a 피들
때때로 이미지 처리와 같은 다른 소스에서 데이터 청크를 얻습니다.
라이브러리 등이 있습니다. 이 경우에 원하는 것은 데이터를 piddle 구조체로 래핑하는 것입니다.
C 레벨. 이 접근 방식을 사용하는 예는 IO 모듈에서 찾을 수 있습니다(여기서 FastRaw는
및 FlexRaw는 mmapped 액세스에 사용) 및 Gimp Perl 모듈(Gimp를 래핑하는 데 사용)
픽셀 영역을 piddle로). 다음 스크립트는 간단한 예를 보여줍니다.

PDL::LiteF 사용;
PDL::Core::Dev 사용;
PDL::그래픽::PGPLOT 사용;

$b = mkpiddle();

print $b->정보,"\n";

이미지1 $b;

인라인 C 사용 => 구성 =>
INC => &PDL_INCLUDE,
TYPEMAPS => &PDL_TYPEMAP,
AUTO_INCLUDE => &PDL_AUTO_INCLUDE,
부트 => &PDL_BOOT;

인라인 C를 사용하십시오.
인라인->초기화;

__데이터__

__씨__

/* 사용자가 제공한 데이터 청크를 piddle로 래핑합니다.
* 치수(dims,ndims) 및
* 데이터 유형(데이터 유형에 대한 상수는 선언됨
* pdl.h에서; 예를 들어 바이트 유형에 대한 PDL_B 등)
*
* 생성된 piddle 'npdl'이
* Perl 측 'delete_magic'으로 전달된 함수
* 매개변수는 pdl 구조에 대한 포인터와 함께 호출됩니다.
* 및 'delparam' 인수.
* 이렇게 하면 정리 작업을 수행할 수 있습니다.
* 꼭 필요합니다. 예를 들어 다음을 수행해야 할 수 있습니다.
* 리소스를 해제하는 함수를 명시적으로 호출
* 데이터 포인터와 연결됩니다.
* 최소한 'delete_magic'은 piddle의 데이터 포인터를 XNUMX으로 만들어야 합니다.
*
* void delete_mydata(pdl* pdl, int param)
* {
* pdl->데이터 = 0;
*}
* pdl *p = pdl_wrap(mydata, PDL_B, 희미한, ndims, delete_mydata,0);
*
* pdl_wrap은 pdl에 대한 포인터를 반환합니다.
* 생성된 것입니다.
*/
typedef void (*DelMagic)(pdl *, int param);
정적 무효 default_magic(pdl *p, int pa) { p->데이터 = 0; }
정적 pdl* pdl_wrap(void *data, int 데이터 유형, PDL_Indx dims[],
int ndims, DelMagic delete_magic, int delparam)
{
pdl* npdl = PDL->pdlnew(); /* 빈 컨테이너 얻기 */

PDL->setdims(npdl,dims,ndims); /* 희미하게 설정 */
npdl->데이터 유형 = 데이터 유형; /* 및 데이터 유형 */
npdl->데이터 = 데이터; /* 데이터를 가리킴 */
/* 코어가 데이터에 간섭하지 않도록 합니다 */
npdl->상태 |= PDL_DONTTOUCHDATA | PDL_할당됨;
if (delete_magic != NULL)
PDL->add_deleteddata_magic(npdl, delete_magic, delparam);
그렇지 않으면
PDL->add_deleteddata_magic(npdl, default_magic, 0);
반환 npdl;
}

#SZ 256 정의
/* 램프 이미지를 만드는 정말 어리석은 함수
* 실제로 이것은 불투명한 함수일 수 있습니다.
* 사용 중인 일부 라이브러리에서
*/
정적 PDL_Byte* mkramp(무효)
{
PDL_Byte *데이터;
정수 i; /* 64비트 pdl 인덱싱을 지원하려면 PDL_Indx를 사용해야 함 */

if ((데이터 = malloc(SZ*SZ*sizeof(PDL_Byte))) == NULL)
croak("mkramp: 메모리를 할당할 수 없습니다.");
(i=0;i에 대해
데이터[i] = i % SZ;

반환 데이터;
}

/* 이 함수는 필요한 정리 작업을 처리합니다 */
정적 무효 delete_myramp(pdl* p, int param)
{
if (p->데이터)
무료(p->데이터);
p->데이터 = 0;
}

pdl* mkpiddle()
{
PDL_Indx 희미함[] = {SZ,SZ};
pdl *p;

p = pdl_wrap((void *) mkramp(), PDL_B, 희미한, 2,
delete_myramp,0); /* delparam은 임의로 0으로 설정됨 */
반환 p;
}

이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 세부설명


이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 핵심 구조체 -- 점점 at PDL core 루틴 at 런타임
PDL은 Tk 모듈이 사용하는 것과 유사한 기술을 사용하여 다른 모듈이
핵심 루틴. 모든 공유 코어 PDL 루틴에 대한 포인터는 $PDL::SHARE에 저장됩니다.
변하기 쉬운. XS 코드는 부팅 시 이 포인터를 유지해야 합니다.
그런 다음 C/XS 코드는 런타임에 액세스하기 위해 해당 포인터를 사용할 수 있습니다. 이 초기 로딩은
포인터는 "PDL_AUTO_INCLUDE" 및 "PDL_BOOT" 기능을 사용하여 가장 쉽게 얻을 수 있습니다.
"PDL::Core::Dev"에 의해 정의되고 내보내집니다. 인라인 모듈의 일반적인 사용법은 다음과 같습니다.
이미 입증되었습니다:

인라인 C 사용 => 구성 =>
INC => &PDL_INCLUDE,
TYPEMAPS => &PDL_TYPEMAP,
AUTO_INCLUDE => &PDL_AUTO_INCLUDE, # 선언
부트 => &PDL_BOOT; # XS 부팅 섹션 코드

"PDL_AUTO_INCLUDE"에 의해 반환된 코드는 다음을 확인합니다. pdlcore.h 포함되어 선언
정적 변수는 "Core" 구조체에 대한 포인터를 보유합니다. 그것은 다음과 같이 보입니다
이:

인쇄 PDL_AUTO_INCLUDE;

#포함하다
정적 코어* PDL; /* 구조에는 핵심 C 기능이 포함됨 */
정적 SV* CoreSV; /* 코어 구조를 유지하는 Perl var에 대한 포인터를 가져옵니다. */

"PDL_BOOT"에 의해 반환된 코드는 $PDL::SHARE 변수를 검색하고
"Core" 구조체에 대한 포인터입니다. Perl API에 대해 알고 있는 사람들을 위해 여기에 있습니다.
암호:

인쇄 PDL_BOOT;

perl_require_pv ("PDL::코어"); /* PDL::Core가 로드되었는지 확인 */
CoreSV = perl_get_sv("PDL::SHARE",FALSE); /* SV* 값 */
#ifndef aTHX_
#aTHX_ 정의
#endif
if (CoreSV==NULL)
Perl_croak(aTHX_ "찾을 수 없는 PDL::Core 모듈이 필요합니다.");
PDL = INT2PTR(코어*,SvIV(코어SV)); /* 핵심* 값 */
if (PDL->버전 != PDL_CORE_VERSION)
Perl_croak(aTHX_ "새로 설치된 PDL에 대해 코드를 다시 컴파일해야 합니다.");

"핵심" 구조체에는 버전 정보가 포함되어 있어 정의된 구조가 pdlcore.h
실제로 런타임에 얻은 것과 일치합니다. 위의 코드는 이것을 테스트합니다.

if (PDL->버전 != PDL_CORE_VERSION)
....

Core 구조체에 대한 자세한 내용은 PDL::Internals를 참조하세요.

이러한 준비를 통해 코드는 이제 이미 표시된 대로 핵심 루틴에 액세스할 수 있습니다.
위의 예 중 일부, 예를 들어

pdl *p = PDL->pdlnew();

기본적으로 "PDL"이라는 C 변수는 "Core" 구조체에 대한 포인터를 유지하는 데 사용됩니다. 만약에
그것은 (어떤 이유에서든) 당신이 명시적으로 이름을 지정할 수 있는 문제입니다.
"PDL_AUTO_INCLUDE" 및 "PDL_BOOT" 루틴이 있는 변수:

인라인 C 사용 => 구성 =>
INC => &PDL_INCLUDE,
TYPEMAPS => &PDL_TYPEMAP,
AUTO_INCLUDE => &PDL_AUTO_INCLUDE 'PDL_Corep',
BOOT => &PDL_BOOT 'PDL_Corep';

"PDL_AUTO_INCLUDE" 및 "PDL_BOOT"와 동일한 식별자를 사용하고 있는지 확인하십시오.
자신의 코드에서 동일한 식별자. 예를 들어, 위의 예에서 계속:

pdl *p = PDL_Corep->pdlnew();

일부 선택된 core 루틴 설명
"Core" 구조체의 전체 정의는 파일에서 찾을 수 있습니다. pdlcore.h. 에서
다음은 이 구조체에서 가장 자주 사용되는 멤버 함수에 대한 간략한 설명입니다.

· "pdl *SvPDLV(SV *sv)"

· "pdl *SetSV_PDL(SV *sv, pdl *it)"

· "pdl *pdlnew()"

"pdlnew"는 추가 초기화가 필요한 빈 pdl 개체를 반환합니다.
적절한 피들로. 예:

pdl *p = PDL->pdlnew();
PDL->setdims(p,dims,ndims);
p->데이터 유형 = PDL_B;

· "pdl *null()"

· "SV *copy(pdl* p, char* )"

· "void *smalloc(STRLEN nbytes)"

· "int howbig(int pdl_datatype)"

· "void add_deleteddata_magic(pdl *p, void (*func)(pdl*, int), int param)"

· "무효 할당 데이터(pdl *p)"

· "보이드 make_physical(pdl *p)"

· "무효 make_physdims(pdl *p)"

· "무효 make_physvaffine(pdl *p)"

· "void qsort_X(PDL_Xtype *data, PDL_Indx a, PDL_Indx b)" 및 "void
qsort_ind_X(PDL_Xtype *데이터, PDL_Indx *ix, PDL_Indx a, PDL_Indx b)"

여기서 X는 B,S,U,L,F,D 중 하나이고 Xtype은 Byte, Short, Ushort, Long, Float 또는
더블. PDL_Indx는 적절한 인덱싱 크기에 해당하는 C 정수 유형입니다.
perl 구성용(ivsize 및 ivtype). '롱' 또는 '롱'일 수 있습니다.
long'은 perl이 32비트인지 64비트인지에 따라 다릅니다.

· "플로트 NaN_float" 및 "double NaN_double"

필요한 NaN 값을 생성하는 상수입니다.

· "void pdl_barf(const char* pat,...)" 및 "void pdl_warn(const char* pat,...)"

이들은 "barf" 및 "warn"에 해당하는 C 코드입니다. 여기에는 특수 처리가 포함됩니다.
pthreading(예: 프로세서 멀티스레딩) 동안 오류 또는 경고 메시지
pthreading이 완료될 때까지 메시지를 연기하십시오. pthreading이 완료되면
perl의 "barf" 또는 "warn"은 지연된 메시지와 함께 호출됩니다. 유지하기 위해 필요합니다.
segfaults를 일으킬 수 있는 pthreading 동안 perl의 "barf" 또는 "warn" 호출로부터.

"barf" 및 "warn"이 재정의되었습니다(c-전처리기 매크로 사용).
pdlcore.h를 "PDL->barf" 및 "PDL->warn"으로 변경합니다. XS 또는 PP 코드를
Perl의 "barf" 또는 "warn"을 직접 호출하면 segfault가 발생할 수 있습니다.
pthreading.

pthreading에 대한 자세한 내용은 PDL::ParallelCPU를 참조하십시오.

onworks.net 서비스를 사용하여 PDL::APIp 온라인 사용


무료 서버 및 워크스테이션

Windows 및 Linux 앱 다운로드

Linux 명령

Ad