• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dynamiczna alokacja pamięci dla charów [C++]

VPS Starter Arubacloud
0 głosów
561 wizyt
pytanie zadane 8 kwietnia 2017 w C i C++ przez Mikusbombro Użytkownik (990 p.)

Czy można dynamicznie zaalokować pamięć, ale nie dla tablicy, tylko dla pojedynczej zmiennej. W moim przypadku typ char. Dotąd widziałem dynamiczne alokowanie pamięci tylko dla tablic, a przecież czasami tablice nie są potrzebne. Próbowałem tak:

char *w;
w  = new char postac;
postac  = '@';

...

delete w;

Wyskakuje mi: expected ';' before 'postac'

Z góry dziękuję za pomoc.

komentarz 8 kwietnia 2017 przez Milesq Nałogowiec (32,020 p.)
usuń słowo postać
komentarz 8 kwietnia 2017 przez Mikusbombro Użytkownik (990 p.)
No to jak mam później użyć zmiennej postac?
1
komentarz 8 kwietnia 2017 przez j23 Mędrzec (194,920 p.)

Jeśli potrzebujesz zmiennej postac, to po cholerę definiujesz  wskaźnik w?

komentarz 8 kwietnia 2017 przez Mikusbombro Użytkownik (990 p.)
Bo tworzę program, w którym postać zmienia położenie i z jednego punktu na mapie, ma być usunięta i zostać utworzona w drugim.

2 odpowiedzi

+1 głos
odpowiedź 8 kwietnia 2017 przez draghan VIP (106,230 p.)
To bardzo nieeleganckie. W jakim celu takie zabawy?
komentarz 8 kwietnia 2017 przez j23 Mędrzec (194,920 p.)
Trzeba było stare miejsce nadpisać jakąś wartością, nie wiem... spacją?
komentarz 8 kwietnia 2017 przez Mikusbombro Użytkownik (990 p.)
#include <iostream>
#include <windows.h>
#include <conio.h>

int WIDTH = 25;
int HEIGHT = 8;

int x,y;

int x_player=2;
int y_player=2;

using namespace std;

void draw() // RYSUJE PLANSZE
{
    for(int i=0; i<=WIDTH; i++)
    {
        cout << char(219);
    }

    cout << char(219) << endl;

    for(int i=0; i<=HEIGHT; i++)
    {
        cout << char(219);

        for(int i=0; i<WIDTH; i++)
        {
            cout<<" ";
        }

        cout << char(219) << endl;
    }

    for(int i=0; i<=WIDTH; i++)
    {
        cout << char(219);
    }

    cout << char(219) << endl;
}

void cursor(int x, int y) // USTAWIA KURSOR NA PLANSZY
{
   COORD c;
   c.X=x;
   c.Y=y;
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

void draw_player(int x, int y); // RYSUJE GRACZA NA PLANSZY

void move_player() // PORUSZA GRACZA PO PLANSZY
{
    char przycisk;

    przycisk = getch();

    switch(przycisk)
    {
    case 'w':
    case 'W':
        {
            y_player--;
            draw_player(x_player, y_player);
            break;
        }

    case 's':
    case 'S':
        {
            y_player++;
            draw_player(x_player, y_player);
            break;
        }

    case 'a':
    case 'A':
        {
            x_player--;
            draw_player(x_player, y_player);
            break;
        }

    case 'd':
    case 'D':
        {
            x_player++;
            draw_player(x_player, y_player);
            break;
        }
    }
}

int main()
{
    draw();
    char *postac = new char;
    *postac = '@';
    draw_player(x_player, y_player);

    for(;;)
    {
        move_player();
        delete postac;
        char *postac = new char;
        *postac = '@';
    }

    return 0;
}

void draw_player(int x, int y) // RYSUJE GRACZA NA PLANSZY
{
    cursor(x, y);
    cout<<*postac;
    cursor(10, 10);
}
komentarz 8 kwietnia 2017 przez draghan VIP (106,230 p.)
Już pomijając to, że kod nie ma prawa się skompilować, to idea jest bez sensu. Wciąż i wciąż usuwasz i tworzysz na nowo zmienną o tej samej wartości, tylko z możliwością ulokowania pod innym adresem w pamięci. To, że zwalniasz pamięć zajmowaną przez zmienną, nie sprawi że wydrukowany znak zniknie z okna konsoli. Naprawdę, nawet nie wiem co mam dalej mówić. To rozwiązanie po prostu nie trzyma się kupy.

Powinieneś w pętli:

1. Pobrać wejście.
2. Zareagować na dane wejściowe, obliczając nowe pozycje obiektów.
3. Narysować:
   3. a. Od nowa całą planszę i wszystkie obiekty lub
   3. b. Narysować obiekty na nowej pozycji i zamazać ich pozostałości na starych pozycjach.

Rozwiązanie 3.a. ma tę zaletę, że nie musisz pamiętać poprzednich pozycji obiektów ani tła, które było ewentualnie przed tym, jak obiekt zajął tamto miejsce. Wadą jest konieczność czyszczenia i rysowania całej planszy od nowa w każdej klatce.
komentarz 8 kwietnia 2017 przez Mikusbombro Użytkownik (990 p.)
Właśnie tak robiłem, tak jak w punkcie 3, ale była jedna wada (i to uciążliwa) - ekran strasznie się odświeżał i wyglądało to chaotycznie. Myślałem, że jest jakieś "płynniejsze" rozwiązanie, bo jak widziałem filmiki z takich gier na konsole, to sterowanie było dużo płynniejsze i ekran aż się tak bardzo nie "odświeżał".
komentarz 8 kwietnia 2017 przez draghan VIP (106,230 p.)
Konsola nie jest przeznaczona do takich rzeczy. Zostaje punkt 3.b. W momencie ruchu zamazuj stary obiekt (np. wpisz na jego miejscu spację) po czym rysuj go na nowej pozycji.
0 głosów
odpowiedź 8 kwietnia 2017 przez j23 Mędrzec (194,920 p.)
char* postac  = new char;
*postac  = '@';
...

A tak, bez w, nie może być?

Podobne pytania

0 głosów
1 odpowiedź 348 wizyt
pytanie zadane 27 września 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
2 odpowiedzi 181 wizyt
0 głosów
4 odpowiedzi 1,187 wizyt
pytanie zadane 13 kwietnia 2016 w C i C++ przez veryhotshark Obywatel (1,620 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...