Niezamierzone powtarzanie ostatniego wpisu w char*

0

Zdaje się, że czegoś w C++ nie rozumiem. Poniższy kod wyświetla mi ostatni wpis w char* displayModes[numDisplayModes]; powielony o ilość wpisów w tej tablicy. Działanie miało być inne - miały wyświetlać się wszystkie wpisy po kolei, po jednym.

#include <stdio.h>
#include <allegro5/allegro.h>
#include <string>
#include <iostream>

const int NO_ERROR = 0;
const int ERROR = -1;

int main(int argc, char **argv){
    ALLEGRO_DISPLAY *display = NULL;
    ALLEGRO_EVENT_QUEUE *evqueue = NULL;
    ALLEGRO_TIMER *timer = NULL;
    ALLEGRO_BITMAP *bitmap = NULL;

    if (al_init() == NULL) {
        return ERROR;
    }

    int numDisplayModes = al_get_num_display_modes();
    char* displayModes[numDisplayModes];

    ALLEGRO_DISPLAY_MODE dispMode;
    for (int i = 0; i < numDisplayModes - 1; i ++) {
        al_get_display_mode(i, &dispMode);
        char dispStr[13];
        int n = sprintf(dispStr, "%dx%dx%d", dispMode.width, dispMode.height, dispMode.refresh_rate);
        displayModes[i] = dispStr;
    }

    for (int i = 0; i < numDisplayModes - 1; i ++) {
        std::cout << displayModes[i] << "\n";
    }

    return NO_ERROR;
}

Co jest tutaj nie tak?

0

Nie jestem pewien, czy takie coś:
displayModes[i] = dispStr;
jest do końca pewne i dobre. Może lepiej użyć czegoś do kopiowania pamięci?

2
displayModes[i] = dispStr;

Przypisujesz adres lokalnej tablicy, która znika po wyjściu z danego obiegu pętli. Pragmatycznie rzecz biorąc, wszystkie wpisy displayModes będą pokazywały na ten sam adres, ale technicznie późniejsza dereferencja takiego wskaźnika to UB.

Użyj wektor (albo tablicę) std::string jak człowiek zamiast tablicy char*.

0

Użyłem char* dlatego, że łączenie stringów przez operator + zwraca mi błąd: error: invalid operands of types 'const char [4]' and 'const char [4]' to binary 'operator+' gdy próbuję to przypisać do tablicy displayModes

//edit:
jak widać w poprzednim kodzie, muszę połączyć integery ze stringiem składającym się z 'x', a nie bardzo wiem, jak to zrobić tak, żeby nie rzucało magią, której nie rozumiem :P

0

Ale już sobie poradziłeś używając sprintf. Co to ma do displayModes?

Btw: dispMode powinno być zmienną wewnątrz pętli.

0

No właśnie nie poradziłem sobie, bo sprintf nie działa ze stringiem - błąd: error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'char*' for argument '1' to 'int sprintf(char*, const char*, ...)

0

Brzmi jakbyś nie przeczytał tego co napisałem, i zmienił coś innego niż displayModes na tablicę stringów.

0 użytkowników online, w tym zalogowanych: 0, gości: 0