Opóźnione wyświetlanie tablicy char.

0

Chciałem zrobić wyświetlanie tablicy char znak po znaku + opóźnienie. Kod wygląda następująco:

#include <iostream>
using namespace std;
#include <Windows.h>

void PrintD(char String[256]){
    short int Counter = 0;
    while(String[Counter] != '\0' || String[Counter] != ' '){
        Sleep(1000);
        cout << String[Counter];
        String[Counter] = '\0'; //TUTAJ JEST ŹRÓDŁO ERRORU!
        Counter++;
    }
}

int main(){
    PrintD("HelloWorld");
    return 0;
}

Niestety Visual Studio wypieprza error:
user image
Zdebugowałem kod i zaznaczyłem linijkę gdzie ten error sie pojawia.

2

Może ten ciąg HelloWorld jest umieszczany w sekcji tylko-do-odczytu, stąd nie możesz po nim mazać: String[Counter] = '\0';.

0

Coś mi się wydaje, że tak, skoro podaje ciąg znaków przez funkcję to nie mogę go edytować. Ale skoro tak, to napis zawsze jest czyszczony, więc nie trzeba go nadpisywać. Dzięki ;)

0

Ale skoro tak, to napis zawsze jest czyszczony, więc nie trzeba go nadpisywać, ani czyścić.

Nic nie jest czyszczone, ten napis bedzie sobie wisial w tej pamieci po prostu.

0

Ale skoro tak, to napis zawsze jest czyszczony, więc nie trzeba go nadpisywać, ani czyścić.

Nope, nie jest czyszczony - po prostu wisi sobie w pewnym miejscu pamięci aż do wyłączenia programu, jak zresztą każdy literał znakowy; nie ma możliwości go stamtąd usunąć, lecz akurat tym nie powinieneś się przejmować :P

0

Hmm, chodziło mi o to że kolejne użycie funkcji PrintD czyści z pamięci ten napis, zastępując go kolejnym z argumentu.

0

Hę? Teraz, to już nie rozumiem, co masz na myśli i co starasz/starałeś się zrobić.

0

Niejawna konwersja z const char * do char * została usunięta w C++11 (wcześniej była deprecated), to nie jest poprawny kod w ogóle. Większość kompilatorów (o ile nie wszystkie) na to pozwala wypisując jedynie ostrzeżenie, ale to nie znaczy, że to będzie działać. Nie będzie.

0

Dobra, poradziłem sobie z tym problemem, rozwijam dalej program, ale nie rozumiem kolejnego błędu:
"eLight'': "class" wpisz ponownie definicję
Kod jest raczej napisany poprawnie:
Plik eLight.h:

 #ifndef eLight_hpp
#define eLight_hpp

class eLight{
public:
    eLight();
    ~eLight();
    void ePrint(short int X, short int Y, short int Delay, char String[256]);
    void SetColor();
    void Clear();
    void Pause();
};

#endif

Plik eLight.cpp:

#include <iostream> //For Input and Output.
using namespace std;
#include <Windows.h> //For system(), sleep(), coordinates and other function's.
#include "eLight.h" //Header.

class eLight{
public:
    eLight(){
        cout << "eLight engine loaded!" << endl;
    }
    ~eLight(){
        cout << "eLight engine destroyed!" << endl;
    }
    void ePrint(short int X, short int Y, short int Delay, char String[256]){
        COORD coord;
        coord.X = X; coord.Y = Y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
        short int Counter = 0;
        while(String[Counter] != '\0'){
            Sleep(Delay);
            cout << String[Counter];
            Counter++;
        }
        coord.X = 0; coord.Y = 0;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    }
    void SetColor(){
        //TODO
    }
    void Clear(){
        system("cls");
    }
    void Pause(){
        system("pause");
    }
};

Bałem się wstawić kod bo się trochę wstydziłem :<

0

plik *.h:

class BlaBla
{
  void methodnumerouno();
  BlaBla();
};

plik *.cpp

#include "*.h"

BlaBla::BlaBla()
{
  // ...
}

void BlaBla::methodnumerouno()
{
  // ...
}

Porownaj to, z tym co masz u siebie.

BTW. #include <Windows.h> //For system() juz drugi raz bodaj w ostatnim czasie widze taki kwiatek, skad bierzecie takie kursy? ;o

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