Problem mit Makro

Hallo Leute,

ich habe da ein kleines Problem mit einem Makro.

#define GA_STRING(address) (byte*) (const byte[]){((String(address).substring(0, String(address).indexOf('/')).toInt() << 3) | String(address).substring(String(address).indexOf('/')+1, String(address).lastIndexOf('/')).toInt()), String(address).substring(String(address).lastIndexOf('/')+1,String(address).length()).toInt()}

Das Makro funktioniert bis zur Version 1.5.3 BETA der Arduno IDE von arduino.cc, mit der IDE 1.6.9 und 1.8.1 bekomme ich es nicht zum Laufen. Beim Übersetzen werden keine Fehler ausgeworfen.

Gruß

Mag Gyver

[GanzPersoenlicheAnsicht]

Schade dass so ein Ausdruck jemals funktioniert hat.

[/GanzPersoenlicheAnsicht]

[GanzPersöhnlicheAnsicht]

Der C++ Code stammt von einem JAVA-Programmierer, ich habe nur das Problem dadurch!
Na das war eine sehr herzliche Begrüßung, dafür kann man sich nur Bedanken!

[GanzPersöhnlicheAnsicht]

Gruß

Mag Gyver

MagGyver:
Der Code stammt von einem JAVA-Programmierer, ich habe nur das Problem dadurch!

Das ist der Nachteil von Kopieren statt Schreiben.

Kopieren von Java Ausdrücken in die 8-Bit-Arduino-C++ Welt ist besonders schwierig/übel/wenig sinvoll/...

Defines sollten kein Ersatz für Funktionen sein.

Na das war eine sehr herzliche Begrüßung, dafür kann man sich nur Bedanken!

Wir sind verantwortlich, für das was wir sagen, nicht für das, was du dabei empfindest.

Ich stimme Whandall zu.
Der Ausdruck ist gruselig.
Mein Bestreben den zu analysieren und darin Fehler zu suchen, ist ganz klar: Es liegt bei Null.

Mein Vorschlag:
Ab in die Tonne damit, und mache es vernünftig.

Der C++ Code stammt von einen Programmierer, der hauptberuflich halt mit JAVA unterwegs ist.

Die Falschannahme ist, ich hätte aus JAVA etwas kopiert und dann eingefügt.

Whandall, es würde sicherlich etwas produktiveres dabei herauskommen, wenn deine Aussagen den Umweg über das Gehirn genommen hätten, bevor man Diese hier kund tut.

Kostenloser Tipp am Rand!

Anscheinend benötige ich eine Funktion, die es schafft String in ein Byte Array zu wandeln oder?

Gruß

Mag Gyver

Strings mögen in der JAVA-Welt ok sein, wo es auf ein paar MByte mehr nicht ankommt :wink:
Auf 8Bit MC mit dem geringen RAM sind sie Gift, da sie den Speicher fragmentieren.
Du solltest lernen, wie man in C/C++ Zeichenketten benutzt, ohne die Klasse String zu verwenden.

Gruß Tommy

Dann viel Erfolg bei deinem aktuellen und den sicher kommenen Problemen,
mögest du in interessanten Zeiten leben.

Tommy56,

super! Darin werde ich mich mal vertiefen und deinen Aufruf zur Speicherverschwendungen durch den Kopf gehen lassen.

Danke für die sachliche Erklärung und den Link.

Whandall, danke auch. Ich wünsche dir auch viel Erfolg bei deinen aktuellen und kommenden Problemen.
Durchaus verständlich wenn da jemand kommt und einen so eine "Codesalat" vor die Füße legt.

Gruß

Mag Gyver

Meine einzigen Probleme sind unhöfliche, persönlich beleidigende Forenmitglieder,
meine Programmierprobleme löse ich seit 40 Jahren selbst.

Wenn ich für jede Beleidigung, die ich jemals in meinem Leben bekommen habe 50 Cent bekommen würde. Dann würde ich natürlich die Probleme nicht mehr selbst lösen müssen.

Whandall, ich entschuldige mich für die kränkende Aussage bei dir.

Dann hoffe ich du bist nicht nachtragen und nimmst meine Entschuldigung an.

Gruß

Mag Gyver

Defines sollten kein Ersatz für Funktionen sein.

Einspruch: Manchmal, insbesondere zu alten C-Zeiten und ohne dasinlineSchlüsselwort,
macht man schon mal sowas, das aussehen soll wie eine Funktion, aber schneller ausgeführt wird.

Aber das ist ja hier wohl nicht notwendig.
Auch dass der Datentyp von address hier variabler ist als bei einer echten Funktion, ist egal.

Deine Makro-Definition wird wohl immer noch gehen, wenn du die Methode c_str() explizit angibst.

Wenn man es sich antut und deinen Makro anschaut sieht man, dass das Ganze nur Sinn macht, wenn address ein Text mit (mindestens) 2 '/' drin ist.
Das zwischen den Schrägstrichen kann per toInt() in so kleine Zahlen gewandelt werden, dass die ersten beiden zusammengefasst, immer noch in ein Byte passen.

"a/b/c" -> { a*8+b, c }
Beispiele:
"1/2/3" -> {10,3}
"31/7/99" -> {255,99}

Keine Ahnung wofür das überhaupt gut sein soll, zumal die mittlere Zahl im Bereich 0 .. 7 bleiben sollte, und daher wohl kein Datum darstellen wird. Aber ...
Dafür String Objekte und deine Makro-Definition zu nehmen, ist jedenfalls völlig abartig finde ich.

Wer sowas findet und verwendet, ist selber schuld.
( Um mal wieder zurück auf die "persönlicher Angriff" - Ebene zu kommen :wink: )