Elemente Array bestehend aus Strukturvariablen initialisieren



  • Hallo, wie im Titel beschrieben, würde ich gerne bestimmte Elemente in einem Array (basierend auf einer Struktur) initilisieren.

    Ich komme diese Woche nicht an einen PC mit Entwicklungsumgebung damit ich es ausprobieren könnte.

    struct test{
        int a, b;
        char c;
        double d;
    };
    
    using namespace std;
    
    int main()
    {
        test test1[50];
        test1[].c = { 'a' };
    
        for(int i=0; i<50; i++)
        {
            cout << test1[i].c << endl;
        }
    }
    

    Also ich möchte nur bestimmte variablen der Struktur verändern, aber in dem Array bei allen auf einmal. Geht das ohne eine Schleife zu benutzen? funktioniert das so simpel?

    Mit freundlichen Grüßen



  • Konsoler schrieb:

    funktioniert das so simpel?

    Nein.

    Der Compilere müsste, wenn er das könnte, auch eine Schleife benutzen.
    Er kann es nicht, also musst du es machen.



  • So dachte ich es mir schon.
    Mal schauen wie lange es dauert bei 2400 Schleifendurchläufen und Variablenzugriffen. Hoffe das geht schnell von statten.

    Es geht um die Struktur: CHAR_INFO, dort lässt sich der Ascii char, sowie Vorder- und Hintergrundfarbe platzieren. bei einer 80x30 Konsolenanwendung könnte es womöglich lange dauern um die 2400 werte zu verändern?
    Wenn man erst Hintergrund (Symbole, Fahmen und Farben) setzt und dann Spielfiguren platziert.
    Ich dachte so ließe sich der Hintergrund blitzschnell aufbauen, die 5-6 Spielelemente (Schlange, Spieler, Schlüssel und Tür) sind ja nicht der Rede wärt.

    Am Ende das char_info Array noch mit WriteConsoleOutput() ins Fenster schreiben.

    Hoffentlich sind die vielen Speicherzugriffe auf das Array nicht so langwierig, damit die 10 FPS erhalten bleiben.

    Oder hat jemand andere Ideen?

    Nicht jedes Mal den Hintergrund neu im Speicher malen, sondern nur den Player im Speicher ändern und das Feld auf dem er vorher stand wieder als hintergrund ändern und danach nur die beiden Zeichen neu malen mit WriteConsoleOutputCharacter()? bzw. wieder als ganzes mit WriteConsoleOutput()?

    Wie ist es am perfomrmantesten und sinnvollsten?


  • Mod

    Oh, nein! 2400 chars setzen? Das dauert doch gewiss mindestens eine millionstel Sekunde. Also besser gleich aufgeben.

    Nicht jedes Mal den Hintergrund neu im Speicher malen, sondern nur den Player im Speicher ändern und das Feld auf dem er vorher stand wieder als hintergrund ändern und danach nur die beiden Zeichen neu malen mit WriteConsoleOutputCharacter()? bzw. wieder als ganzes mit WriteConsoleOutput()?

    Keine unnötigen Operationen zu machen, ist sowieso immer gut. Besonders wenn es um Konsolenausgaben geht, die sind nicht gerade performant. Hier ist es, wo du deine Framerate optimieren kannst. So kommst du locker von 1000 FPS auf 2000 🙂

    (Das gilt natürlich nicht mehr, wenn du im Hintergrund eine extrem aufwändige Spiellogik hast. Spiele wie Minecraft oder Dwarf Fortress bringen trotz Simpelgrafik bekanntermaßen so manchen Rechner ins Schwitzen.)



  • Konsoler schrieb:

    Wie ist es am perfomrmantesten und sinnvollsten?

    probiers dir doch einfach mal aus. mit der __rdtsc() aus der intrin.h (du benutzt ja scheinbar windows) kannst du wunderbar zeiten messen bzw. takte zählen.



  • Konsoler schrieb:

    Hallo, wie im Titel beschrieben, würde ich gerne bestimmte Elemente in einem Array (basierend auf einer Struktur) initilisieren.

    Das Wort kannte ich gar nicht, aber Google zeigt dafür 880 Treffer an. 😕

    using namespace std;
    

    Was ist ein Namespace in C?

    Konsoler schrieb:

    Also ich möchte nur bestimmte variablen der Struktur verändern, aber in dem Array bei allen auf einmal. Geht das ohne eine Schleife zu benutzen? funktioniert das so simpel?

    Mo-mo-moment jetzt. "Initilisieren" (Initialisieren?) oder verändern? Letzteres geht nicht, ersteres geht:

    #include <stdint.h>
    #include <stdio.h>
    
    typedef struct
    {
        int a, b;
        char c;
        double d;
    }test;
    
    #define SET_TEST {0,0,'a',0.0}
    #define SET_TEST_5 SET_TEST,SET_TEST,SET_TEST,SET_TEST,SET_TEST
    #define SET_TEST_25 SET_TEST_5,SET_TEST_5,SET_TEST_5,SET_TEST_5,SET_TEST_5
    #define SET_TEST_50 SET_TEST_25,SET_TEST_25
    
    int main(void)
    {
        static test test1[50] = {SET_TEST_50};
        size_t i;
    
        for(i = 0;i < 50;i++)
        {
            printf("%c\n",test1[i].c);
        }
        return 0;
    }
    

    Konsoler schrieb:

    Am Ende das char_info Array noch mit WriteConsoleOutput() ins Fenster schreiben.

    Prophezeiung: Das Schreiben der Daten in die Konsole wird länger brauchen als das Setzen deiner Daten.


Anmelden zum Antworten