[Monkey] Warum funtzt das nicht? Unable do find Overload

Übersicht Andere Programmiersprachen Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: Warum funtzt das nicht? Unable do find Overload

BeitragSo, März 09, 2014 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,

ich verstehe meinen Fehler nicht.
Ziel ist es eine reihe von "Blöcken" darzustellen.


ich erstelle eine Klasse "TMapBlocks"
diese enthält die Methoden New und Draw

in meiner Classe "MainGame"
erstelle ich eine Liste("lBlocks") in welcher ich meine Klasse "TMapBocks" speichern möchte

Code: [AUSKLAPPEN]
Field lBlocks:List<TMapBlocks> = New List<TMapBlocks>()


dann erstelle ich eine Methode("GenerateFloor") welche mir die Blöcke erstellt und in die Liste("lBlocks") speichert.

Code: [AUSKLAPPEN]

Method GenerateFloor:int(Row:Int)
      For Local x:Int = 0 Until MapWidth
         lBlocks.AddLast(New TMapBlocks(MapOffset + x * TILE_WIDTH, Row))
      Next
      
      Return (0)
End

In On Create wird die Methode aufgerufen und ein Satz Blöcke erstellt.
In On Render möchte ich nun die Blöcke anzeigt bekommen:
Code: [AUSKLAPPEN]

For Local blocks:TMapBlocks = EachIn lBlocks
      blocks.Draw()
Next


und hier bekomme ich den Fehler Unable to find Overload.
Meine IDE Zeigt mir aber als vorschlag die .Draw() Methode an.

Warum zum geier funtzt das nicht?

~Edit~
wenn ich mir die Positionen der Einzelen Blöcke ausgeben lasse funtzt das.. nur die Methode kann ich nicht aufrufen.
Code: [AUSKLAPPEN]
 
For Local blocks:TMapBlocks = EachIn lBlocks
   Print blocks.fBlockPosition.fVec2D_PosX
Next
Rechtschreibfehler gelten der allgemeinen Belustigung!

Dottakopf

BeitragSo, März 09, 2014 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh Man das nervt !...
ich hatte in der Draw Methode Parameter mit drin und diese schlicht weg nicht mit aufgerufen.

Das er dann als Fehler sagt er findet die Methode nicht ist etwas verwirrend.


Bitte um Entschuldigung, aber ich war gerade voll am verzweifeln.
Rechtschreibfehler gelten der allgemeinen Belustigung!

DAK

BeitragSo, März 09, 2014 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Fehlermeldung ist aber schon sinnvoll.

Man kann in Monkey Funktionen/Methoden überladen. Das heißt, du kannst zwei Funktionen machen, die sich nur in ihren Parametern unterscheiden. So kannst du z.B. zwei Methoden machen:

print(String) und
print(Int)

Und wenn du dann die Funktion print mit einem String als Parameter aufrufst, dann wird die obere Funktion aufgerufen, und wenn der Parameter eine Int ist, dann wird die untere Funktion aufgerufen. Das hat den Sinn, dass du dann jeden unterschiedlichen akzeptierten Parametertyp richtig verarbeiten kannst. In Java ist z.B. die System.out.println()-Funktion, mit der Text ausgegeben werden kann rund 10 Mal überladen um jeden sinnvoll möglichen Datentypen ausgeben zu können.

Wie du jetzt Draw() aufgerufen hast hat er zwar eine Methode mit dem passenden Namen gefunden, aber diese genaue Überladungsvariante nicht, deswegen "Overload not found".
Gewinner der 6. und der 68. BlitzCodeCompo
 

PhillipK

BeitragSo, März 09, 2014 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@DottaKopf:

Freu dich, der fehler wird dir noch weitaus öfters unterkommen Razz
DAK hats ja schon erklärt, von daher nur ein tipp von meiner seite aus:

Die fehlermeldung ist nie "Unable to find Overload" sondern immer ala "Unable to find Overload for method Draw()"
Das wird dann immer das erste sein, was es zu prüfen gibt: Such die methode Draw() bzw ewaigte andere versionen.
Schlimm wirds, wenn du zb bool und int verwechselst oder float / double - ich weiß nichtmehr genau, ob intern ein parsen stattfindet. Aber ab und an erkennt man solche fehler nicht auf anhieb, selbst wenn man danach sucht Smile

Auch doof ist sowas hier:
Code: [AUSKLAPPEN]
Method Draw:int(x:int, y:int)

end method
Method Draw:Int(x:int, y:int, w:int = 32, h:int = 32)

end method


Das wird recht ärgerlich - da wird dir als fehler ausgeworfen, das nicht genau entschieden werden kann, welche methode gewählt werden soll.
Bei obigem beispiel ist es nocht recht unsinnig, aber ich hatte schon das ein oder andere mal ein problem, das ich mehrere parameter hatte, die teilweise optional und teilweise garnicht nötig waren. Das wurde dann in den funktionen ergänzt und entsprechend weitergeleitet - kann in arbeit ausarten, wenn man da fehler sucht, je nach programmierstil. (meiner -> schlecht :/ )


Ergo: Monkeyfehlermeldungen sind ziemlich sinnig, aber man muss sich erstmal drauf einlassen ^^

DAK

BeitragSo, März 09, 2014 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@PhillipKs Beispiel:

Die meisten Sprachen, die Funktionsüberladungen zulassen erlauben keine optionalen Parameter und umgekehrt, und das macht auch Sinn so. Es ist da generell ganz praktisch, wenn man sich auf eine Variante festlegt, und entweder überlädt oder optionale Parameter verwendet, nicht aber beides.

In Java z.B. gibt es Überladung aber keine optionalen Parameter. Wie man das dann dort machen würde wäre Folgendes:

Code: [AUSKLAPPEN]

public void draw(int x, int y) {
     draw(x,y,32,32); //32 = default X/Y
}
public void draw(int x, int y, int w, int h) {
     //
}


So kann man dann die optionalen Parameter nachbasteln.
Ich nehme an, dass Monkey die optionalen Parameter sowieso so nachbastelt, da z.B. Java ja keine optionalen Parameter kann, also keine Angst zwecks der Performance.
Gewinner der 6. und der 68. BlitzCodeCompo

Dottakopf

BeitragSo, März 09, 2014 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
hm.. Funktionen überladen klingt aber irgendwie dirty.
Welchen tollen Vorteil hat man davon soetwas zu tun ?
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

PhillipK

BeitragSo, März 09, 2014 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@DAK:
Monkey erlaubt es, leider.
Das führt leicht zu fehlern^^

@DottaKopf:
Das ist alles andere als dirty, das ist ziemlich mächtig.

Beispiel:

Code: [AUSKLAPPEN]
Method MovePosition:Void(x:float, y:float)
    self.x = self.x+x
    Self.y = self.y+y
end method

Method MovePosition:Void(vec:Vector2)
    self.x = self.x + vec.x
    self.y = self.y + vec.y
End method


Ist nur ein "alltagsbeispiel" aber dennoch extrem nützlich. So vermeidest, du das zb jedesmal nen vektor erstellen musst Smile

Dottakopf

BeitragMo, März 10, 2014 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hach ja.. ich bin absoluter neuling im OOP..
das rockt im moment total meinen schädel Smile

danke für die ausführlichen Beispiele !!
Rechtschreibfehler gelten der allgemeinen Belustigung!

DAK

BeitragMo, März 10, 2014 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das einzige Unsaubere hier ist wenn man optionale Parameter und überladen mixt. Mach dir das Leben einfach und verwende bei einer Funktion nur das eine oder das andere, nicht aber beides.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group