Plansza w postaci tablicy dwuwymiarowej z obiektami innej klasy.

Odpowiedz Nowy wątek
2014-12-31 15:20
0

Witam,
podczas tworzenia gry w statki pojawił mi sie mały problem i nie moge dojść do powodu jego wystąpienia. Podaje fragmenty kodu, może ktoś mi podpowie dlaczego program sie wywala:
Klasa pole

 class Pole
{
    char X;     //wspołrzędna X
    char Y;     //wspołrzędna Y
    int status = 0; //przypisany status
    enum flaga
    {   wolne = 1,  zaznaczone = 2,  trafione= 3  };        //flaga pola
    char znak;  // znak pola
 
public:
    Pole();
    Pole(const char, const char );
        void Ustaw_Staus(int);
         int Zwroc_Zaznaczone();

Klasa plansza

#include "Pole.h"
 
class Plansza
{
    Pole plansza[9][9];
 
public:
    Plansza();
    ~Plansza();
    void Wyswietl_Plansze();
    void Ustaw_Pole(const char, const char);
        int Zwroc_Zaznaczone(const char, const char);
}; 

Konsturktor i potrzebne metody do klasy pole

Pole::Pole()
{
    this->X = NULL;
    this->Y = NULL;
    this->status = wolne;
    Ustaw_Znak();
}
Pole::Pole(const char x, const char y)
{
    this->X = x;
    this->Y = y;
    this->status = wolne;
    Ustaw_Znak();
} 
void Pole::Ustaw_Staus(int a)
{
    this->status = a;
}
int Pole::Zwroc_Zaznaczone()
{
    return this->zaznaczone;
}

I metody klasy plansza

 Plansza::Plansza() 
{
    for (char i = 0; i < 9; ++i)
    {
        for (char j = 0; j < 9; ++j)
        {
            plansza[i][j];
            plansza[i][j].Pole::Pole(i, j);
        }
    }
}
void Plansza::Ustaw_Pole(const char x, const char y)
{
    plansza[x][y].Ustaw_Staus(2);  //podaje wartosc do funkcji na sztywno na potrzeby testow
}
int Plansza::Zwroc_Zaznaczone(const char x, const char y)
{
    return plansza[x][y].Pole::Zwroc_Zaznaczone();
 
}

Na koniec klasa statek

 
class Statki
{
    Plansza okrety;
public:
    Statki();
        void Ustaw_Polozenie(const char, const char);
        void Jedno_Masztowiec(const char, const char);
 
void Statki::Jedno_Masztowiec(const char x, const char y)
{
    Ustaw_Polozenie(x, y);
}
 
void Statki::Ustaw_Polozenie(const char x, const char y)
{
    okrety.Ustaw_Pole(x, y, okrety.Zwroc_Zaznaczone(x,y));
}

Na początek pytanie czy takie tworzenie planszy jest rozsądne, może ktoś ma lepszy pomysł?
A problem który mam polega na tym że podczas wykonywania metody Ustaw_Polozenie wywołuje sie , metoda Ustaw_Pole a w niej finalnie
zmieniam wartość pola "status" w klasie Pole. I właśnie podczas zmiany tego statusu przez funkcje Ustaw_Status(...) wywala mi błąd:
Unhandled exception at in statki.exe: Access violation writing location...
Ma ktoś jakieś sugestie, co robie źle?

Pozdrawiam

Pozostało 580 znaków

2014-12-31 16:20
0

https://www.google.nl/search?[...]ss+violation+writing+location.

i masz pierdylion odpowiedzi

masz gdzies wskaznik i go nie ustawiasz a probujesz cos z nim robic

Pozostało 580 znaków

2014-12-31 16:44
0

Pierwsze co zrobiłem to użyłem Google ;p.

i cały czas nie wiem gdzie jest błąd.

this->status = a; 

w tej linijce sie wysypuje, natomiast wartość a jest przekazywana do funkcji wiec nie wiem dlaczego tak sie dzieje.

Pozostało 580 znaków

2014-12-31 17:56
0

Masz trzy możliwości:

