std::array nach C-Array kopieren?



  • Hallo,

    Visual 2015 zeigt hier einen Fehler an. Diese Meldung könnte man zwar wohl in den Optionen abschalten, weiß aber nicht recht.

    std::array <int, 4> a = { 1,2,3,4 };
    
    	//std::array <int, 4> b; //keine Meldung
    	//int b[4]; //Meldung wg 'unsave'
    
    	std::copy(std::begin(a), std::end(a), std::begin(b));
    

    gcc beschwert sich nicht. Hatte mich schon gefreut, aber bringt ja nichts, wenn ein anderer Compiler Fehler meldet.

    Da ich das C-Array für WriteConsoleOutput() benötige, kann ich ja schlecht auch ein std::array nehmen?

    Kennt jemand eine weitere Kopiermethode für diesen Fall? (Außer eben mit

    for (std::size_t i=0; i<a.size(); i++) b[i] = a.at(i);
    

    )?
    Oder sollte ich mich in diesem Fall einfach damit zufrieden geben?


  • Mod

    Was für eine Meldung bekommst du? Wir können dir nicht helfen, wenn du Ratespiele veranstaltest.

    Da ich das C-Array für WriteConsoleOutput() benötige, kann ich ja schlecht auch ein std::array nehmen?

    Doch, kannst du problemlos machen. std::array, std::vector und std::string (und noch ein paar andere) sind kompatibel zu klassischen C-Arrays. Mit der data -Methode kommst du an einen passenden Zeiger.



  • Hups, habe schon mit gerechnet, das meine Frage wieder eine tieferes Übel zum Vorschein bringen wird 😉

    Die Fehlermeldung lautet

    Fehler	C4996	'std::_Copy_impl': Function call with parameters that may be unsafe - 
    this call relies on the caller to check that the passed values are correct. 
    To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. 
    See documentation on how to use Visual C++ 'Checked Iterators'
    

    Könntest Du das mit dem data näher erläutern? Dann könnte ich mir auch das Kopieren "ersparen".


  • Mod

    Hast du die "Fehler"meldung mal gelesen und verstanden?

    Die data-Methode gibt dir halt einen Zeiger auf das erste Element des unterliegenden Arrays. Also ganz genau das, was du suchst:
    http://en.cppreference.com/w/cpp/container/array/data
    http://www.cplusplus.com/reference/array/array/data/
    Gibt es, wie gesagt, auch für allerlei andere Container, bei denen das Sinn macht, falls ein std::array mal nicht passend sein sollte.



  • Jupp sorry, hatte Sekunden, bevor Du geschrieben hast, selbst die betreffende Dokumentation gefunden.



  • SeppJ schrieb:

    Hast du die "Fehler"meldung mal gelesen und verstanden?

    Was bedeutet die Fehlermeldung denn? So wie ich das verstanden habe, wird ohne diese Einstellung kein Fehler bei Überschreiten von array-Größen gemeldet?

    Wenn _SECURE_SCL als 0 definiert ist:

    Alle Standarditeratoren sind nicht aktiviert (Iteratoren können über die Containergrenzen hinaus verschoben werden, was zu nicht definiertem Verhalten führt).

    https://msdn.microsoft.com/de-de/library/aa985965.aspx?f=255&MSPPError=-2147217396

    Bzw wenn das gar keine "Fehler"meldung ist, wieso kann das Ding gar nicht erst erstellt werden? Worstcaser gehts doch nicht mehr?



  • Und warum mir dieser "Fehler" nicht wurscht sein kann, liegt einfach daran, das ein anderer User meinen Code so nicht in Visual 2015 ausführen kann.

    Was soll ich dem dann erzählen? "Hast Du Dir die "Fehler"Meldung nicht durchgelesen und verstanden?"?



  • Diese checked Iterators Warnung wird bei mir immer sofort deaktiviert wenn sie denn in einem Projekt auftritt. Ob du das auch machst hängt davon ab ob du überhaupt checken Iterators verwenden willst und du dafür mit Microsoft spezifischen Erweiterungen arbeiten möchtest. Wenn nicht dann einfach Warnung deaktivieren.



  • @lemon03
    C4996 ist ne Warning und kein Fehler.
    Verhindert also normalerweise nicht dass das Programm erstellt wird und dann auch funktioniert.

    Wenn du die Warning nicht bekommen willst kannst du z.B. einfach memcpy verwenden. Oder auch wie sebi707 die Warning abdrehen. z.B. indem du genau das machst was in der Meldung beschrieben steht, also _SCL_SECURE_NO_WARNINGS definieren. z.B. einfach in den Projekteinstellungen.


  • Mod

    lemon03 schrieb:

    Bzw wenn das gar keine "Fehler"meldung ist, wieso kann das Ding gar nicht erst erstellt werden? Worstcaser gehts doch nicht mehr?

    /WX aktiviert?



  • lemon03 schrieb:

    Und warum mir dieser "Fehler" nicht wurscht sein kann, liegt einfach daran, das ein anderer User meinen Code so nicht in Visual 2015 ausführen kann.

    Was soll ich dem dann erzählen? "Hast Du Dir die "Fehler"Meldung nicht durchgelesen und verstanden?"?

    Ja, klar.
    Ich sehe erfreut, daß Du schnell dazulernst.



  • Na ok. Da sich der Build bei mir nicht fortsetzen lies, dachte ich an eine schlimmere Geschichte. Muß ich nochmal schauen.

    Aber wenn es tatsächlich kein Ding ist, dann danke für die Aufklärung 😉


Anmelden zum Antworten