Funktionen und...



  • Sers,

    kann mir einer bitte erklären, wie das hier genau funktioniert.
    Nehmen wir an ich habe eine Funktion:

    func(int a, const b)

    Ich weiss nicht wozu dieses int a und const b jetzt gut sein soll, wie benutze ich dieses jetzt bitte?
    Manchmal sehe ich auch sowas wie:

    func2(const char* a, int* b, ...)

    Wie kann ich jetzt const char* a benutzen?
    Cool wäre ein kleiner Beispiel-Code.

    Danke.



  • wie wärs wenn Du zunächst anfängst Variablen, Konstanten zu lernen?





  • func(int a, const b)

    geht das? ist b dann per default ein int?



  • PeterTheMaster schrieb:

    func(int a, const b)

    geht das? ist b dann per default ein int?

    in C (<C99) schon
    das const ist aber sowieso quatsch dort.



  • ich find es nicht quatisch, ich finde, das sollte generell bei in parametern da sein, damit man die nicht aus versehen als lokale variablen missbraucht.



  • ich find es nicht quatisch, ich finde, das sollte generell bei in parametern da sein, damit man die nicht aus versehen als lokale variablen missbraucht.

    Ah. Du baust deine Schnittstellen scheinbar aus Implementierersicht. Imo nicht sehr höflich den Nutzer zu verwirren nur damit der Implementierer irgendwelche (meiner Meinung nach dubiosen) Regeln besser einhalten kann.

    Wenn man die value-Parameter ausschließlich in der cpp-Datei const deklariert, verwirrt man wenigstens nur den nächsten Wartungsprogrammierer.

    Wo ist eigentlich in C++ das Problem value-Parameter zu verändern?Geschmacklich sehe ich ja noch ein (natürlich wiederum nur für den Implementierer). Aber programmtechnisch sehe ich es nicht.



  • template<typename T>
    void fill_zero(T* pointer, size_t size)
    {
      while(size--)
      {
        *pointer++=T(0);
      }
    }
    

    das ist doch schoen.
    mal abgesehen davon, dass es schon ein 'fill' in der Standard Library gibt.

    ich will damit nur demonstrieren, dass es durchaus sinn machen kann einen parameter zu veraendern.

    natuerlich darf diese parameter nicht aus dem context gerissen werden, also ein

    size=3;
    waere natuerlich bloedsinn...
    aber ich sehe den sinn nicht warum ich in diesem beispiel eine neue variable brauche...

    btw:
    Exceptional C++: Lektion 43 (const Richtigkeit):

    Vermeiden Sie, Parameter, die als Wert uebergeben werden, als const zu deklarieren.
    [..]
    Normalerweise ist ein const Wert-Parameter bestenfalls sinnlos und irrefuehrend.



  • Normalerweise ist ein const Wert-Parameter bestenfalls sinnlos und irrefuehrend.

    Normalerweise? Heißt das, das es auch Situationen geben kann, wo sowas Sinn macht?



  • Wenn ich sicherstellen will das der übergebene Paramter nich verändert werden kann mach das mehr als Sinn.
    Schau dir im klassischen C mal die function

    char *strcpy( char *strDestination, const char *strSource );
    

    an da sieht man deutlich wan es sinn macht einen paramter als const zu deklarieren

    Un da C++ zum ersten komplett auf C aufbaut, dürfte das nicht zur Sinnlosigkeit führen



  • PAD schrieb:

    Un da C++ zum ersten komplett auf C aufbaut, dürfte das nicht zur Sinnlosigkeit führen

    Das ist kein Argument. C++ ist mit C so verwandt wie Kuchen mit Brötchen!



  • PAD schrieb:

    Wenn ich sicherstellen will das der übergebene Paramter nich verändert werden kann mach das mehr als Sinn.
    Schau dir im klassischen C mal die function

    char *strcpy( char *strDestination, const char *strSource );
    

    an da sieht man deutlich wan es sinn macht einen paramter als const zu deklarieren

    Un da C++ zum ersten komplett auf C aufbaut, dürfte das nicht zur Sinnlosigkeit führen

    Hier gehts doch um Call per Value. Bei Zeigern kann ein const natürlich sehr förderlich sein wie Deine aufgeführte Funktion zeigt.



  • @PAD
    Super. Vergleicht man erstmal Äpfel mit Elefanten, dann kann man natürlich zu ganz lustigen Ergebnissen kommen.

    char *strcpy( char *strDestination, const char *strSource );

    Fein, nur wir reden hier von der Konstrukten wie:

    char *strcpy( const char* strDestination, const char* const strSource );
    

    Der *Pointer* wird per value übergeben. Die zusätzliche const-Deklaration des
    *Pointers* ist also überflüssig und verwirrend.
    Die const-Deklaration des *Pointees* hat mit der Diskussion überhaupt nichts zu tun.



  • Ich deklariere auch nur Parameter die ich byRef übergebe als const. Ich seh auch keinen Sinn darin, normale Parameter als const festzulegen.



  • ➡ @_red das Stücken Code war so unvollständig, das ich es fehlinterpretiert habe. Bei Call by Value ist das nicht nötig

    ➡ @MaSTaH

    Das ist kein Argument. C++ ist mit C so verwandt wie Kuchen mit Brötchen!

    Wie Sie vielleicht wissen, baut C++ auf der Grundlage C auf. Tatsächlich enthält C++ die gesamte Sprache C,
    und alle C-Programme sind (mit wenigen Aussnahmen) auch C++ Programme. Bei der Entwicklung von C++ diente
    die Sprache C als Ausgangspunkt, dem einige neue Strukturen und Erweiterungen hinzugefüg wurden, die das
    objektorientierte Programmieren (OOP) unterstützen sollten. Dennoch wurden die C-artigen Aspekte von C++
    niemals abgeschft, und der ANSI/ISO Standardist das Basisdokument für C++.
    Um C++ zu verstehen,müssen Sie daher zuerst einaml C verstehen.

    Dies ist entnommen dem Buch
    C++ entpackt
    Herbert Schildt
    mitp-Verlag
    ISBN3-8266-0731-7
    Seite 25

    Diesem Text und seiner Meinung schließe ich mich voll an.

    Herbert Schildt war/ist Mitglied des/der ANSI/ISO Komitees die C und C++ standardisiert haben.

    ➡ @HumeSikkins Mir ist mehrfach folgendes pasiiert

    int funca(char *a,char *p)
    {
    while (*p !=0)
     *s++=to_upper(*p++);
    }
    

    Das anschliesend p auf das Ende vom String zeigte und nicht mehr auf den Anfang (und das bei unterschiedlichen Compilern) deswegen ist mit das const wichtig, denn dann passiert so was nicht.



  • @PAD: Da redet doch keiner von. C ist sicher der "Vorgänger" (wenn man es so nennen will) von C++ aber deine Begründung war einfach nur schlapp. Es macht Sinn weil es in C auch so gemacht wurde? Ich benutze auch kein malloc mehr weil es in C so gemacht wurde.



  • @MaSTaH
    Ich glaube du hast den Inhalt des Textes nicht richtig verstanden, C und C++ sind derselbe Teig um in deiner Sprechweise zu bleiben。

    Interessant ist auch deine Ablehnung von C, die ich nicht verstehen kann. Sie ist mir allerdings in vielen Aritkeln unf Büchern begegnet die sich speziell auf den jeweils neuesten Hype werfen und nur noch das gut finden.

    ich habe inzwischen gelernt, das nicht alles ''alte'' unbedingt schlecht ist, und je mehr ich von C++ verstehe desto mehr fließt davon auch in meinen Beruf ein. Denoch bei Systemen die ein sinnvolles Realtimeverhalten haben sollen und mit Hardware kommunizieren sind die Methoden der sich C++ bedient manchmal von ihrem zeitlichen Ablauf
    nicht nachvollziehbar (speziell nicht wiederholbar).



  • Worüber redest du eigentlich? Ich lehne weder C ab noch stürze ich mich auf die neuesten Hypes und finde alles alte schlecht. Ich wollte dir nur klar machen, dass man C und C++ nicht in einen Topf werfen kann weil es zwei völlig verschiedene Sprachen sind. C++ programmiert man anders als C (von einigen Leuten vielleicht abgesehen 😉 ).



  • PAD schrieb:

    Dies ist entnommen dem Buch
    C++ entpackt
    Herbert Schildt
    mitp-Verlag
    ISBN3-8266-0731-7
    Seite 25

    Diesem Text und seiner Meinung schließe ich mich voll an.

    Herbert Schildt war/ist Mitglied des/der ANSI/ISO Komitees die C und C++ standardisiert haben.

    Aeh... ich wuerde Schildt nicht zitieren - das kommt nicht gut 😉

    ➡ @HumeSikkins Mir ist mehrfach folgendes pasiiert

    int funca(char *a,char *p)
    {
    while (*p !=0)
     *s++=to_upper(*p++);
    }
    

    Das anschliesend p auf das Ende vom String zeigte und nicht mehr auf den Anfang (und das bei unterschiedlichen Compilern) deswegen ist mit das const wichtig, denn dann passiert so was nicht.

    ein syntax fehler?
    ja, sowas passiert mir auch manchmal...

    ne, mal im ernst.
    jetzt stell dir vor du haettest folgendes gemeint:

    void funca(char* const a, char const* const p)
    {
      while(*p)
      {
        *a++=to_upper(*p++);
      }
    }
    

    dann waere das const zuviel... denn dann muesste man es so schreiben:

    void funca(char* const a, char const* const p)
    {
      char* t1=a;
      char const* t2=p;
      while(*t2)
      {
        *t1++=to_upper(*t2++);
      }
    }
    

    ne, ne, ne
    da schreib ichs lieber so:

    void funca(char* a, char const* p)
    {
      while(*p)
      {
        *a++=to_upper(*p++);
      }
    }
    


  • @Shade Of Mine

    Aeh... ich wuerde Schildt nicht zitieren - das kommt nicht gut

    Warum nicht?

    Zu deiner Lösung, das letzte Codestück wäre ja meine richtige Lösung.

    Ich hatte meine Funktion ohne das const geschrieben um auf das mögliche Problem hinzuweisen.

    😕 Die Stücke dazwischen sind mir unverständlich. 😕

    👎 Syntaxfehler kommen meistens, wenn man etwas schreibt ohne es zu testen und ich hatte es nur hier runtergeschrieben. 👎


Anmelden zum Antworten