小编sta*_*nic的帖子

writeln的明显副作用(":width"说明符导致输出中出现问号)

我有以下代码(RAD Studio XE2,Windows 7 x64):

program letters;

{$APPTYPE CONSOLE}

{$DEFINE BOO}

const
  ENGLISH_ALPHABET = 'abcdefghijklmnopqrstuvwxyz';

begin
{$IFDEF BOO}
  writeln;
{$ENDIF}
  write(ENGLISH_ALPHABET[1]:3);

  readln;
end.
Run Code Online (Sandbox Code Playgroud)

{$DEFINE BOO}指令关闭,我有以下(预期)输出(为了便于阅读,空格被替换为点):

..a
Run Code Online (Sandbox Code Playgroud)

当指令打开,我有以下(意外)输出:

// empty line here
?..a
Run Code Online (Sandbox Code Playgroud)

而不是预期的

// empty line here
..a
Run Code Online (Sandbox Code Playgroud)

当我改为const ENGLISH_ALPHABETconst ENGLISH_ALPHABET: AnsiString,预期的输出打印没有问题字符.当:3格式化被删除或改变:1,没有问号.当输出重定向到文件时(通过AssignFile(Output, 'boo.log')命令行或从命令行),再没有问号.

这种行为的正确解释是什么?

delphi io side-effects console-application delphi-xe2

7
推荐指数
1
解决办法
276
查看次数

TFlowPanel中的AutoSize和AutoWrap冲突

我试图以下列方式使用TFlowPanel组件:

  1. 放在主窗体Form1组件上FlowPanel1: TFlowPanel.
  2. 设置Form1.Width = 400,FlowPanel1.Align = alTop,FlowPanel1.AutoSize = True,FlowPanel1.AutoWrap = True.
  3. 放在FlowPanel15个SpeedButtons上并将它们设置Width为64.
  4. 编译并运行.
  5. 减少表格的宽度(某事Form1.Width = 200).

出于某种原因,当用户调整表单大小时,速度按钮不会自动排成两行.虽然,当它们排成两行时AutoSize = False,AutoWrap = True.
这种行为的原因是什么以及如何解决?

编辑:我发现了"快速而肮脏"的解决方案.以下代码是事件的事件处理程序TFlowPanel.OnResize:

procedure TForm1.FlowPanel1Resize(Sender: TObject);
begin
  with FlowPanel1 do
  begin
    AutoSize := False;
    Realign;            // line up controls
    AutoSize := True;   // adjust TFlowPanel.Height
  end;
end;
Run Code Online (Sandbox Code Playgroud)

但是,我仍然想知道是否有一种解决问题的标准方法.

delphi vcl autosize delphi-xe2

5
推荐指数
1
解决办法
2492
查看次数

生成1,000,000个随机排列的样本

我正在处理大量的整数排列.每个排列中的元素数量为K.元素大小为1个字节.我需要生成N个唯一的随机排列.
约束:K <= 144,N <= 1,000,000.

我想出了以下简单的算法:

  1. 生成N个随机排列的列表.将所有排列存储在RAM中.
  2. 对列表进行排序并删除所有重复项(如果有).重复数量相对较少.
  3. 如果有任何重复项,请将随机排列添加到列表中,直到有N个排列并返回到步骤2.

有一个更好的方法吗?特别是,有没有办法不将所有排列存储在RAM中(在生成时将它们写在磁盘上)?

编辑:最后,需要按顺序访问生成的排列(逐个访问,不需要随机访问).RAM是更关键的因素(我宁愿不在RAM中同时存储所有排列).

language-agnostic algorithm permutation combinatorics random-sample

3
推荐指数
2
解决办法
1400
查看次数