Wie erzeuge ich ein performantes 2Dim-Array von Primitiven (double, int) ?

  • RE: Berlusconi

    Original von gritsch
    bei einem vector kann ich einfacher elemente anhängen als bei einem klassischen c-array


    Ja. vector kann man ja auch ruhig und gerne nehmen.
    Elemente Anhängen funktioniert aber auch nur, weil ein vector ein "zu grosses" array ist, und wenn man zu viele Elemente anhängt muss alles in ein grösseres Array kopiert werden.

    Ich lese andauernd Bilder ein. Hier weiss ich erst zur Laufzeit, wie gross mein Speicher sein muss. Dannach ändert sich die Grösse auch nichtmehr (bzw. ich muss neuen Speicher für ein skaliertes Bilder anlegen).
    Bisher hat sich hier noch kein einziger Grund aufgetan, std::vector statt einem "reinen" c-Array zu verwenden.
    C++
  • RE: Berlusconi

    Original von zermelo
    Original von gritsch
    bei einem vector kann ich einfacher elemente anhängen als bei einem klassischen c-array


    Ja. vector kann man ja auch ruhig und gerne nehmen.
    Elemente Anhängen funktioniert aber auch nur, weil ein vector ein "zu grosses" array ist, und wenn man zu viele Elemente anhängt muss alles in ein grösseres Array kopiert werden.

    Ich lese andauernd Bilder ein. Hier weiss ich erst zur Laufzeit, wie gross mein Speicher sein muss. Dannach ändert sich die Grösse auch nichtmehr (bzw. ich muss neuen Speicher für ein skaliertes Bilder anlegen).
    Bisher hat sich hier noch kein einziger Grund aufgetan, std::vector statt einem "reinen" c-Array zu verwenden.


    ja, hier gehts aber um messwerte einlesen und da gibt es sicherlich keine fixe größe (was einer bestimmten anzahl messwerte entsprechen würde)
  • Die größe ändert sich in meinem Problem nicht

    Da ich die Messwerte aus einer Datei beziehe. Kann dich die Datei zur Laufzeit analysieren und danach ändert sich nichts mehr an irgendwelchen Größen.

    Deswegen werde ich es jetzt doch mit dem C-Array probieren.

    Danke euch erstmal soweit!


    P.S.: Ich finde das toll wie hier fast nach jedem Beitrag erstmal wieder Glaubenskonflikte ausbrechen. Zum Glück sind Objective-C und C und C++ keine Religionen.... :)
    Es wird nichts so heiß gegessen wie es gekocht wird.
  • RE: Die größe ändert sich in meinem Problem nicht

    Original von Cassius
    P.S.: Ich finde das toll wie hier fast nach jedem Beitrag erstmal wieder Glaubenskonflikte ausbrechen. Zum Glück sind Objective-C und C und C++ keine Religionen.... :)

    ??????????

    Wer sagt, dass das keine Religionen sind!?!?!?!?!!?!!?!?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Naja bisher zum Glück die Gesetzgebung! Sonst könnten auch Informatikergemeinden sich vor der Steuer drücken! Und ich finde wir haben schon genug verantwortungslose Menschen leben die Denken, dass Sie in einem funktionierenden Staat leben können aber Ihr Geld in die Schweiz schaffen müssten. (Von denen die zusammen mit Ihrem Geld in die Schweiz fahren ganz zu schweigen.)

    Und auch ohne Steuerrechtliche Argumente finde ich es gibt schon genug Unheil auf der Welt auch ohne zusätzliche Religionen.....


    ---> Das ist jetzt aber wirklich sehr "Off Topic"
    Es wird nichts so heiß gegessen wie es gekocht wird.
  • RE: Die größe ändert sich in meinem Problem nicht

    Original von Cassius
    Da ich die Messwerte aus einer Datei beziehe. Kann dich die Datei zur Laufzeit analysieren und danach ändert sich nichts mehr an irgendwelchen Größen.

    Deswegen werde ich es jetzt doch mit dem C-Array probieren.


    ja dann gehts ja kaum einfacher:

    Quellcode

    1. typedef struct _MyMeasureType
    2. {
    3. UInt8 version __attribute__ ((packed));
    4. UInt32 valueX __attribute__ ((packed));
    5. UInt32 valueY __attribute__ ((packed));
    6. } MyMeasureType;
    7. void *data = // irgendwie in den speicher holen
    8. MyMeasureType *messwerte = (MyMeasureType *)data;
    9. //oder eben:
    10. MyMeasureType *messwerte = alloc(sizeof(MyMeasureType) * count);
    11. // und dann direkt in messwerte reinlesen.
    12. // dann jeden messwert durchgehen und messwert.valueX = EndianU32_BtoN(messwert.valueX); messwert.valueY = EndianU32_BtoN(messwert.valueY);
    Alles anzeigen
  • Wollte noch darauf hinweisen, dass Du die Speicherverwaltung mit reinen C-Arrays komplett selber machen musst, ein kleiner Fehler und Dein Programm stürzt ab bzw. Du hast ein Leak.

    Nimm vector in Verbindung mit std:auto_ptr, dann musst Du Dich nicht mit dem leidigen und fehleranfälligen Thema Speicherverwaltung auseinandersetzen.

    Ausserdem gibt Dir vector mehr Informationen (z.B. die Grösse des Arrays), die reine C-Pointer nicht bieten können...
  • 117 COmpiler Fehler !!!!

    Also hab gerade meinen ersten Versuch hinter mich gebracht! Und hab die zwei Klassen in ein Cocoa Projekt in Form von .mm-Files reingebracht! Und das erst was er macht er zeigt mir 117 compiler fehler:

    Quellcode

    1. /Developer/SDKs/MacOSX10.5.sdk/usr/include/c++/4.0.0/bits/stl_vector.h:68: error: expected unqualified-id before 'namespace'
    2. /Developer/SDKs/MacOSX10.5.sdk/usr/include/c++/4.0.0/bits/stl_bvector.h:425: error: 'vector' is not a template


    Das sind nur die ersten beiden. Wo muss ich denn was genau einstellen, damit er die Vector-Geschichte von C++ frisst?!?!? :(
    Es wird nichts so heiß gegessen wie es gekocht wird.
  • War selber zu dumm! Klappt jetzt erstmal

    Danke! Für eure geduldige Hilfe!

    Wenn es bei mir läuft komme ich zurück um über Berlusconi und die Religionen mit zu diskutieren! Wenn nicht komme ich wieder um weitere Fragen zu stellen! Danke euch soweit schonmal!
    Es wird nichts so heiß gegessen wie es gekocht wird.
  • Die Quelldatei in Xcode auswählen, die auch C++-Code enthält.
    Command-I oder <Get Info> aus dem Kontextmenü auswählen und dann sourcecode.cpp.objcpp bei Filetype im General-Tab auswählen.

    Dann sollte es gehen...


    Quellcode

    1. #include <vector>
    2. #import <Cocoa/Cocoa.h>
    3. using namespace std;
    4. int main(int argc, char *argv[])
    5. {
    6. vector<float> vfVector;
    7. return NSApplicationMain(argc, (const char **) argv);
    8. }
    Alles anzeigen
  • RE: Die größe ändert sich in meinem Problem nicht

    Original von gritsch

    Quellcode

    1. typedef struct _MyMeasureType
    2. {
    3. UInt8 version __attribute__ ((packed));
    4. UInt32 valueX __attribute__ ((packed));
    5. UInt32 valueY __attribute__ ((packed));
    6. } MyMeasureType;


    Das ist so viel umständlicher als nötig. In C++ kann man "struct" nach der Deklaration vor einem Typen weglassen, d.h. wenn du ohne typedef einfach

    Quellcode

    1. struct MyMeasureType {
    2. ...
    3. };

    machst, hat das genau den gleichen Effekt. Dein Beispiel ist aus alten C-Tagen.

    Quellcode

    1. __attribute__ ((packed))

    ist was Performance angeht absolut kontraproduktiv: Hier wird Alignment geopfert um eine 1:1 Abbildung im Speicher zu schaffen. Dies sollte sich deutlich negativ auf die Performance niederschlagen. Daher lieber etwas mehr Aufwand beim einlesen eingehen und dafür den Compiler über das Alignment entscheiden lassen!

    Je nach dem ist eventuell sogar

    Quellcode

    1. __attribute__ ((aligned (8)))

    vorzuziehen
    C++
  • Eigen - Bibliothek

    Hallo Leute

    wie versprochen ich bin zurück! Hat jemand von euch schonmal die Eigenbibliothek installiert? Ich hab Sie jetzt über die Darwinports geholt und war so naiv zu glaube, dass dann alles gleich von alleine funktioniert. Leider ist dem nicht so! Wenn ich es in mein Projekt mit

    Quellcode

    1. #import <Eigen/Core>


    einbinde, so sagt er mir error: Eigen/Core: No such file or directory

    Kann mir einer sagen wo ich das finde und wie ich XCode beibringe wo es ist? Hab keine Ahnung wohin die Darwinports das geholt haben....


    Hab auch schon gegoogelt aber irgendwie hilft das nix
    Es wird nichts so heiß gegessen wie es gekocht wird.