Delphi-PRAXiS
Seite 1 von 7  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamische Arrays ... kleines Problem! (https://www.delphipraxis.net/74376-dynamische-arrays-kleines-problem.html)

sonicfire 2. Aug 2006 02:21


Dynamische Arrays ... kleines Problem!
 
Servus allerseits! :)

Ich habe schlicht und einfach nur die Frage...

Ich habe folgendes:
Delphi-Quellcode:
Test: Longint;
So, nun möchte ich einen Array erstellen und dem die Größe
von "Test" geben ... :
Delphi-Quellcode:
SetLength(MeinArray, Trunc(Test));
Egal, welche Werte sich in "Test" befinden, ich habe
das Gefühl das dies so nicht geht - bekomme immer exceptions. :(

Kann mir jemand einen Tipp geben?

(PS: Test MUSS LongInt sein ... oder muss ich das konvertieren? Irgendwie? :))

gmc616 2. Aug 2006 02:43

Re: Dynamische Arrays ... kleines Problem!
 
Hmm ... meine Glaskugel sagt:
Delphi-Quellcode:
var
  Test : longint;
  MeinArray : array of word;
begin
  Test := 12345;
  setlength(MeinArray,trunc(Test));
funktioniert.

Welche Exception bekommst du denn?
Ein bischen mehr Code würde uns sicher auch weiter helfen.

Luckie 2. Aug 2006 03:04

Re: Dynamische Arrays ... kleines Problem!
 
Warum trunc? Test ist doch schon ein Integer.

himitsu 2. Aug 2006 14:20

Re: Dynamische Arrays ... kleines Problem!
 
Zitat:

Kann mir jemand sagen, warum dies so nicht funktioniert?

Delphi-Quellcode: markieren
Delphi-Quellcode:
SetLength(LoopBuffer, Trunc(Header.DataBytes));

?

"LoopBuffer" ist ein offenes Array vom Typ SmallInt, während "Header.DataBytes" vom Typ LongInt ist und mir Werte wie z.b. "248316" liefert.

Aber wieso ist das so nicht machbar?
Gibt´s Array-Grenzen im Bezug auf Größe? (Obwohl ich mir das nicht vorstellen kann)

248316*SizeOf(SmallInt) = 485 KB sollte also kein Problem darstellen

Die Grenzen für dynamische Arrays liegen bei
High(Integer) div SizeOf(FeldGröße)
und natürlich dem zur Verfügung stehenden, zusammenhängenden, virtuellen Speicher.

also bei dir
$7FFFFFFF div 2 = maximal 1.073.741.823




Und ohne weiteren Code deinerseit kann dir keiner helfen ... das mit dem TRUNC wurde schon gesagt und sonst ist hier kein Fehler zu finden.

3_of_8 2. Aug 2006 14:32

Re: Dynamische Arrays ... kleines Problem!
 
Arrays sind nullbasiert.

Das erste Element steht nicht in Index 1, sondern in index 0. Das letzte Element steht also auch nicht in length(array), sondern in length(array)-1 bzw. high(array).

Vielleicht ist das das Problem.

Der_Unwissende 2. Aug 2006 14:56

Re: Dynamische Arrays ... kleines Problem!
 
Zitat:

Zitat von 3_of_8
Arrays sind nullbasiert.

Dynamische Arrays sind nullbasiert :warn:

Gruß Der Unwissende

sonicfire 2. Aug 2006 16:53

Re: Dynamische Arrays ... kleines Problem!
 
Danke, an alle! Das Problem konnte ich mittlerweile beheben! Aber wie das so ist - prompt hat man ein neues :wink: :

Beispiel:
Delphi-Quellcode:
LoopBuffer: array of SmallInt;
SetLength(LoopBuffer, Header.DataBytes);
LoopBuffer := 0;
(...)
Delphi-Quellcode:
BlockWrite(F, LoopBuffer, Length(LoopBuffer));
..bekomme ich grundsätzlich den EInOutError #1784 ... (das der zur Verfügung gestellte Puffer für diese Operation nicht gültig ist)
:shock:

Und da Frage ich mich nun, warum??

BlockWrite benötigt für "Count" (anzahl der Records, quasi) einen Wert vom Typ Integer. So. Mein "Length(LoopBuffer)" GIBT einen Integerwert zurück! (Hab ich bereits via Bildschirmausgabe getestet).

Wo zum Henker ist also das verdammte Problem hier? :wall: :gruebel:
:(

Der_Unwissende 2. Aug 2006 16:59

Re: Dynamische Arrays ... kleines Problem!
 
Zitat:

Zitat von sonicfire
Beispiel:
Delphi-Quellcode:
LoopBuffer: array of SmallInt;
SetLength(LoopBuffer, Header.DataBytes);
LoopBuffer := 0;
(...)

Du weißt einem Array of SmallInt eine 0 zu? Was genau soll das bezwecken?

Die Größe ist soweit auch nicht der Fehler. Versuch aber mal die Adresse des ersten Elements zu verwenden statt den Zeiger auf das Array:

Delphi-Quellcode:
BlockWrite(F, @LoopBuffer[0], Length(LoopBuffer));
Nebenbei bemerkt, Count sollte imho die Anzahl von Byte angeben, die geschrieben werden und hat nichts mit Records zu tun!

Gruß Der Unwissende

sonicfire 2. Aug 2006 17:15

Re: Dynamische Arrays ... kleines Problem!
 
Danke! :)

Mit dem ":= 0" - ööhm...dachte, so.... zur Initialisierung, quasi? :oops:

Hmm habs mit dem Pointer getestet, Allerdings kann ich es nicht kompilieren, bekomme dann immer die Fehlermeldung das er noch eine Variable benötigt... :?
Nun dachte ich wenn ich direkt LoopBuffer[0] angebe, würde er quasi bei Eintrag 0 starten... aber irgendwie.... ist dann nichts mehr in meinem WAV-File :mrgreen: :gruebel:

Flocke 2. Aug 2006 17:21

Re: Dynamische Arrays ... kleines Problem!
 
Das @ muss weg, das ist ein var-Parameter.
Zitat:

Zitat von Der_Unwissende
Delphi-Quellcode:
BlockWrite(F, LoopBuffer[0], Length(LoopBuffer));



Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 Uhr.
Seite 1 von 7  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz