Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Unbekannter Variabeltyp

  1. #11
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Nein ... habe ich nicht - ganz im Gegenteil.
    In der Siemens-Welt geht es halt nur nicht und in (zumindestens deiner) Codesys-Welt anscheinend auch nicht.
    Den Vorschlag von ST habe ich so aufgenommen, dass er einen Baustein macht mit mehreren unterschiedlichen Input-Variablen von denen die jeweils beschaltete weiterverwendet wird - das ist nur eine Pseudo-Überladung (leider).

    Gruß
    Larry
    Ja, so war es gemeint. Schön ist das natürlich nicht, da möchte man sich eher übergeben statt überladen. Ich tendiere bei solchen Sachen doch eher zu einzelnen Funktionen für jeden Datentyp. In CoDeSys 3 wird es auch nicht gehen. Man kann zwar vererbte Methoden ersetzen, ihnen aber keine anderen Input-Variablen verpassen. Immerhin soll es möglich werden, ANY_TYPE- und ANY_NUM-Variablen als Input-Parameter an Funktionen zu übergeben, in der Version 3.4 ist das aber auch noch nicht umgesetzt.

  2. #12
    Avatar von Schnick und Schnack
    Schnick und Schnack ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    08.08.2007
    Ort
    Süd-Süd-Deutschland (CH)
    Beiträge
    220
    Danke
    29
    Erhielt 27 Danke für 21 Beiträge

    Standard


    Ich tendiere bei solchen Sachen doch eher zu einzelnen Funktionen für jeden Datentyp.
    Vom Aufwand her meine ich plausibel. Man müsste, sofern man es mit nur einem Baustein machen möchte
    ja eh auch für alle Datentypen den Vergleich schreiben.

    Man kann zwar vererbte Methoden ersetzen, ihnen aber keine anderen Input-Variablen verpassen.
    Klingt für mich irgendwie nach einer halbfertigen Lösung und ist ja eigentlich auch nur eine Pseudo-Überladung (frei nach Larry )
    Ok man kann die Funktion alität anpassen, aber eigentlich kenne ich zwischen 0 und 0 Anwendungen bei denen ich Überladungen mit gleicher Schnittstelle gemacht habe.
    Ja gut vielleicht die Sonderfälle aus (VB).Net wie New, BeginInit usw.....
    Aber nicht bei eigenen Funktionen/Prozeduren.


    Immerhin soll es möglich werden, ANY_TYPE- und ANY_NUM-Variablen als Input-Parameter an Funktionen zu übergeben, in der Version 3.4 ist das aber auch noch nicht umgesetzt.
    Jep. Mit Betonung auf....
    "Hätte ich das gewusst, hätte ich einen anderen Beruf gelernt." - "Hast Du gelernt diese Scheisse?"
    (Zitat aus Knockin' on Heaven's Door)

    "Kommentare? Wieso? Steht doch alles im Code..!"

    Avatar erstellt auf www.sp-studio.de

  3. #13
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard

    Also zunächst mal: die Norm kennt zwar diese ANY-Datentypen, diese sind aber nicht zum Programmieren gedacht.
    Die werden für die Zwecke der Norm benutzt. Die Norm kennt prinzipiell nur bei den Standardoperatoren "Überladungen" und das wird selbst
    mit der nächsten Version noch so bleiben.
    Der Grund ist relativ einfach: es ist sauschwer, ordentliche Regeln zu formulieren, wie Überladung funktionieren soll.
    Was für eine Überladung soll aufgerufen werden für fun(1)? BOOL, WORD, INT, DINT? für fun(-1)? für fun(0)?
    Das ist ziemlich fehlerträchtig. Wenn man aber fordert fun(BOOL#1) zu schreiben, was ist dann gewonnen gegenüber
    fun_BOOL(1)?
    Also ich bin dafür immer ordentlich hinzuschreiben, welche Funktion man vorhat aufzurufen, das hält einem viel Ärger vom Leib.

    Bernhard

  4. #14
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zitat Zitat von Werner29 Beitrag anzeigen
    Also zunächst mal: die Norm kennt zwar diese ANY-Datentypen, diese sind aber nicht zum Programmieren gedacht.
    Die werden für die Zwecke der Norm benutzt. Die Norm kennt prinzipiell nur bei den Standardoperatoren "Überladungen" und das wird selbst
    mit der nächsten Version noch so bleiben.
    Der Grund ist relativ einfach: es ist sauschwer, ordentliche Regeln zu formulieren, wie Überladung funktionieren soll.
    Was für eine Überladung soll aufgerufen werden für fun(1)? BOOL, WORD, INT, DINT? für fun(-1)? für fun(0)?
    Das ist ziemlich fehlerträchtig. Wenn man aber fordert fun(BOOL#1) zu schreiben, was ist dann gewonnen gegenüber
    fun_BOOL(1)?
    In C++ wird anhand der Signatur entschieden welche Funktion letztendlich aufgerufen wird, die Regeln sind meine ich auch klar. Wie man an diversen Funktionen wie z.B. auch LIMIT() sieht, scheint diese grundsätzliche Funktion in Codesys also schon vorhanden zu sein. Oder läuft es bei diesem Funktionen anders ab?

    Ich denke nicht dass gefordert ist, den Variablentyp während der Laufzeit des Systems ändern zu können, denn dazu müsste man den Typ immer mitführen. Bei Siemens wäre das sogar möglich, da in dem S7-ANY der Typ mitgeführt wird. (auch wenn er zur Compile-Zeit festgelegt wird wenn man symbolisch programmiert).

  5. #15
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    In C++ wird anhand der Signatur entschieden welche Funktion letztendlich aufgerufen wird, die Regeln sind meine ich auch klar. Wie man an diversen Funktionen wie z.B. auch LIMIT() sieht, scheint diese grundsätzliche Funktion in Codesys also schon vorhanden zu sein. Oder läuft es bei diesem Funktionen anders ab?
    Ja das läuft anders ab. Der Compiler kennt die Funktion LIMIT (und die anderen Operatoren) und behandelt die speziell. Und auch bei den impliziten Funktionen gibt es immer wieder Probleme, wie etwa
    bei word := ROL(1, 17);
    Häufig wird eine Operation nicht so ausgeführt wie der Programmierer sich das denkt, dabei machen immer die nichtgetypten Literale Probleme, vor allem dann noch in einem komplexen Ausdruck mit
    unterschiedlichen anderen Typen.

    Ich weiss, wie das C++ macht, auch da kommen seltsame Sachen dabei raus. Und natürlich ist das auch in C++ eine Fehlerquelle. Gerade durch Vererbung passiert es häufig dass die Basisimplementierung einer Funktion geändert wird, wodurch die Ableitung plötzlich nicht mehr überschreibt, sondern überlädt.
    Natürlich ist das manchmal praktisch, aber es ist schwer zu implementieren, schwer zu beherrschen, fehlerträchtig und bietet keinen echten Mehrwert.
    Für die Stringfunktionen haben wir beispielsweise auch keine Überladung definiert, und bis jetzt hat sich noch keiner beschwert dass er einmal CONCAT und einmal WCONCAT schreiben muss.

    Bernhard

  6. #16
    Avatar von Schnick und Schnack
    Schnick und Schnack ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    08.08.2007
    Ort
    Süd-Süd-Deutschland (CH)
    Beiträge
    220
    Danke
    29
    Erhielt 27 Danke für 21 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Werner29 Beitrag anzeigen
    Für die Stringfunktionen haben wir beispielsweise auch keine Überladung definiert, und bis jetzt hat sich noch keiner beschwert dass er einmal CONCAT und einmal WCONCAT schreiben muss.

    Zitat Zitat von Werner29 Beitrag anzeigen
    Was für eine Überladung soll aufgerufen werden für fun(1)?
    So gesehen hast Du natürlich recht. Ursprünglich ging es ja darum, einen unbekannten Datentyp in einer Schnittstelle zu verwenden.
    Selbst wenn es die Möglichkeit gäbe, saubere Überladungen zu schreiben, müsste auch eine Überladung für jeden möglichen Datentyp
    erstellt werden. Sprich man hätte einen vergleichbaren Aufwand, wie wenn die Funktion für jeden Datentyp separat erstellt wird.
    Okay, der Aufruf hiesse zumindest immer gleich, aber wie Du schon sagst, mann kann sie ja x_fun, oder di_fun, oder wie auch immer nennen.

    Das Bedürfnis während der Laufzeit einen Variabeltyp zu ändern habe ich bislang noch nicht verspürt

    Gruss
    "Hätte ich das gewusst, hätte ich einen anderen Beruf gelernt." - "Hast Du gelernt diese Scheisse?"
    (Zitat aus Knockin' on Heaven's Door)

    "Kommentare? Wieso? Steht doch alles im Code..!"

    Avatar erstellt auf www.sp-studio.de

Ähnliche Themen

  1. Unbekannter Datenbausteinwörter in Referenzdaten
    Von Buschmann im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 19.04.2010, 11:13
  2. Antworten: 0
    Letzter Beitrag: 19.09.2006, 09:52
  3. Antworten: 0
    Letzter Beitrag: 30.09.2005, 11:13

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •