Seite 32 von 69

Re: Anti-Jammer-Thread

Verfasst: 24.03.2013, 00:14
von Krishty
error C1071: unexpected end of file found in comment

für die letzte angefangene Header-Zeile

} // namespace Foo

Der Kommentar sollte zuende sein, weil VC am Ende einen Zeilenumbruch hätte einfügen müssen, und dann käme das nun erwartete Dateiende. (Nachtrag: Ohne Spracherweiterungen!)

Re: Anti-Jammer-Thread

Verfasst: 24.03.2013, 00:23
von dot
Jo, die Sache von wegen Newline wurde offenbar erst mit C++11 eingebaut, davor fügt der Compiler offenbar kein Newline ein. g++ spuckte mir diesbezüglich iirc immer eine Warning aus...

Re: Anti-Jammer-Thread

Verfasst: 24.03.2013, 00:24
von Krishty
Oh; dann ist es schlicht noch nicht implementiert. Danke!

Re: Anti-Jammer-Thread

Verfasst: 24.03.2013, 00:26
von dot

Re: Anti-Jammer-Thread

Verfasst: 24.03.2013, 00:34
von Krishty
CodingCat hat geschrieben:AMDs CodeXL ist nicht nur das gute alte CodeAnalyst in wunderbare Visual-Studio-Integration gegossen (auch VS11!), …
Bei VS11 wird bei mir absolut garnichts integriert. Dafür habe ich eben VS10 gestartet und war verblüfft, dort plötzlich einen CodeXL Explorer zu haben … oder braucht man dafür eine besondere Edition?
Ja; das ist mir alles bekannt. Ich würde sogar noch hinzufügen, dass es ganz schlicht das Parsen vereinfacht. (Ich habe mal irgendeinen Linuxer sagen hören, dass eine leere Datei per Definition keine Textdatei ist, weil eine Textdatei aus Zeilen besteht, und jede Zeile endet mit einem Zeilenumbruch. Typischer Fall von Mensch muss sich dem Computer anpassen statt umgekehrt, igitt.)

Dass die Warnung für C++ vor 2011 implementiert war, leuchtet mir also völlig ein; und ich begrüße, dass das Ganze durch den neuen Standard überarbeitet wurde. Mir ist nur unklar, warum Visual C++, das schon seit 1000 und einem Jahr bequemer behandelt, aber ausgerechnet jetzt, wo es der Standard genauso macht, es nicht im Standard-Modus implementiert hat.

Re: Anti-Jammer-Thread

Verfasst: 24.03.2013, 00:43
von dot
Nun, /Za ist wohl hauptsächlich für (Abwärts-)Kompatibilität gedacht und der C Standard fordert das Newline am Ende z.B. immer noch. Ich hab mir vor langer Zeit angewöhnt, einfach immer ein Newline zu machen... ;)

Re: Anti-Jammer-Thread

