今天我发现了一个编译器错误(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>转换,引用计数等的实现细节知之甚少,以确信这是安全的.
是否有人知道这样或那样的方式是否会在运行时产生正确的代码?
在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(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或我不知道正确使用它的东西.我将尝试在另一篇文章中介绍此问题.
更新: 可以在此处找到链接的问题.
我正在使用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维)!
有没有解决方法或其他解决方案?
在我的申请中,我有以下记录:
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)
或者我需要完成一些事情吗?
我正在学习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/C++的新手,我一直在讨厌,但仍然不知道如何制作这样的"结构"

它应该是一个使用指针的3D动态数组.
我这样开始,但卡在那里
int x=5,y=4,z=3;
int ***sec=new int **[x];
Run Code Online (Sandbox Code Playgroud)
知道如何使其成为y和z的静态大小就足够了;
拜托,我很感激你的帮助.
提前致谢.
我的项目需要一堆可动态调整大小的数组用于不同的对象.数组可以包含单个类的任意数量的对象(可能是数千个),但不包含多个类的对象.
大多数情况下,我将遍历数组,因此使用键控集合并不理想.我想我有两个选择:
第一个选项是为每个对象类型开发一个'List'类,包括添加对象(和扩展数组),获取First和Last索引以及对象计数,以及通过索引检索对象的方法(后4将包括错误处理,以防数组为空).
第二个选项是使用Variant数据类型使用相同的方法开发单个"List"类.显然这是一项很少的工作,但我担心速度.使用变体比使用类型对象慢多少?请注意,我将始终在检索时将数组中的变体对象直接转换为类型变量,la:
Dim myObject As MyClass
Set myObject = variantList.Get(i)
Run Code Online (Sandbox Code Playgroud)
铸造是否提高了速度,还是vba仍然必须执行与变体相关的所有类型检查?
此外,第二个选项是否比使用非键控收集更快?我已经读过Collection迭代很慢,它们是为查找而设计的.这适用于非键控集合,还是仅适用于键值映射集合?
感谢任何可以提供建议的人.
我有很多变量声明为
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) 在 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++中,我希望分配一个固定大小(但在运行时确定的大小)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 :: …
dynamic-arrays ×10
arrays ×7
c++ ×3
delphi ×3
generics ×2
c# ×1
c++20 ×1
casting ×1
collections ×1
const ×1
delphi-6 ×1
delphi-xe2 ×1
delphi-xe5 ×1
finalization ×1
fortran ×1
interop ×1
iteration ×1
lifetime ×1
marshalling ×1
pointers ×1
python ×1
record ×1
rust ×1
stdvector ×1
vb6 ×1
vba ×1