请考虑以下示例:
int size = 10, *kk = new int[size];
for (int i = 0; i < size; i++) {
kk[i] = i;
}
delete [] kk;
Run Code Online (Sandbox Code Playgroud)
如何为整个阵列添加手表?我可以逐个添加一个手表(kk [0],kk [1] ...),但是因为我知道数组的长度是否有办法自动完成?我的意思是像kk [0..size-1]左右.
我正在使用NetBeans IDE和cygwin g ++和gdb.
我正在通过 VBA 向工作表添加一个公式,它应该是:
=UNIQUE(IF(TableA[ColumnA]=A1,TableA[ColumnB],""))
Run Code Online (Sandbox Code Playgroud)
这利用 Excel 中的新 SPILL 功能为我提供 B 列值列表,其中 A 列中的相关值与单元格 A 中的值相匹配。我还应用 UNIQUE 函数来删除任何多个空白 ("") 结果。
如果我手动将公式输入到 Excel 中,这非常有效,但是在使用 VBA 添加公式时,Excel 在公式中添加了 @ 符号,并导致它显示 #VALUE!。
用于添加公式的 VBA 行是:
=Cells(x,y).Formula = "=UNIQUE(IF(TableA[ColumnA]=A1,TableA[ColumnB],""""))"
Run Code Online (Sandbox Code Playgroud)
Excel 中的结果输出为:
=@UNIQUE(IF(TableA[@[ColumnA]]=A1,TableA[ColumnB],""))
Run Code Online (Sandbox Code Playgroud)
发生了什么,我错过了什么?
提前致谢!
如果是这样,为什么?为什么不使用值类型的复制构造函数?
我收到以下错误:
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/vector.tcc: In member functio
n `ClassWithoutAss& ClassWithoutAss::operator=(const ClassWithoutAss&)':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/vector.tcc:238: instantiate
d from `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterato
r<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp =
ClassWithoutAss, _Alloc = std::allocator<ClassWithoutAss>]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_vector.h:564: instantia
ted from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Class
WithoutAss, _Alloc = std::allocator<ClassWithoutAss>]'
main.cpp:13: instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/vector.tcc:238: error: non-st
atic const member `const int ClassWithoutAss::mem', can't use default assignment
operator
Run Code Online (Sandbox Code Playgroud)
在以下代码上运行g ++ main.cpp:
/*
* ClassWithoutAss.h
*
*/
#ifndef CLASSWITHOUTASS_H_
#define CLASSWITHOUTASS_H_
class ClassWithoutAss
{ …Run Code Online (Sandbox Code Playgroud) 我在看Delphi:Char和TCharArray数组"不兼容的类型"并开始尝试.我发现的很有趣.
procedure Clear(AArray: array of Integer);
var
I: Integer;
begin
for I := Low(AArray) to High(AArray) do
AArray[I] := 0;
end;
var
MyArray: array of Integer;
begin
Clear(MyArray);
end.
Run Code Online (Sandbox Code Playgroud)
这个简单的小例子展示了如何使用Open Array参数将动态数组传递给过程.它编译和运行完全符合预期.
procedure Clear(AArray: array of Char);
var
I: Integer;
begin
for I := Low(AArray) to High(AArray) do
AArray[I] := #0;
end;
var
MyArray: array of Char;
begin
Clear(MyArray);
end.
Run Code Online (Sandbox Code Playgroud)
这是几乎完全相同的代码唯一的区别是它使用的是数组Char而不是Integer.它不编译.相反,编译器吐出:
E2010 Incompatible types: 'Array' and 'Dynamic array'
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
在搜索了一段时间后,我发现了这个 QC报告.我正在运行Delphi 2009,它仍然在发生.
在我正在阅读的书中(Herbert Schildt的C++ Complete Reference),它表示没有使用分配的数组new可以有一个初始化器.
我不能使用new?初始化动态分配的数组?如果不是什么原因呢?
我想用N(不知道N)元素动态创建一个数组.
像功能一样的东西
public function create_array($num_elements){
.....
}
Run Code Online (Sandbox Code Playgroud)
那回报我的东西
//call the function....
create_array(3);
//and the output is:
array{
0 => null
1 => null
2 => null
}
Run Code Online (Sandbox Code Playgroud)
我已经考虑过array_fill了一个简单的foreach循环.
还有其他解决方案吗?
我正在比较这两种初始化动态数组的方式之间的性能:
Arr := TArray<integer>.Create(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
和
SetLength(Arr, 5);
Arr[0] := 1;
Arr[1] := 2;
Arr[2] := 3;
Arr[3] := 4;
Arr[4] := 5;
Run Code Online (Sandbox Code Playgroud)
我准备了一个测试,我注意到使用数组"构造函数"需要两倍于另一个方法所需的时间.
测试:
uses
DateUtils;
function CreateUsingSetLength() : TArray<integer>;
begin
SetLength(Result, 5);
Result[0] := 1;
Result[1] := 2;
Result[2] := 3;
Result[3] := 4;
Result[4] := 5;
end;
Run Code Online (Sandbox Code Playgroud)
...
const
C_COUNT = 10000000;
var
Start : TDateTime;
i : integer;
Arr : TArray<integer>;
MS1 : integer;
MS2 : integer;
begin
Start := Now;
i := …Run Code Online (Sandbox Code Playgroud) 我有一个将动态数组TData = TArray<Byte>作为参数的过程.
procedure DoStuff(const Input: TData);
begin
// do nothing
end;
Run Code Online (Sandbox Code Playgroud)
还有一个返回动态数组的函数.
function SomeData: TData;
begin
Result := [1, 2];
end;
Run Code Online (Sandbox Code Playgroud)
当我使用下面示例中的过程时,DoStuff获取以下数据(1,2,3,1,3),但在DoStuff完成后我得到一个EInvalidPointer异常.
procedure TForm1.Button1Click(Sender: TObject);
begin
DoStuff([1, 2, 3] + SomeData);
end;
Run Code Online (Sandbox Code Playgroud)
调用DoStuff([1, 2] + SomeData);不会导致错误,当数组大于4项时,它似乎变得敏感.如果我使用临时变量来保存数组,DoStuff仍会得到(1,2,3,1,2),但没有错误.
procedure TForm1.Button2Click(Sender: TObject);
var
Temp: TData;
begin
Temp := [1, 2, 3] + SomeData;
DoStuff(Temp);
end;
Run Code Online (Sandbox Code Playgroud)
看起来像指针异常与其中一个动态数组超出范围时的释放有关.
我不应该以这种方式使用动态数组吗?工作时,这非常干净地解决了我当前的问题.
我也试过使用array of Byte;而不是TArray<Byte>;但有相同的结果.
完整的测试单位:
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, …Run Code Online (Sandbox Code Playgroud) 我的程序正在运行,虽然3D阵列,标签"群",它发现,然后做一些检查,看看是否有临近簇具有比目前更高的集群的标签.还有第二个数组保存了"正确的"群集标签.如果它发现正确标记了第n个相邻簇,则将该元素分配给0,否则将其分配给正确的标签(例如,如果第n个站点具有标签2,并且邻居标记为3,则第3个元素为labelArray设置为2).老实说,我有充分的理由这样做!
我想要的只是能够分配动态的第n个元素labelArray.我已经看过可分配的数组并将事物声明为,labelArray(*)但我并不是真的理解这些,尽管在网上搜索和StackOverflow.
因此,任何帮助这样做都会很棒.
dynamic-arrays ×10
arrays ×4
c++ ×3
delphi ×3
delphi-xe7 ×1
excel ×1
file-io ×1
fortran ×1
fortran90 ×1
g++ ×1
gdb ×1
large-data ×1
matlab ×1
performance ×1
php ×1
std ×1
stdvector ×1
vba ×1