#define



  • Ok, also ich bin ein völliger NOOB im C++ Programmieren (Programmieren allgemein).

    Nun habe ich mich in letzter Zeit dafür interessiert und mit dem Programmieren eines Roboters angefangen (RC- SOCCERBOT von www.graupner-robotics.com).

    So, nun hat mir ein Bekannter ein Beispielprogramm geschrieben und gegeben, nun ersetze ich im Moment ein paar Variablen und definiere ein paar Begriffe neu. (Hier kommt meine Frage)

    Nun, nachdem ich:

    #define WERT_Rot_min (10)
    #define WERT_Rot_max (16)
    #define WERT_Gruen_min (60)
    #define WERT_Gruen_max (80)
    #define WERT_Schwarz_min (190)
    #define WERT_Schwarz_max (255)
    

    habe will ich einen "WERT_Schwarz" definieren, der in dem vorgegebenen Bereich liegt. Ich habe es mit

    #define WERT_Schwarz (190 <= x <= 255)
    

    probiert, aber es kam nichts dabei raus.

    Könnte mir jemand vielleicht helfen?

    Wäre sehr nett!

    Danke!
    Vito



  • defines sind nicht für das definieren von Variablen da.. Dafür benutzt du besser const Typen:

    const int Rot_min (10);
    const int Rot_max (16);
    const int Gruen_min (60);
    const int Gruen_max (80);
    const int Schwarz_min (190);
    const int Schwarz_max (255);
    

    Dann das nächste Problem. Das ist zwar ein korrekter mathematischer Begriff, aber er macht in C++ nicht wirklich das, was du denkst. 😉

    Du willst eine Variable, die sich stets in den Bounds befindet, nicht? - Das musst du dann halt selbst checken:

    class foo
    {
     public:
      void set_schwarz (int value )
      {
       if ( value > Schwarz_max )
        schwarz = Schwarz_max; // z.B du könntest auch eine exception werfen
       else if ( value < Schwarz_min )
        schwarz = Schwarz_min;
       else
        schwarz = value;
      }
    
      void get_schwar () const { return schwarz; }
     private:
      int schwarz;
    };
    


  • Du willst also, dass der Compiler (oder sogar Präprozessor) dir zufällig irgendeinen Wert in den Grenzen auswählt? So einfach ist das nicht... 😉

    ...sondern noch viel einfacher, indem du selbst einen konkreten Wert festlegst. Oder geht es dir ums Prüfen, ob die Konvention eingehalten wurde?

    Abgesehen sollte man für Konstanten in C++ keine Makros nehmen, da diese einige Probleme aufweisen. Und ein gutes Buch würde nicht schaden, wenn du kein Anfänger bleiben willst. 🙂



  • case ',': { // Liniensensor
                       printf("LI=%03d VL=%d RT=%d GN=%d\n\r",
                         val_Farbe, 
                         WERT_Schwarz() ? 1 : 0,
    					 WERT_Rot() ? 1 : 0,
                         WERT_Gruen() ? 1 : 0,
    					 robot.digital(SENSD_BumperLinks),
                         robot.digital(SENSD_BumperRechts) );
                     break;}
          case '.': { // Kalibrierungswerte
    #if Kalibrierung_im_Programm    
                   printf("SW=%03d S=%03d W=%03d R=%03d G=%03d\n\r",cal_schwarz_weiss, cal_schwarz, cal_weiss, cal_rot, cal_gruen);
    #endif
                   printf("R-=%03d R+=%03d G-=%03d G+=%03d S-=%03d S+=%03d\n\r",
    			         WERT_Rot_min, WERT_Rot_max, WERT_Gruen_min, WERT_Gruen_max, WERT_Schwarz_min, WERT_Schwarz_max);
    				 break;}
    

    Hier sind die WERT_****s
    und die Schwarz_mins und so habe ich schon (ja ich habe die Frage dumm gestellt)

    aber wie mach ich das, dass "WERT_Schwarz" und so bei dem #define richtig angegeben sind?



  • Mit #define erreichst du lediglich eine Textersetzung, die vor dem Kompilieren stattfindet (durch den Präprozessor). Das heißt also, überall wo in deinem Code "WERT_Schwarz" vorkommt, wird es durch "(190 <= x <= 255)" ersetzt.



  • Nexus schrieb:

    Du willst also, dass der Compiler (oder sogar Präprozessor) dir zufällig irgendeinen Wert in den Grenzen auswählt? So einfach ist das nicht... 😉

    ...sondern noch viel einfacher, indem du selbst einen konkreten Wert festlegst. Oder geht es dir ums Prüfen, ob die Konvention eingehalten wurde?

    Abgesehen sollte man für Konstanten in C++ keine Makros nehmen, da diese einige Probleme aufweisen. Und ein gutes Buch würde nicht schaden, wenn du kein Anfänger bleiben willst. 🙂

    Ich habe im Moment nicht so richtig die Zeit für ein gutes Buch, ansonsten hätte ich ja nicht hier gefragt!



  • _matze schrieb:

    Mit #define erreichst du lediglich eine Textersetzung, die vor dem Kompilieren stattfindet (durch den Präprozessor). Das heißt also, überall wo in deinem Code "WERT_Schwarz" vorkommt, wird es durch "(190 <= x <= 255)" ersetzt.

    GENAU und wie kriege ich das hin? Mein SCH**** Compiler sagt immer, dass das nicht geht, weil das "x" nicht definiert ist...



  • Schau dir mein Beispiel an. Dort siehst du, wie man es richtig macht.



  • Indian_Foxx schrieb:

    Ich habe im Moment nicht so richtig die Zeit für ein gutes Buch, ansonsten hätte ich ja nicht hier gefragt!

    Aha. 🙄

    Indian_Foxx schrieb:

    GENAU und wie kriege ich das hin? Mein SCH**** Compiler sagt immer, dass das nicht geht, weil das "x" nicht definiert ist...

    Klar, der Compiler ist Mist, am meisten, weil er bei dem Präprozessorvorgang so starkt involviert ist. :p

    Wie willst du was hinkriegen? Wie man eine einfache Zahl per #define festlegt, habe ich ja erwähnt und das kannst du auch schön an den anderen Zeilen ablesen. Dass es in C++ bessere Möglichkeiten gibt, wurde aber auch schon gesagt.



  • drakon schrieb:

    Schau dir mein Beispiel an. Dort siehst du, wie man es richtig macht.

    Yeah, das sehe ich ja schon, aber gibt es wiklich KEINE EINZIGE Möglichkeit das mit der "#define" zu machen? Ansonsten muss ich 3 A4 Seiten umschreiben o.O!



  • Die definierten Konstanten kannst du genau gleich so stehen lassen. Du kannst von mir auch das redundante "WERT_" wieder vorne ranhängen.

    Und für die Schwarzwerte nimmst du einfach einen int und nachdem du den Wert erhalten hast, machst du Boundchecks. (Das kann, wie ich bereits gezeigt habe automatisiert werden..)



  • Oah... Ich gebs einfach auf und gut ist 😃

    Das kriege ich doch nie im Leben hin...
    (Muss mir wirklich etwas durchlesen... Aber das wird erst dann kommen, wenn das alles schon vorbei ist.)



  • Tja, von 0 auf 100 geht nunmal nicht. Bei C++ noch weniger als bei den meisten Sprachen. Du wirst dich damit anfreunden müssen, dass du ohne das Grundlagen-Lernen nicht weit kommen wirst... 🙂



  • Das wusste ich schon am anfang, aber ich wurde damit verdonnert und das muss halt bis Donnerstag sitzen 😃


Anmelden zum Antworten