标签: dynamic-arrays

将TArray <X>类型转换为X数组是否安全?

今天我发现了一个编译器错误(QC#108577).

以下程序无法编译:

program Project1;
{$APPTYPE CONSOLE}

procedure P(M: TArray<TArray<Integer>>);
begin
  SetLength(M, 1, 2);
end;

begin
end.
Run Code Online (Sandbox Code Playgroud)

编译器在线上噱头SetLength说:

[dcc32 Error] E2029 ')' expected but ',' found
Run Code Online (Sandbox Code Playgroud)

我知道我可以像这样解决它:

procedure P(M: TArray<TArray<Integer>>);
var
  i: Integer;
begin
  SetLength(M, 1);
  for i := low(M) to high(M) do
    SetLength(M[i], 2);
end;
Run Code Online (Sandbox Code Playgroud)

但我自然希望避免不得不诉诸于此.

以下变体编译并且似乎有效:

procedure P(M: TArray<TArray<Integer>>);
type
  TArrayOfArrayOfInteger = array of array of Integer;
begin
  SetLength(TArrayOfArrayOfInteger(M), 1, 2);
end;
Run Code Online (Sandbox Code Playgroud)

我对动态数组,TArray<T>转换,引用计数等的实现细节知之甚少,以确信这是安全的.

是否有人知道这样或那样的方式是否会在运行时产生正确的代码?

delphi generics casting dynamic-arrays delphi-xe2

16
推荐指数
1
解决办法
3218
查看次数

如何将先前未知的数组作为Fortran中函数的输出

Python中:

def select(x):
    y = []
    for e in x:
        if e!=0:
            y.append(e)
    return y
Run Code Online (Sandbox Code Playgroud)

适用于:

x = [1,0,2,0,0,3]
select(x)
[1,2,3]

被翻译成Fortran:

function select(x,n) result(y)
    implicit none
    integer:: x(n),n,i,j,y(?)
    j = 0
    do i=1,n
        if (x(i)/=0) then
            j = j+1
            y(j) = x(i)
        endif
    enddo
end function
Run Code Online (Sandbox Code Playgroud)

问题出在Fortran中:

  1. 如何申报y(?)
  2. 如何声明x的预定义值
  3. 如何避免尺寸信息

对于1如果定义为y(n),则输出将为:

x = (/1,0,2,0,0,3/)
print *,select(x,6)
1,2,3,0,0,0

这是不希望的!
!-------------------------------
评论:
1-所有给出的答案在本文中都很有用.特别是MSB和eryksun的.
2-我试图调整我的问题的想法,并编译,F2Py但它没有成功.我已经使用GFortran对它们进行了调试,所有这些都是成功的.它可能是一个错误F2Py或我不知道正确使用它的东西.我将尝试在另一篇文章中介绍此问题.

更新: 可以在此处找到链接的问题.

python arrays fortran dynamic-arrays

15
推荐指数
3
解决办法
9032
查看次数

ReDim保留在Visual Basic 6中的多维数组

我正在使用VB6,我需要为多维数组做一个ReDim Preserve:

 Dim n, m As Integer
    n = 1
    m = 0
    Dim arrCity() As String
    ReDim arrCity(n, m)

    n = n + 1
    m = m + 1
    ReDim Preserve arrCity(n, m)
Run Code Online (Sandbox Code Playgroud)

每当我写它时,我都会收到以下错误:

运行时错误9:下标超出范围

因为我只能更改最后一个数组维度,所以在我的任务中我必须更改整个数组(在我的示例中为2维)!

有没有解决方法或其他解决方案?

arrays vb6 multidimensional-array dynamic-arrays

15
推荐指数
3
解决办法
13万
查看次数

我需要在Delphi中完成记录数组吗?

在我的申请中,我有以下记录:

TTransaction = record
  Alias: string
  Description: string
  Creation: TDateTime
  Count: Integer
end;
Run Code Online (Sandbox Code Playgroud)

我在这个数组中使用此记录:

Transactions = array of TTransaction;
Run Code Online (Sandbox Code Playgroud)

我在运行时保持数组加载,但在给定时间我需要清除所有数据并添加一些新数据.

仅仅使用它就足够了:

SetLength(Transactions, 0); ?
Run Code Online (Sandbox Code Playgroud)

或者我需要完成一些事情吗?

delphi record finalization dynamic-arrays delphi-6

14
推荐指数
2
解决办法
1万
查看次数

如何将一个结构数组从Rust返回到C#

我正在学习Rust,因为我试图找到一个替代C/C++的互操作C#.

怎么可能像下面的C代码一样编写Rust代码?到目前为止,这是我的Rust代码,没有选择来编组它:

pub struct PackChar { id: u32, val_str: String, }

#[no_mangle]
pub extern fn get_packs_char(size: u32) -> Vec<PackChar> {

    let mut out_vec = Vec::new();

    for i in 0 .. size {
        let int_0 = '0' as u32;
        let last_char_val = int_0 + i % (126 - int_0);
        let last_char = char::from_u32(last_char_val).unwrap();
        let buffer = format!("abcdefgHi{}", last_char);

        let pack_char = PackChar {
            id: i,
            val_str: buffer,
        };

        out_vec.push(pack_char);
    }

    out_vec
}
Run Code Online (Sandbox Code Playgroud)

上面的代码试图重现以下C代码,我能够按原样与之互操作.

void GetPacksChar(int size, PackChar** DpArrPnt)
{
    int TmpStrSize …
Run Code Online (Sandbox Code Playgroud)

c# interop marshalling dynamic-arrays rust

14
推荐指数
1
解决办法
1973
查看次数

使用int []运算符的3D数组C++

我是C/C++的新手,我一直在讨厌,但仍然不知道如何制作这样的"结构"

替代文字

它应该是一个使用指针的3D动态数组.

我这样开始,但卡在那里

  int x=5,y=4,z=3;
  int ***sec=new int **[x];
Run Code Online (Sandbox Code Playgroud)

知道如何使其成为y和z的静态大小就足够了;

拜托,我很感激你的帮助.

提前致谢.

c++ arrays pointers multidimensional-array dynamic-arrays

13
推荐指数
2
解决办法
2万
查看次数

VBA:变体数组与类型化数组与非键控数组的迭代速度

我的项目需要一堆可动态调整大小的数组用于不同的对象.数组可以包含单个类的任意数量的对象(可能是数千个),但不包含多个类的对象.

大多数情况下,我将遍历数组,因此使用键控集合并不理想.我想我有两个选择:

第一个选项是为每个对象类型开发一个'List'类,包括添加对象(和扩展数组),获取First和Last索引以及对象计数,以及通过索引检索对象的方法(后4将包括错误处理,以防数组为空).

第二个选项是使用Variant数据类型使用相同的方法开发单个"List"类.显然这是一项很少的工作,但我担心速度.使用变体比使用类型对象慢多少?请注意,我将始终在检索时将数组中的变体对象直接转换为类型变量,la:

Dim myObject As MyClass
Set myObject = variantList.Get(i)
Run Code Online (Sandbox Code Playgroud)

铸造是否提高了速度,还是vba仍然必须执行与变体相关的所有类型检查?

此外,第二个选项是否比使用非键控收集更快?我已经读过Collection迭代很慢,它们是为查找而设计的.这适用于非键控集合,还是仅适用于键值映射集合?

感谢任何可以提供建议的人.

arrays iteration collections vba dynamic-arrays

13
推荐指数
1
解决办法
5700
查看次数

用TArray <XXX>替换XXX数组是否安全

我有很多变量声明为

var
  Something: array of XXX;
begin
  SetLength(Something, 10);
  try
    ...
  finally
    SetLength(Something, 0);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

将它们替换为安全的范围:

var
  Something: TArray<XXX>;
begin
  SetLength(Something, 10);
  try
    ...
  finally
    SetLength(Something, 0);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

arrays delphi generics dynamic-arrays delphi-xe5

13
推荐指数
2
解决办法
1928
查看次数

自 C++20 以来,是否允许对分配的存储进行指针运算?

在 C++20 标准中,说数组类型是隐式生命周期类型

这是否意味着可以隐式创建非隐式生命周期类型的数组?这种数组的隐式创建不会导致数组元素的创建?

考虑这个案例:

//implicit creation of an array of std::string 
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to object" (which object?)
std::string * sptr = std::launder(static_cast<std::string*>(ptr));
//pointer arithmetic on not created array elements well defined?
new (sptr+1) std::string("second element");
Run Code Online (Sandbox Code Playgroud)

从 C++20 开始,这段代码不再是 UB 了吗?


也许这种方式更好?

//implicit creation of an array of std::string 
//but not the std::string elements:
void * ptr = operator new(sizeof …
Run Code Online (Sandbox Code Playgroud)

c++ arrays lifetime dynamic-arrays c++20

13
推荐指数
1
解决办法
339
查看次数

创建一个固定大小的std :: vector并写入元素

在C++中,我希望分配一个固定大小(但在运行时确定的大小)std :: vector然后写入此向量中的元素.这是我正在使用的代码:

int b = 30;
const std::vector<int> test(b);
int &a = test[3];
Run Code Online (Sandbox Code Playgroud)

但是,这给了我一个编译器(MSVC 2010 Pro)错误:

错误C2440:'initializing':无法从'const int'转换为'int&'.转换失去限定符.

我对const的理解是它使一个类的所有成员变量保持不变.例如,以下工作正常:

class myvec
{
public:
    myvec(int num) : ptr_m(new int[num]) {};
    ~myvec() { delete ptr_m; }
    void resize(int num) { delete ptr_m; ptr_m = new int[num]; }
    int & operator[] (int i) const { return ptr_m[i]; }
    int *ptr_m;
};

const myvec test(30);
int &a = test[3]; // This is fine, as desired
test.resize(10); // Error here, as expected
Run Code Online (Sandbox Code Playgroud)

因此,似乎std :: …

c++ arrays const stdvector dynamic-arrays

12
推荐指数
1
解决办法
1万
查看次数