Verfasst: 31.03.2013, 14:48
von Krishty
Falls ihr euch noch erinnert, habe ich ja vor einiger Zeit eine Winkelklasse geschrieben, die den Winkel als Integer speichert, deren Wertebereich [0; 2³²[ als [0, 2pi[ interpretiert wird.

Mittlerweile ist mir klargeworden, dass man das auch gern auf 31 Bits verteilt haben möchte, um einen Double Cover zu erreichen, wo jeder Winkel zweimal dargestellt werden kann. Das wird nämlich immer dann enorm praktisch, wenn man auf Zylinderkoordinaten oder mit Kreis- und Ellipsebögen hantiert: viel Logik entfällt, sobald die Invariante (Endwinkel > Startwinkel) greift; was aber nur bei Double Cover möglich ist, weil ein Bogen ja bei 359° beginnen und 30° weiter wieder aufhören könnte, und der Wraparound auf 29° alles zerschösse.

Jedenfalls muss man, um das zu erreichen, tatsächlich nicht mehr machen als ein paar Bitmasken nach rechts zu verschieben, und schon flitzt alles. Darum steht es im Anti-Jammer-Thread. Darum, und weil es recht elegant ist.

Re: Anti-Jammer-Thread

Verfasst: 31.03.2013, 15:46
von CodingCat
Kleine sinnlose Spielerei zum Feiertag: Zero-Overhead Properties in C++

Code: Alles auswählen

#include <iostream>
#include <properties>

struct asdf {
    property_enable(asdf);

    float myFloat;

    property<int>
    {
        property_set(int new_value) {
            value = new_value * 2;
            std::cout << "my float:" << property_this->myFloat << std::endl;
        }
        property_get(int) const {
            return value - 1;
        }
    } property_make(member);
};
 
int main()
{
    asdf x = { 2.0f };
    x.member = 5;
    std::cout << x.member;
}
Möglich durch:

Code: Alles auswählen

#include <cstddef>
 
template <class Src, class Dest> Dest* transfer_cv(Src *, Dest *p) { return p; }
template <class Src, class Dest> const Dest* transfer_cv(const Src *, Dest *p) { return p; }
template <class Src, class Dest> volatile Dest* transfer_cv(volatile Src *, Dest *p) { return p; }
template <class Src, class Dest> const volatile Dest* transfer_cv(const volatile Src *, Dest *p) { return p; }
 
#define property_enable(type) typedef type property_container_type
#define property_this transfer_cv( this, container_from_property(this) )
 
template <class Value>
struct property_base
{
   typedef Value value_type;
   value_type value;
};
 
#define property struct : property_base
#define property_set(...) void operator =(__VA_ARGS__)
#define property_get(...) operator __VA_ARGS__()
#define property_make(name) name; \
static property_container_type* container_from_property(const volatile decltype(name)* p) \
{ \
   return (property_container_type*) ((char*) p - offsetof(property_container_type, name)); \
}
In Action: http://ideone.com/ooErUU ;)

Nachträgliche Fixes: __VA_AARGS__ für maximale Robustheit; const Getter.

Re: Anti-Jammer-Thread

Verfasst: 31.03.2013, 16:17
von eXile
Krishty hat geschrieben:Mittlerweile ist mir klargeworden, dass man das auch gern auf 31 Bits verteilt haben möchte, um einen Double Cover zu erreichen, wo jeder Winkel zweimal dargestellt werden kann. Das wird nämlich immer dann enorm praktisch, wenn man auf Zylinderkoordinaten oder mit Kreis- und Ellipsebögen hantiert: viel Logik entfällt, sobald die Invariante (Endwinkel > Startwinkel) greift; was aber nur bei Double Cover möglich ist, weil ein Bogen ja bei 359° beginnen und 30° weiter wieder aufhören könnte, und der Wraparound auf 29° alles zerschösse.
Cool, dann hast du eine erheblich bessere Antwort auf
Kristhy hat geschrieben:
eXile hat geschrieben:Doof nur, dass Quaternionen in einen Winkel bis zu 720° umgewandelt werden können.
Wo genau, außer bei Quaternion-Interpolation, ist das von Nutzen?
gegeben, als ich damals geben konnte.

Cats Properties sind sehr interessant; auch wenn container_from_property scharf aussieht. ;)

Damit ich im Anti-Jammer-Thread posten darf: Thunks funktionieren hier endlich, sowohl auf x86 wie auch x64. Das kommt dann in diesen Thread hier, braucht nur noch etwas Feinarbeit.

Re: Anti-Jammer-Thread

Verfasst: 01.04.2013, 00:32
von CodingCat
eXile hat geschrieben:Cats Properties sind sehr interessant; auch wenn container_from_property scharf aussieht. ;)
In der Tat, strenggenommen liefert offsetof für sehr viele Typen undefined behavior (non-standard-layout == alles, was nicht aus einer einfachen Ansammlung von standard-layout Members in einer einzigen Klasse besteht). Aber das ist nicht der einzige Grund, warum ich selbst nicht darauf zurückgreifen werde. Weitere Probleme umfassen implizite Konvertierungssequenzen, Typdeduktion (auch auto wertet zum Property-Typ aus, nicht zum Typ des angebotenen Wertes!), mangelhaftes Verhalten in Visual C++ (noch immer keine implizite Move-Funktionalität), Zerstörung von Argument-Dependent Lookup auf Properties ... Kurzum, es ist in C++ de facto unmöglich, einen Typen sauber transparent zu dekorieren. Folglich wird die Vortäuschung von Transparenz durch implizite Konvertierung langfristig fast zwangsläufig zum Problem.

Deshalb hier nachträglich die deutliche Anmerkung, dass dies als prototypisches Experiment zu verstehen ist, dessen erfolgreiche Umsetzung für den Produktiveinsatz sich im aktuellen Sprachstandard als unmöglich erweist. For science.

Re: Anti-Jammer-Thread

Verfasst: 01.04.2013, 01:48
von Krishty
Habt ihr zufällig qualifizierte Links, die mir erklären können, was Properties (in dem Sinne, den ihr hier diskutiert) überhaupt sind?

(Wikipedia spuckt nichts aus und wenn ich googel, komme ich immer nur zu Dokumentationen von Klassen, die in Property-Namespaces liegen.)

Re: Anti-Jammer-Thread

Verfasst: 01.04.2013, 01:54
von dot
Naja, sowas wie Properties in C# z.B. Im Prinzip Syntaxzucker, um Getter und Setter zu verwenden, als gäbe es einen entsprechenden Datenmember. Imo etwas, das man eigentlich eher vermeiden will... ;)

Re: Anti-Jammer-Thread

Verfasst: 01.04.2013, 12:11
von Krishty
Okay. Wenn das Template eh implementierungsabhängig ist, kann man ja auch direkt Visual C++’ property-Erweiterung benutzen … die hat so Luxus wie mehrdimensionale Arrays und automatisch erzeugte Operatoren für += u. Ä..

Re: Anti-Jammer-Thread

Verfasst: 01.04.2013, 15:28
von Krishty
Ich habe gerade zum ersten Mal erfolgreich eine Ausnahme geworfen; den passenden catch-Block angesteuert; Destruktoren ausgeführt; Stack Unwinding durchgeführt; den catch-Block ausgeführt; und die Kontrolle an das dahinterliegende Programm zurückgegeben. Zwar ist nun mein Registerinhalt Schrott, und es fehlen Sachen wie Zerstörung des geworfenen Objekts und Möglichkeiten zum throw;, aber ein Meilenstein nichtsdestotrotz.

Re: Anti-Jammer-Thread

Verfasst: 08.04.2013, 16:18
von Schrompf
Bin nicht ganz sicher, ob das "Jammer" oder "Anti-Jammer" ist, aber nach meinem aktuellen Gefühl bin ich hier schon richtig.

Ich habe vor zehn Minuten das erste Mal bei Amazon ein MP3-Album gekauft. Und soeben nach einem Telefonat das Geld dafür zurückerstattet bekommen. Warum? Weil zwar "MP3" draufsteht, ich aber trotzdem bis zu 10 Geräte über die Webseite freischalten muss und dann entweder die Files nur einzeln runterladen kann oder noch ein Browser-Plugin installieren muss, was auf Opera ja immer so eine wacklige Sache ist, weil die Plugins nur für Firefox geschrieben wurden.

Dabei hätte es so einfach sein können. Klick auf "Album kaufen", ZIP runterladen, fertig. Andere Leute kriegen es sogar hin, mich vorher noch nach gewünschtem Format und Bitrate zu fragen und dann die Mucke live für mich zu encoden und zusammenzupacken. Nicht so der Marktführer. Und damit können sie mich mal gerne haben. Ich habe einen MP3-Player, der eben nicht permanent online ist und mit den Herausgebern der jeweiligen Musik im Hintergrund konferiert, ob ich das Stück jetzt nun anhören darf oder nicht. Und ich habe einen antiken MP3-Taschenbarden mit 20GB interner Festplatte, der definitiv nichts dergleichen unterstützt. Und vor allem: ICH unterstütze das nicht. Nicht mit meinem Geld.

Mal schauen, ob das Label einen brauchbaren Webshop hat. Ansonsten: Hallo Tauschbörse, und der Rest der Welt kann mich mal.

Re: Anti-Jammer-Thread

Verfasst: 08.04.2013, 16:36
von Alexander Kornrumpf
Weißt du, in Zeiten in den Bandbreite relativ billig ist, frage ich mich immer, warum sie nicht das .iso zum Download anbieten, damit ich eine CD draus machen kann. Von CD zu MP3 komme ich relativ leicht. Von MP3 zurück zur CD ist unmöglich (Ja ich weiß es gibt Studien dass man das nicht hören kann. Dann fühle ich es eben).

An der Stelle möchte ich mal eine Lanze für die Collectors Edition von Nick Cave & the bad seeds brechen (obligatorisches Anti-Jammern!). Da ist bei jeder CD eine DVD dabei auf der das Album nochmal drauf ist, aber in 5.1 abgemischt. Und den Unterschied hörst du auf jeden Fall. Ich frage mich warum das nicht einfach bei jeder CD so ist. Kann ja nicht soviel Aufwand sein, wenn man ohnehin dabei ist das Ding zu produzieren. Und es wäre sicherlich mal ne Möglichkeit für die ach so gebeutelte Plattenindustrie etwas anzubieten was mp3 nicht kann.

Re: Anti-Jammer-Thread

Verfasst: 08.04.2013, 18:15
von Niki
Viele hier kennen das Problem vielleicht noch von früher... CD-Rohlinge. Hunderte, ja tausende von selbstgebrannten CDs. Projekt-Backups auf CD jeden zweiten Tag. Datenaustausch mit dem Grafiker, via CD. Gebrannte Master CDs. Und was auch immer für CDs. Selbstgebrannte CDs überall. Lediglich der Stiel der Klobürste wurde noch nicht als CD-Spindel benutzt.

Einmal musste ich alte CDs bei einem Firmenumzug zur Müllhalde fahren. Was für ein Fehler! Der Aufseher bat mich doch tatsächlich die zu trennen. Also, jede CD raus aus dem Jewel-Case, und die Papier-Inlets und Backcover auch. Gerade bei den Backcovern faulen einem mit der Zeit die Fingerkuppen ab. Zum Glück waren es nicht so sehr viele CDs... vielleicht 200 aber auch das schmerzt schon!

Im Keller hatte ich drei große Säcke voll CDs. Ich habe nie gezählt, aber ich schätze so um die 3000 CDs. Lange habe ich überlegt wie ich die entsorgen kann. Definitiv pfriemel ich keine 3000 CDs auseinander um mir danach im Krankenhaus die Finger amputieren zu lassen, und habe deshalb eine Entsorgung schlicht ignoriert. Ehrlich gesagt kann ich mir immer noch nicht denken, dass dieser Trennungszwang damals so rechtens war, und das kam mir auch ziemlich dubios vor.

Im Keller also die Säcke voll CDs. Neben den CDs noch anderes Zeugs, welches wegen eines Wassereinbruchs zu Schrott wurde. Wie entsorgen? Gar nicht! Erst mal abwarten und Tee trinken, denn...

... die Natur findet schon seltsame Wege

So lebe ich in einem Haus mit mehreren Eigentumswohnungen. Jeder hat seinen eigenen Kellerraum, wobei ich meinen wegen des Wassereinbruchs nicht verschlossen hatte. War ja eh nichts von Wert im Keller.
Mieter kommen und Mieter gehen. Da kann's dann anscheinend passieren das einem Mieter aus Versehen der falsche Keller zugewiesen wird! Und nun ratet mal... ja, der arme Mann hat nichts-ahnend den ganzen Müll aus meinem Kellerraum entsorgt!

Eigentlich ist das ja gar nicht komisch, aber ich bin so froh über den leeren Keller, dass das ein Grund zum anti-jammern ist!

Re: Anti-Jammer-Thread

Verfasst: 08.04.2013, 18:22
von Krishty
Ich hatte mir vor vier oder fünf Jahren mal die Mühe gemacht, alle meine alten Disketten, CDs, DVDs, und USB-Sticks auf den PC zu übertragen und die Daten zu sortieren und zu archivieren.

Die kümmerlichen 3 GiB, die sich als erhaltenswert erwiesen haben, liegen nun stets auf meinen externen Platten.

Die CDs habe ich jedenfalls vor dem Entsorgen nicht nur aus den Hüllen gepfriemelt, sondern auch zerstört – was nicht so einfach ist; die Zecken sind ziemlich robust. Aber es waren zum Glück nicht sooo viele.

Re: Anti-Jammer-Thread

Verfasst: 08.04.2013, 18:27
von Niki
Was das Erhaltenswerte anbelangt, da hatte ich Glück, denn Dinge wie Goldmaster Backups und besseren Code hatte ich in meiner Wohnung, und nicht im Keller. Schade ist's nur um Dinge wie Originalboxen von Monkey Island, Ultima 7, Ultima Underworld und so. Aber durch den Wassereinbruch wird sowas unbrauchbar.

Re: Anti-Jammer-Thread

Verfasst: 08.04.2013, 19:13
von glassbear
Schrompf hat geschrieben:Bin nicht ganz sicher, ob das "Jammer" oder "Anti-Jammer" ist, aber nach meinem aktuellen Gefühl bin ich hier schon richtig.

Ich habe vor zehn Minuten das erste Mal bei Amazon ein MP3-Album gekauft. Und soeben nach einem Telefonat das Geld dafür zurückerstattet bekommen. Warum? Weil zwar "MP3" draufsteht, ich aber trotzdem bis zu 10 Geräte über die Webseite freischalten muss und dann entweder die Files nur einzeln runterladen kann oder noch ein Browser-Plugin installieren muss, was auf Opera ja immer so eine wacklige Sache ist, weil die Plugins nur für Firefox geschrieben wurden.

Dabei hätte es so einfach sein können. Klick auf "Album kaufen", ZIP runterladen, fertig. Andere Leute kriegen es sogar hin, mich vorher noch nach gewünschtem Format und Bitrate zu fragen und dann die Mucke live für mich zu encoden und zusammenzupacken. Nicht so der Marktführer. Und damit können sie mich mal gerne haben. Ich habe einen MP3-Player, der eben nicht permanent online ist und mit den Herausgebern der jeweiligen Musik im Hintergrund konferiert, ob ich das Stück jetzt nun anhören darf oder nicht. Und ich habe einen antiken MP3-Taschenbarden mit 20GB interner Festplatte, der definitiv nichts dergleichen unterstützt. Und vor allem: ICH unterstütze das nicht. Nicht mit meinem Geld.

Mal schauen, ob das Label einen brauchbaren Webshop hat. Ansonsten: Hallo Tauschbörse, und der Rest der Welt kann mich mal.
Ja, bloede Sache. Ist mir auch schon ein paar Mal passiert, gerade auch mit Amazon und Audible ;(

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 00:26
von antisteo
Ich bin auf der Landing Page von http://www.webgl.com/ gelistet

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 16:17
von kimmi
Ich bin auf dem Test-Automation-Jornal aufgeführt worden : http://paper.li/peterflorijn/1337780558 . Und ich hab keine Ahnung, was das ist :). Und zwar mit einer Diskussion, die ich mit mir selber geführt habe: http://www.gamedev.net/topic/641302-how ... lgorithms/ ...

Gruß Kimmi

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 19:47
von Krishty
    enum class Flags {
        flag1 = 1,
        flag2 = 2,
        flag3 = 4,
        flag4 = 8
    };

    Flags foo = 9; //
Aus einer Datei gelesen oder so

Nun zeigt der Visual Studio 2012-Debugger für foo an:

    flag1 | flag4

Ich werde also auch alle Flag-Felder in meiner WinAPI als enum deklarieren; das macht alles tausend Mal einfacher.

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 19:52
von CodingCat
Womit du mich gerade auf die Frage gebracht hast, wie man Flags eigentlich vernünftig umsetzt, ohne dabei stets auf Integers zurückzugreifen, wie ich es bisher tue. Woraufhin ich gerade entdeckt habe, dass sich Operatoren wohl auch für enums überladen lassen. Arbeitseffizient aber wohl nur mit Makros? :-/ Weitere Nachforschung erforderlich.

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 19:59
von Krishty
Vernünftig oder effizient? ;-)

Vernünftig wären natürlich enum class Flags-Werte mit einem überladenen operator | (), der ein Ergebnis vom Typ FlagCombination<Flags> ausspuckt.

Praktisch mache ich es aber wohl eher wie oben beschrieben. Einen überladenen operator | () brauche ich aber wohl trotzdem.

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 20:10
von CodingCat
Kurzes Rumprobieren brachte mich auf folgendes, überraschenderweise ohne Makros:

ACHTUNG: Funktioniert nur mit g++, nicht mit clang/MSVC

Code: Alles auswählen

struct MakeFlags
{
    template <class T>
    friend T operator |(T a, T b) { return (T) ((int) a | (int) b); }
    template <class T>
    friend T operator &(T a, T b) { return (T) ((int) a & (int) b); }
};
 
struct Flags : MakeFlags {
    enum T { Flag1 = 1, Flag2 = 2, Flag3 = 4 };
};
 
int main()
{
    Flags::T test = Flags::Flag1 | Flags::Flag2;
    return 0;
}

In Action: http://ideone.com/KsG5MW

Mit stärkeren C++11 Enums sieht das wohl etwas weniger rosig aus. Achtung bei der Überladung, ich bin erstmal voll in die Rekursion reingefallen ohne die int-Casts.

Nachtrag: MSVC und clang verstehen es leider nicht. Also doch Makros ... :-/

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 22:59
von dot

Code: Alles auswählen

template <class T>
T operator |(T a, T b) { return (T) ((int) a | (int) b); }

template <class T>
T operator &(T a, T b) { return (T) ((int) a & (int) b); }

template <class T>
struct MakeFlags
{
  friend T operator |<T>(T a, T b);
  friend T operator &<T>(T a, T b);
};
 
enum Flags { Flag1 = 1, Flag2 = 2, Flag3 = 4 };


template struct MakeFlags<Flags>;
 
int main()
{
    Flags test = Flag1 | Flag2;
    return 0;
}
in action ;)

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 23:29
von CodingCat
dot hat geschrieben:in action ;)
Ist dir klar, was du da tust, oder ist mir unklar, was du da tust? Mir scheint, du hebst jegliche Typsicherheit für sämtliche Typen auf. :P

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 23:33
von dot
Ja, der halbe Code ist sowieso unnötig, da hab ich mich ein bisschen zu sehr dem Fluss der Dinge hingegeben... :P

Edit: Aber das wär vielleicht eine Lösung

Code: Alles auswählen

namespace MakeFlags
{
  template <class T>
  T operator |(T a, T b) { return (T) ((int) a | (int) b); }
   
  template <class T>
  T operator &(T a, T b) { return (T) ((int) a & (int) b); }
}

namespace Flags
{
  using MakeFlags::operator |;
  using MakeFlags::operator &;

  enum T { Flag1 = 1, Flag2 = 2, Flag3 = 4 };
}

 
int main()
{
  Flags::T test = Flags::Flag1 | Flags::Flag2;
  return 0;
}

Re: Anti-Jammer-Thread

Verfasst: 10.04.2013, 23:50
von CodingCat
dot hat geschrieben:Ja, der halbe Code ist sowieso unnötig, da hab ich mich ein bisschen zu sehr dem Fluss der Dinge hingegeben... :P

Edit: Aber das wär vielleicht eine Lösung
Jep, darauf bin ich auch schon gekommen, sehe aber keinen Vorteil gegenüber Makro dann, bzw. würde Makro vorziehen, weil weniger Schreibarbeit und weniger Komplexität.