![]() |
Übergebenes Array: low() immer 0?
Nur mal ne schnelle Frage: wenn ich einer Prozedur/Funktion ein Array übergebe, ergibt low immer 0?
Zur Verdeutlichung mal ein kurzes Beispiel:
Delphi-Quellcode:
Der Proezdur übergebe ich ein array[1..13]of Byte. low spuckt mir aber 0 statt 1 raus. Wenn das immer so ist (auch wenn das Array mal mit 2, 12 oder weiss der Geier was anfängt) ist alles i.O. Ansonsten muss ich mir noch was anderes überlegen, damit jedes 2. Array-Elemente mit 3 multipliziert wird.
procedure getChecksumme(var bc : array of Byte);
var i,cs : Byte; begin cs := 0; for i := low(bc) to high(bc)-1 do begin if (i mod 2 = 0) then cs := cs + bc[i] else cs := cs + bc[i]*3; end; if (cs mod 10 = 0) then cs := 0 else cs := 10 - (cs mod 10); bc[high(bc)] := cs; end; Schönen Dank im Voraus, Thomas P.S.: Bevor wer fragt, ja es geht um die Prüfsumme des EAN13 :wink: |
Re: Übergebenes Array: low() immer 0?
Hi,
Arrays werden meines Wissens immer nullrelativ übergeben. Delphi-Hilfe "Offene Array-Parameter" als Bestätingung. Grüße Frank |
Re: Übergebenes Array: low() immer 0?
Danke, genau so was in der Richtung wollte ich hören! Das passt mir jetzt super in den Kram *freu*
|
Re: Übergebenes Array: low() immer 0?
:oops: Ihr habt recht. :oops:
|
Re: Übergebenes Array: low() immer 0?
Zitat:
|
Re: Übergebenes Array: low() immer 0?
Das mit dem Gegenbeispiel war mir schon klar, das da bei low 1 und bei high 63 rauskommen muss. Aber da wurde es ja auch nicht an eine Methode übergeben.
Ne, das var in meinen Beispiel ist schon OK, ich will ja die letzte Zelle des Arrays ändern. Und ein const kann man soweit ich weis nicht ändern. |
Re: Übergebenes Array: low() immer 0?
Gegenfrage: "Was interessiert dich das ?" Du solltest immer mit Low(), High() arbeiten, statt mit konstant 0.
Es gibt arrays di nicht mit Low() == 0 anfangen, zb.
Delphi-Quellcode:
Low(), High() arbeiten aber auch ganz speziell mit solchen Spezial-Arrays die andere ordinale Indizees zulassen.
type
TMyArray = array[123...345] of Type; TMyArray = array[-123..+123] of Type; TMyArray = array[Boolean] of Type; TMyArray = array[red..green] of Type; Gruß Hagen |
Re: Übergebenes Array: low() immer 0?
Ich arbeite schon immer mit low und high, wenn ich nicht innerhalb einer Prozedur ein festes Array habe.
Aber bei meinem Beispiel geht es um das "i mod 2". Jedes zweite Element muss mit drei multipliziert werden. Nicht jedes Element mit einem durch zwei teilbaren Index. Da ist der Wert von low schon von Bedeutung. Wenn low null oder gerade ist muss es
Delphi-Quellcode:
heissen.
if (i mod 2 = 0)
then cs := cs + bc[i] else cs := cs + bc[i]*3; Ansonsten wäre
Delphi-Quellcode:
richtig.
if (i mod 2 = 0)
then cs := cs + bc[i]*3 else cs := cs + bc[i]; Deswegen brauch ich halt einen Wert für low auf den ich mich verlassen kann. |
Re: Übergebenes Array: low() immer 0?
Zitat:
Delphi-Quellcode:
Odd ist übrigens besser als der Versuch mit mod die Performance zu optimieren...
if not Odd(i - Low(bc)) then
|
Re: Übergebenes Array: low() immer 0?
Delphi-Quellcode:
Gruß hagenvar C: array[0..1] of Integer; I,J: Integer; begin C[0] := 0; C[1] := 0; J := 0; for I := Low(Array) to High(Array) do begin Inc(C[J], Array[I]); J := (J + 1) and 1; end; Result := C[0] + C[1] * 3; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz