#define "weigert sich"



  • Hallo erstmal...

    Ich darf den Quellcode der Funktion chart() nicht antasten.
    Frage 1: Wie kann ich den Ausdruck ich.heiss.wie.ich.will auf hatschi umbiegen???

    void chart();
    
    #define ich.heise.wie.ich.will "hatschi"
    
    // *********************************
    void chart()
    {
      int hatschi;
      ich.heisse.wie.ich.will = 10;
    }
    // *********************************
    
    #undef ich.heise.wie.ich.will "hatschi"
    

    Frage 2: Angenommen hatschi würde nicht in chart() deklariert werden, sondern in einer includierten Header-File. Wie müsste ich dann auf diese verweisen, über extern?

    Danke für Eure Hilfe. :p



  • Die Punkte dazwischen sind das Problem. Ausserdem darf "hatschi" kein Literal sein, also einfach nur hatschi. Beim undef musst du die Definition nicht wiederholen.



  • Das sollte besser laufen...

    void chart();
    
    #define ich_heisse_wie_ich_will hatschi
    
    // *********************************
    void chart()
    {
      int hatschi;
      ich_heisse_wie_ich_will = 10;
    }
    // *********************************
    
    #undef ich_heisse_wie_ich_will
    


  • Ich darf und kann "Ich.heisse.wie.ich.will" aber nicht einfach in "Ich_heisse_wie_ich_will" umbenennen. Wie gesagt die Punkte machen das Problem 😞



  • Frostbeule schrieb:

    Ich darf und kann "Ich.heisse.wie.ich.will" aber nicht einfach in "Ich_heisse_wie_ich_will" umbenennen. Wie gesagt die Punkte machen das Problem 😞

    Warum?
    ich.heisse.wie.ich.will ist nunmal kein legaler Bezeichner



  • Shade Of Mine schrieb:

    ich.heisse.wie.ich.will ist nunmal kein legaler Bezeichner

    Es könnte doch eine globale Struktur ich mit einem Member heisse mit einem Member wie usw. geben?

    @Frostbeule:
    Ich nehme an, das ist nicht der echte Code. Ist es wirklich so, dass ein Bezeichner in dieser Verkettung doppelt vorkommnt (bei dir "ich")?



  • Nein, 'ich' kommt natürlich nicht 2x vor. 🙂
    Also meine Files sehen so aus, der Compiler und Linker akzeptieren nun den Code.
    Aber die Variable hatschi wird nicht auf 1000 gesetzt :-(((

    chart.c

    #include "test.h"
    
    // *********************************
    void chart()
    { 
      int hatschi = 5;
      printf("Hallo");
    
      struct Haha ich;
      // hier soll nun hatschi 1000 zugewiesen bekommen
      ich.doof = 1000;
      printf("%d", hatschi);
    }
    // *********************************
    

    test.h

    struct Haha
    {
     int doof;
    };
    

    chart.h

    #define ich.doof hatschi 
    
    void chart();
    

    Ich bitte die Variablennamen zu entschuldigen 😉



  • // hier soll nun hatschi 1000 zugewiesen bekommen
    ich.doof = 1000;

    und wieso kannst du nicht einfach hatschi = 1000; schreiben?



  • Kann man Integerkonstanten umdefinieren? Falls ja:

    #define 1000 hatschi = 1000
    


  • @Gunnar
    Ich weiß es zwar nicht sicher, aber ich befürchte, dass da die Regeln für Variablen zutreffen, d. h. keine Zahl am Anfang des Variablennamens.



  • 50 imaginäre Bier, dass du die Sachen ganz falsch angehst.



  • hatschi soll aber mehrfach einen Wert zugewiesen bekommen und nicht nur 1x!

    Dem Ausdruck "ich.doof" werden im Quellcode nacheinander mehrere Werte zugewiesen,
    alle diese Zuweisungen sollen auf "hatschi" umgebogen werden OHNE den Code anzutasten.

    Per Texteditor könnte ich natürlich "ich.doof" einfach durch "hatschi" ersetzen, nur das will ich nicht :p 😉



  • Man kann Probleme in der Informatik immer lösen in dem man einfach eine Abstraktionebene höher geht: schreib das ich.doof nicht mehr in den Quelltext, sondern einen Verweis darauf, oder eine Funktion die dir nen Verweis darauf liefert. Diese kannste dann ersetzen.



  • SirLant schrieb:

    Man kann Probleme in der Informatik immer lösen in dem man einfach eine Abstraktionebene höher geht

    Immer?



  • @SirLant: Hübsch geredet. Mache doch mal einen konkreten Vorschlag.

    Wenn ich mir eine Funktion baue um die eine Variable auf die andere umzubiegen,
    so muß die im Quellcode aufrufen. Ich darf aber nichts in den Quellcode einfügen!
    Das ist der Witz an der Sache. Sonst wäre das ja kein Problem. 😃



  • MaSTaH schrieb:

    SirLant schrieb:

    Man kann Probleme in der Informatik immer lösen in dem man einfach eine Abstraktionebene höher geht

    Immer?

    Ja immer, nur gibt es Probleme für diese du derzeit so weit abstrahieren müsstest, dass es eben nicht mehr geht 🤡

    Wenn du das nicht darfst, dann hast du nen Problem, es gibt nunmal gewisse
    Einschränkungen in jeder Sprache und diese kannst du nicht einfach umgehen.
    Und so lange der Präprozessor keine Punkte im Namen akzeptiert, kannst du da wohl
    nichts machen, den Punkt bekommst du dann mit keinem #define weg.

    Aber mal kurz überlegen, wie wäre es mit

    #define doof doof; hatschi =



  • Frostbeule schrieb:

    Per Texteditor könnte ich natürlich "ich.doof" einfach durch "hatschi" ersetzen, nur das will ich nicht :p 😉

    das ist logisch, denn dann wäre der code uU ja sogar halbwegs vernünftig.



  • Was natürlich gehen würde ist das hier:

    int real_hatschi;
    class int_{
    public:
      //...
    };
    struct A{
      struct B{
        struct C{
          struct D{
            struct E{
              E&operator=(int n){
                real_hatschi=n;
                return this;
              }
            }will;
          }ich;
        }wie;
      }heisse;
    }ich;
    #define int int_
    // ********************************* 
    void chart() 
    { 
      int hatschi; 
      ich.heisse.wie.ich.will = 10; 
    } 
    // ********************************* 
    #undef int
    

    Und wenn du nur defines haben kannst dann pack die ganzen Declaration/Definitionen einfach in ein define:

    #define void ... ;void
    

    Wieso gibt es schließlich void? 😃



  • @Irgendwer

    Gut und jetzt schau dir nochmal den Titel dieses Forums an. Fällt dir was auf??



  • Ich hab schon viele Fragen hier gesehen in denen es in diesem Forum um C-style Konstructionen geht und nich um C selber.

    Fals es aber jetzt wirklich reines C sein soll geht es nicht.


Log in to reply