| Autor |
Beitrag |
nuschii
      
Beiträge: 16
|
Verfasst: Fr 05.03.04 21:08
Hi!
Seit ich etwas PHP kann, geh ich anscheinend auch in Delphi mit Arrays recht schlampig um :oops: :
Ich bräuchte, wenn ich nicht meinen kompletten Quelltext übern Haufen schmeißen will, eine Bedingung, die nur dann true ist, wenn ein Bestimmter Wert in einem Array enthalten ist, also z. B. wenn eine 5 in einem Array of Integer vorkommt. Ne Funktion dafür proggen is leider nicht, da das fragliche Array nur lokal in einer Prozedur deklariert ist.
Irgendeine Möglichkeit, so etwas ohne eine globale Deklaration des Arrays zu bewerkstelligen?
Grüße
Nuschii
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: Fr 05.03.04 21:19
Doch, du kannst ne Funktion schreiben ....
| Zitat: | | Irgendeine Möglichkeit, so etwas ohne eine globale Deklaration des Arrays zu bewerkstelligen? |
Naja schreibe sowas wie ne Testfunktion welcher du das Array übergibst...
etwas so (grob)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function scanarray(testarray:array of integer; testwert:integer) : boolean; var x : integer; begin Result := false; for x := low(testarray) to high(testarray) do begin if testarray[x] = testwert then Result := true; exit; end;
end; |
Von überall aus im Code kannst du dann Arrays testen....
z.b.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure demo; var zahlenarray : array of integer; x : integer; begin setlength(zahlenarray,5); for x := low(zahlenarray) to high(zahlenarray) do zahlenarray[x] := x; if scanarray(zahlenarray,3) = true then showmessage('Jepp, die 3 is drin....') else showmessage('Sorry. Nicht gefunden....'); end; |
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
nuschii 
      
Beiträge: 16
|
Verfasst: Sa 06.03.04 13:28
Hallo!
Ich dachte auch zuerst, mit einer boolean-function müsste sich das in den Griff kriegen lassen. Doch dann las ich hier im Forum, dass die Übergabe von Arrays an Funktionen oder Prozeduren recht problematisch ist, weswegen ich von diesem Weg abgelassen habe.
Dennoch habe ich deine Codezeilen mal in meinen Quellcode eingefügt. (Ich habe entsprechend meinen Anforderungen einen testarray: Array of byte und einen testwert: byte anstelle von Integer deklariert, aber das dürfte ja nichts ausmachen).
Und das Ergebnis war:
Access violation at address 00404240 in module 'ZAUN.EXE'. Read of address 060105F9.
Immer an der Stelle im Code, bei dem auf die neue Funktion zugegriffen wird. Ich habe gelesen, dass das daran liegt, das der Compiler zwei verschiedene Arrays, obwohl beide den selben Datentyp enthalten, grundsätzlich als verschiedene Datentypen ansieht. Der Ausweg wäre eine globale Deklaration der Arrays in einer Codezeile:
A1, A2: Array of byte;
Damit wären A1 und A2 kompatibel. Eine globale Deklaration möchte ich aber wenn möglich umgehen.
Grüße
Nuschii
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: Sa 06.03.04 14:01
| Zitat: | | Ich dachte auch zuerst, mit einer boolean-function müsste sich das in den Griff kriegen lassen. Doch dann las ich hier im Forum, dass die Übergabe von Arrays an Funktionen oder Prozeduren recht problematisch ist, weswegen ich von diesem Weg abgelassen habe. |
Hmm mir fällt aber jetzt ernsthaft kein Grund ein warum ...
| Zitat: | Und das Ergebnis war:
Access violation at address 00404240 in module 'ZAUN.EXE'. Read of address 060105F9. |
Zeig mal deinen Quellcode an der Stelle......
ich habe auchmal soetwas benötigt. Bei meinem Verschlüsslungsprogramm.. Da funktioniert es einwandfrei...
Schau dir mal die Funktion getbyte(TBitarray); an (TBitarray ist auch nur ein array of boolean...):
Ist mit Umkehrfunktion dort beschrieben....
www.delphi-forum.de/viewtopic.php?t=21838
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 06.03.04 14:15
| nuschii hat folgendes geschrieben: |
Ich dachte auch zuerst, mit einer boolean-function müsste sich das in den Griff kriegen lassen. Doch dann las ich hier im Forum, dass die Übergabe von Arrays an Funktionen oder Prozeduren recht problematisch ist, weswegen ich von diesem Weg abgelassen habe.
|
Was ist denn daran problematisch?
Wenn du dein Array nicht verändern musst, dann übergib es als const. Das ist schnell und du kannst trotzdem High und Low verwenden.
|
|
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 06.03.04 14:21
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function scanarray(const testarray:array of integer; testwert:integer) : boolean; var x : integer; begin for x := low(testarray) to high(testarray) do if testarray[x] = testwert then begin Result := true; exit; end; Result := False; end; |
So... hab noch einen kleinen Fehler nebenbei behoben. Er darf natürlich erst exit sagen, wenn auch etwas gefunden wurde.
Zuletzt bearbeitet von Brainiac am Sa 06.03.04 14:28, insgesamt 1-mal bearbeitet
|
|
nuschii 
      