  1. Odpalasz debuger i sprawdzasz.
  2. Wklejasz pełny kod.
  3. Zgłaszasz się na forum wróżbitów.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-01 22:30
0

Przez debbugera szukałem, ale po prostu nie moge zrozumieć co jest źle.
Poniżej cały kod:

 
#pragma once
class Pole
{
    char X;     //wspołrzędna X
    char Y;     //wspołrzędna Y
    int status = 0; //przypisany status
    enum flaga
    {   wolne = 1,  zaznaczone = 2,  trafione= 3  };        //flaga pola
    char znak;  // znak pola
 
public:
    Pole();
    Pole(const char, const char );
    ~Pole();
    void Wprowadz_Pole(const char,const char);
    bool Sprawdz_Wolne(char, char) const;
    int Sprawdz_Status(const char, const char);
    void Ustaw_Staus(int);
    void Ustaw_Znak();
    void Pokaz_Znak();
    int Zwroc_Zaznaczone();
};
 
#include "Pole.h"
#include <iostream>
 
using namespace std;
 
Pole::Pole()
{
    this->X = NULL;
    this->Y = NULL;
    this->status = wolne;
    Ustaw_Znak();
}
Pole::Pole(const char x, const char y)
{
    this->X = x;
    this->Y = y;
    this->status = wolne;
    Ustaw_Znak();
 
}
 
Pole::~Pole()
{
}
 
void Pole::Wprowadz_Pole(const char x, const char y)
{
    this->X = x;
    this->Y = y;
}
int Pole::Sprawdz_Status(const char x, const char y)
{
 
    for (int i = 0; i < 9; ++i) //duza pętla po X
    {
        if (this->X == x)
        {
            for (int j = 0; j < 9; ++j)
            {
                if (this->Y == y)
                    return this->status;
            }
        }
    }
}
 
void Pole::Ustaw_Staus(int a)
{
    this->status = a;
}
void Pole::Ustaw_Znak()
{
    if (this->status == trafione)
        this->znak = 'T';
    else if (this->status == zaznaczone)
        this->znak = 'X ';
    else
        this->znak = 'W';
 
}
void Pole::Pokaz_Znak()
{
    cout << this->znak;
}
int Pole::Zwroc_Zaznaczone()
{
    return this->zaznaczone;
}
 
//PLANSZA
#pragma once
#include "Pole.h"
 
class Plansza
{
    Pole plansza[9][9];
 
public:
    Plansza();
    ~Plansza();
    void Wyswietl_Plansze();
    void Ustaw_Pole(const char, const char, int);
    int Zwroc_Zaznaczone(const char, const char);
};
 
#include "Plansza.h"
#include <iostream>
 
using namespace std;
 
Plansza::Plansza() 
{
    for (char i = 0; i < 9; ++i)
    {
        for (char j = 0; j < 9; ++j)
        {
            plansza[i][j];
            plansza[i][j].Pole::Pole(i, j);
        }
    }
}
 
Plansza::~Plansza()
{
}
 
void Plansza::Wyswietl_Plansze()
{
    for (int i = 0; i <= 9; ++i)
    {
 
        for (int j = 0; j <= 9; ++j)
        {
 
            cout <<"|"<< " "<<"|";
            plansza[i][j];
            plansza[i][j].Pokaz_Znak();
        }
        cout << endl << endl;;
    }
 
}
void Plansza::Ustaw_Pole(const char x, const char y, int a)
{
    plansza[x][y].Ustaw_Staus(2);
}
int Plansza::Zwroc_Zaznaczone(const char x, const char y)
{
    return plansza[x][y].Pole::Zwroc_Zaznaczone();
 
}
 
//STATKI
#pragma once
#include "Plansza.h"
class Statki
{
    Plansza okrety;
public:
    Statki();
    ~Statki();
    void Jedno_Masztowiec(const char, const char);
    void Dwu_Masztowiec();
    void Trzy_Masztowiec();
    void Ustaw_Polozenie(const char, const char);
};
 
#include "Statki.h"
 
Statki::Statki()
{
}
 
Statki::~Statki()
{
}
void Statki::Jedno_Masztowiec(const char x, const char y)
{
    Ustaw_Polozenie(x, y);
}
 
void Statki::Ustaw_Polozenie(const char x, const char y)
{
    okrety.Ustaw_Pole(x, y, okrety.Zwroc_Zaznaczone(x,y));
} 

Pozostało 580 znaków

2015-01-01 23:05
0
  1. Zacznij od przeczytania jakichś podstaw.
  2. W tym kodzie: this->status = a; nie ma błędu, jest w innym miejscu które nie pokazałeś.
  3. Podany kod nawet się nie kompiluje, kompilator wskazuje ci błędy, ty ich ignorujesz, odpalasz stare EXE, więc nawet nie wiesz gdzie jest błąd.
  4. Pozbądź się ostrzeżeń bo indeksacja tablicy za pomocą char niczego nie przyspieszy, wręcz spowolni.
  5. http://ideone.com/1X39zo

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-02 00:27
0

W tym kodzie: this->status = a; nie ma błędu, jest w innym miejscu które nie pokazałeś.

Podczas analizowania kodu w debuggerze zauważyłem ze gdy uruchamiam metode s.Ustaw_Polozenie(0,0); wszystko wykonuje sie zgodnie z zamierzeniem, lecz gdy wywołuje najpierw metode s.Jedno_Masztowiec(x, y); to w polu status na początku są jakieś śmieci, stąd wniosek, że konstruktor nie zadziałał poprawnie i dlatego kompilator wywala błąd. Mam racje ?

Pozostało 580 znaków

2015-01-02 00:39
0

Chrzani waść: http://ideone.com/6xojFs

stysiu20 napisał(a):

... stąd wniosek, że konstruktor nie zadziałał poprawnie i dlatego kompilator wywala błąd. Mam racje ?
Nie, stąd wniosek że kompilujesz nie to co uruchamiasz i debugujesz.
Podany kod nie da się skompilować, co tam się dzieje nikt nie wie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2015-01-02 00:41

Pozostało 580 znaków

2015-01-02 00:56
0

W takim razie gdzie jest błąd ze kod się nie skompiluje? Twoje podpowiedzi niewiele mi mówią..

Pozostało 580 znaków

2015-01-02 01:07
0

To czytaj komunikaty kompilatora lub komentarze w kodzie na ideone


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-02 10:46
0

kompilator mi błędów nie wywala (przebudowałem projekt). Co do komentarzów to poprawiłem zgodnie z twoimi sugestiami.
Cały czas mam wątpliwości do konstruktora klasy Plansza, czy on robi to co powinien.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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