Autor |
Beitrag |
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 09.04.18 21:43
Hallo EE,
Ich habe mir eine Prozedurvariable angelegt, die abhängig von einer anderen Variable eine andere Funktion enthält. Allerdings bekomme ich immer eine Warnung '[Warnung] Drawing.pas(653): Variable 'func' ist möglicherweise nicht initialisiert worden'
ich habe es im Code schon mit nem case .. else abgefangen - hilft aber nichts, und sowie assigned als auch = nil sind nicht kompatibel mit einer Prozedur da Delphi's Entwickler sich aus irgendeinem Grund gedacht haben Prozedur auch ohne Klammern aufzurufen.
Also - gibt es eine andere Variante diese Warnung nicht mehr auftauchen zu lassen?
Mir fiele ja spontan noch exit; ein - aber das soll ja angeblich in manchen Fällen Probleme bereiten.
Und goto label gefällt den Herren ja auch nicht...
Hier der Codeausschnitt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| type TProcManipColor = procedure(btnTag, x, y: integer; var color: RGBTriple);
procedure TForm1.ManipulateImage(Sender: TObject); var x, y, btnTag: integer; pxl: PRGBTriple; func: TProcManipColor; found: boolean; begin if chkAutoReset.Checked then btnResetClick(Sender);
btnTag := TButton(Sender).Tag; found := true; case btnTag of 1: func := removeColor; 2: func := removeColor; 3: func := removeColor; 4: func := invertColors; 5: func := grayColors; 6: func := grayColorsExt; else found := false; end;
if found then begin for y := 0 to bmp.Height - 1 do begin pxl := bmp.ScanLine[y]; for x := 0 to bmp.Width - 1 do begin func(btnTag, x, y, pxl^); inc(pxl); end; end;
Draw; end; end; |
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 09.04.18 21:59
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 09.04.18 23:04
Zitat: | den Abschnitt ab: if found then ... in der case-Anweisung ausführen lassen |
wie meinst du das? Soll ich in jeder case-Bedingung den Code hinkopieren (oder eben die private prozedur ausführen)?
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 09.04.18 23:43
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 09.04.18 23:48
Das else wird doch nur aufgerufen, wenn keiner der Cases mit der Case-Variable übereinstimmt. Das kann doch garnicht funktionieren, tut es auch nicht.
Die Schleifen sollen ja gerade dann ausgeführt werden, wenn func definiert wurde.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 10.04.18 00:01
- Nachträglich durch die Entwickler-Ecke gelöscht -
Zuletzt bearbeitet von Frühlingsrolle am Di 10.04.18 00:13, insgesamt 1-mal bearbeitet
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Di 10.04.18 00:11
nun, in diesem Fall kommt wie gesagt der Fehler
Quelltext 1:
| [Fehler] Drawing.pas(648): Nicht genügend wirkliche Parameter |
weil der Delphi-compiler einen Prozeduraufruf erweartet
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 10.04.18 00:14
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: Symbroson
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Di 10.04.18 00:18
@func <> nil hat funktioniert. vielen Dank ^^
assigned hatte ich auch schon gesagt, dass das nicht funktioniert (gleiches Problem)
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
ub60
Beiträge: 762
Erhaltene Danke: 127
|
Verfasst: Di 10.04.18 11:46
Mal noch eine andere Idee - wie wäre es denn mit einer Art Dummy-Zuweisung?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| btnTag := TButton(Sender).Tag; found := true; func := removeColor; case btnTag of 1: func := removeColor; 2: func := removeColor; 3: func := removeColor; 4: func := invertColors; 5: func := grayColors; 6: func := grayColorsExt; else found := false; end; |
Der Fehler taucht doch auf, weil im else-Zweig func mit keinem Wert belegt wird.
ub60
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Di 10.04.18 12:07
Naja, wenn ich aus irgendeinem Grund vergessen habe den btn Tag anzupassen hätte das zur Folge, dass die Dummyfunktion ausgeführt wird anstatt eines Fehlers.
Das mit nil finde ich schon optimal - nur wegen dem Vergleich hatte ich Probleme.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
ub60
Beiträge: 762
Erhaltene Danke: 127
|
Verfasst: Di 10.04.18 17:35
Das mit dem NIL finde ich auch besser , ich wollte nur noch mal darauf hinweisen, wo der Fehler entsteht.
ub60
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Di 10.04.18 17:37
Ich wusste ja, was das Problem war, nur bin ich nicht darauf gekommen den Referenz-Operator @ zu verwenden.
Danke trotzdem
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|