Beiträge: 16
|
Verfasst: Sa 06.03.04 14:26
Hallo mal wieder!
Ähm, mir is grad was in den Sinn gekommen: Ist ein Array of byte, was ich verwenden will, denn nicht das selbe wie ein string?
Damit hat sich mein Problem wohl in Luft aufgelöst, denn mit pos lässt sich ja ein String (d. h. ein Array of byte) einfach nach einem bestimmten Zeichen durchsuchen. Das macht die Sache doch gleich viel einfacher.
Sieht so aus, als würde es mit einem string recht simpel funktionieren. Trotzdem Danke @catweasel!
Das mit dem Problem der Übergabe von Arrays hab ich unter anderem am Beispiel in der Delphi-Hilfe unter "Array types and assignments" (Delphi 6 Personal) als problematisch aufgefasst. Da steht:
| Zitat: |
Arrays are assignment-compatible only if they are of the same type. Because Pascal uses name-equivalence for types, the following code will not compile.
var
Int1: array[1..10] of Integer;
Int2: array[1..10] of Integer;
...
Int1 := Int2;
To make the assignment work, declare the variables as
var Int1, Int2: array[1..10] of Integer;
or
type IntArray = array[1..10] of Integer;
var
Int1: IntArray;
Int2: IntArray;
|
Grüße
Nuschii
|
|
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 06.03.04 14:30
Ähhh... ja aber das hat doch mit unserem Problem jetzt rein gar nichts zu tun.
Da geht es doch ums Zuweisen von Arrays und nicht ums Übergeben an Prozeduren.
Das mit dem String geht prinzipiell schon, aber nicht einfach mit einem Array of byte.
Wahrscheinlich müsstest du es zu einem PChar casten und selbst dann würde das Durchsuchen abgebrochen, sobald ein Byte gleich 0 wäre, da das bei einem String das Ende es Strings markiert.
|
|
nuschii 
      
Beiträge: 16
|
Verfasst: So 07.03.04 00:52
N'abend.
Nun gut, um diesem Thread ein Ende zu setzen:
Es ging anfangs um ein spezifisches, persönliches Problem, auf das ich beim proggen gestoßen bin. Inzwischen hat sich (für mich) herausgestellt, dass ich einfach mal wieder auf dem Schlauch stand. Hab jetzt die ganze Sache mit Strings und den Methoden pos, copy und insert realisiert und es funktioniert einwandfrei :D . Hab also vorerst keine weiteren Fragen.
@Brainiac: Deine zwei ersteren Beiträge hast du gepostet, während ich meinen letzten gerade verfasste, dieser geht also nicht auf deine Posts ein. Ich dachte nur, dass das beim Übergeben einer Variable (bzw. eines Arrays) an eine Prozedur diese zwangsweise zunächst in die Prozedur-interne Variable kopiert werden muss. Und aus dem angefügten Zitat aus der Delphi-Hilfe schloss ich, dass dies bei Arrays zu Kompatibilitätsproblemen führen könnte.
see ya
Nuschii
|
|
|