IDL中如何定义 动态数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDL中如何定义 动态数组?相关的知识,希望对你有一定的参考价值。

参考技术A idl中变量无需显示声明,变量的数据类型可以灵活变化,声明为5个元素的数组,完全可以赋值为7个元素,因而在数组元素个数上是动态的。一般,在数组元素无法确定时,常采用数组合并的方式来动态的扩充数组,同时保持数组原有元素的不变性。数组合并的运算符为“[ ]”,可以针对数组指定维进行合并,在IDL帮助中输入concatenation array,可以找到相关的信息。追问

谢谢您,就像这样:b=[b,a[i]],循环增加。还想问一个问题,idl中如何显示多波段图像,目的是读取每个波段的像元值,如何写代码?谢谢您。

追答

请在优酷网站(www.youku.com)中搜索“2010年IDL培训班-北京站_7月20日-06ENVI格式二进制文件读取”,视频中介绍如何用IDL读取ENVI的IMG文件。整个过程以及程序介绍都较为详细,希望对您有帮助。

追问

谢谢你。

参考技术B IDL下的数组无需定义,动态是啥意思?数组大小不定?
1、指针来实现;
2、数组[]运算符操作
IDL> arr = [1,2]
IDL> arr = [arr,[3,4]]
IDL> help,arr
ARR INT = Array[4]追问

谢谢你的回答,动态就是起初 arr 什么都没有,只是个地址,然后在程序运行过程中不断的改变大小及数值。

追答

晕,这是指针的定义吧,指针就干这个事情的。
用Ptr_New来操作。
给本参考教材:
http://hi.baidu.com/dyqwrp/blog/item/5e88d366755bd037ab184cb3.html

本回答被提问者采纳
参考技术C 嗯嗯百度地图

本数据来源于百度地图,最终结果以百度地图最新数据为准。

我如何在cpp-winrt idl文件和普通/标准cpp类中使用相同的名称空间名称?

该场景是新的,我相信这可能是cpp-winrt模块或vc编译器中的错误。

问题1.使用通用窗口的cpp-winrt模板创建“ Windows运行时组件”。2.注意在idl文件中定义的名称空间名称。默认情况下,idl文件名为class.idl。3.使用类向导将“新的标准cpp类”添加到项目中。4.将新类放在与idl文件中定义的名称空间名称相同的名称下。5.构建项目。一种。构建应该成功。6.在运行时实现类中使用标准cpp类。7.现在尝试再次构建项目。一种。这次构建将失败。

原因1. cppwinrt.exe从idl文件生成源文件。2.运行时实现类名称空间以“ winrt”为前缀。3.标准cpp类未以名称空间“ winrt”作为前缀。4. vc编译器期望标准cpp类命名空间从“ winrt”开始5. 否则,即使尝试使用完全限定的名称空间名称,名称解析也会失败。

示例运行时IDL文件


namespace NMLevel1.NMLevel2
{
    [default_interface]
    runtimeclass Class
    {
        Class();
        void RuntimeMethod1();
        Int32 RuntimeMethod2(Int32 arg1);
        String RuntimeMethod3(String arg1);
        Int32 MyProperty;
    }
}

标准cpp文件示例

#pragma once
#include <string>
using namespace std;

namespace NMLevel1::NMLevel2
{
    class StdCPPClass
    {
    public:
        StdCPPClass();
        virtual ~StdCPPClass();

        void method1();
        int method2(int arg1);
        wstring method3(wstring arg1);
    };
}

示例运行时类实现

#include "pch.h"
#include "Class.h"
#include "NMLevel1.NMLevel2.Class.g.cpp"
#include "StdCPPClass.h"

using namespace winrt;
using namespace Windows::Foundation;

namespace winrt::NMLevel1::NMLevel2::implementation
{
    void Class::RuntimeMethod1()
    {
        NMLevel1::NMLevel2::StdCPPClass stdcls;

        Uri uri(L"http://aka.ms/cppwinrt");
        //printf("Hello, %ls!
", uri.AbsoluteUri().c_str());
        printf("RuntimeMethod1(): Hello, %ls!
", stdcls.method3(uri.AbsoluteUri().c_str()).c_str());
    }
}

NMLevel1 :: NMLevel2 :: StdCPPClass stdcls;在不给名称空间加上winrt的情况下是不允许的。

这是无法克服的错误或设计限制吗?或如何在idl和cpp文件中使用相同的名称空间'NMLevel1 :: NMLevel2'?

答案

C ++中的名称查找相当复杂,特别是当名称空间实际上是通过using声明合并时。为了帮助编译器识别所需的名称,您必须明确,并使用完全限定名称(与示例中的限定名称相反)。

您必须更改

void Class::RuntimeMethod1()
{
    NMLevel1::NMLevel2::StdCPPClass stdcls;
    // ...
}

to

void Class::RuntimeMethod1()
{
    ::NMLevel1::NMLevel2::StdCPPClass stdcls;
    // ...
}

请注意领先的::范围解析,它限制了对全局范围(或​​通过using声明引入全局​​名称空间的名称空间)的查找。您可以在此处找到其他信息:Qualified name lookup

以上是关于IDL中如何定义 动态数组?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何定义动态数组

如何定义一个动态的数组

C语言如何定义一个动态数组?

c++中怎样定义动态数组

c语言动态数组如何扩充空间

C语言如何定义动态数组