Autor Beitrag
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 09.04.18 20: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:
ausblenden volle Höhe Delphi-Quelltext
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



BeitragVerfasst: Mo 09.04.18 20:59 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 09.04.18 22: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



BeitragVerfasst: Mo 09.04.18 22:43 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 09.04.18 22: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



BeitragVerfasst: Mo 09.04.18 23:01 
- Nachträglich durch die Entwickler-Ecke gelöscht -


Zuletzt bearbeitet von Frühlingsrolle am Mo 09.04.18 23:13, insgesamt 1-mal bearbeitet
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 09.04.18 23:11 
nun, in diesem Fall kommt wie gesagt der Fehler
ausblenden 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



BeitragVerfasst: Mo 09.04.18 23:14 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Symbroson
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 09.04.18 23: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 708
Erhaltene Danke: 110



BeitragVerfasst: Di 10.04.18 10:46 
Mal noch eine andere Idee - wie wäre es denn mit einer Art Dummy-Zuweisung?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  btnTag := TButton(Sender).Tag;
  found := true;
  func := removeColor; // hier als Dummy-Zuweisung
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Di 10.04.18 11: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 708
Erhaltene Danke: 110



BeitragVerfasst: Di 10.04.18 16:35 
Das mit dem NIL finde ich auch besser :D , ich wollte nur noch mal darauf hinweisen, wo der Fehler entsteht.

ub60
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Di 10.04.18 16: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)