2014-05-19 3 views
3

저는 델파이 XE5를 사용하여 작은 델파이 프로그램을 만들고 있습니다. 내 코드에는 동적 부울 배열이 있으며 일부 배열 요소의 값을 변경할 수 없습니다. 길이를 설정 한 후에 배열을 초기화하려고했지만 도움이되지 않았습니다. 다음은 코드의 일부입니다.델파이에서 부울 배열의 값을 변경하는 방법

procedure DoSomething(names: array of string); 
var startWithA: array of Boolean; 
    i: integer; 
begin 
    SetLength(startWithA, Length(names)); // each element is false by default 
    for i := 0 to Length(names) - 1 do begin 
     if (names[i].indexOf('A') = 0) then begin 
      startWithA[i] := true; // the value is not changed after executing this line 
     end; 
    end; 
end; 

답변

4

코드가 정상적으로 작동합니다.

 
False 
True 
True 
False 

은 아마 당신의 혼란은 당신이 값을 읽어 본 적이되는 지역 변수이며 배열에 할당한다는 사실에서 유래

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils; 

function StartsWithAIndices(const Names: array of string): TArray<Boolean>; 
var 
    i: Integer; 
begin 
    SetLength(Result, Length(Names)); 
    for i := 0 to high(Result) do begin 
    if (Names[i].IndexOf('A') = 0) then begin 
     Result[i] := true; 
    end; 
    end; 
end; 

var 
    Indices: TArray<Boolean>; 
    b: Boolean; 

begin 
    Indices := StartsWithAIndices(['Bob', 'Aaron', 'Aardvark', 'Jim']); 
    for b in Indices do begin 
    Writeln(BoolToStr(b, True)); 
    end; 
    Readln; 
end. 

출력 : 여기 증거입니다. 배열 값을 읽지 않으면 배열 값이 수정되지 않는다고 어떻게 말할 수 있습니까? 또는 최적화가 활성화되어 있고 컴파일러가 값을 쓰지만 읽지 않은 로컬 변수를 최적화하기로 결정했습니다. 옆으로, 함수는 다음과 같이 더 간단하게 작성할 수 있습니다으로

:

function StartsWithAIndices(const Names: array of string): TArray<Boolean>; 
var 
    i: Integer; 
begin 
    SetLength(Result, Length(Names)); 
    for i := 0 to high(Result) do begin 
    Result[i] := Names[i].StartsWith('A'); 
    end; 
end; 
+0

좋은 마지막 함수 : –

관련 문제