Problem ze wspolrzednymi w C++

1

Witam

Probuje dostac sie do tablic globalnych przez funckje void i zmienic tam co sie znajduje na odpowiednim polu na przeciwne, jednak wyrzuca mi blad typu: Illegal indirection. Wiecie dlaczego tak? Nie moge znalezc bledu, a wiem ze cos tutaj jest nie tak, ale co?
Kod ponizej:

 
void zmiana_pola(int *tabstan, int *tabtyp, int x, int y,int rozmiar)
{
	if((*(tabtyp[(x*rozmiar)+y]==1))&&(*(tabstan[(x*rozmiar)+y]==0)))
	{
		*(tabstan[(x*rozmiar)+y])=1;
	}
	else if((*tabtyp[(x*rozmiar)+y]==1)&&(*tabstan[(x*rozmiar)+y]==1))
	{
		*(tabstan[(x*rozmiar)+y])=0;
	}
}

Oczywiscie po kolei jest: wzkaznik do tablicy globalnej typ, stan i wspolrzedne tutaj i rozmiar plansz a ktorych wykonywana jest operacja.

0

Wszystkie te bledy wyrzuca w ciele funkcji zaraz przy pierwszym warunku

0

*(wartość logiczna) - nie widzisz tu błędu?

0

Kurcze przygladam sie i nie wiedze, moglbys go wzkazac? Jak sobie rozrysowalem na kartce to dostanie sie do tablicy jednowymiarowej z 2 wspolrzednymi robi sie wlasnie tak.

Mozesz wytlumaczyc co jest zle w tym warunku?

0

No chodzi o ten warunek IF?
No wiem ze jak nie jest spelniony to idzie dalej sprawdzac tak dlugo az bedzie mu pasowac ten

aaaaaaaaaaaaaaaaaaaaaaaaaa juz widze powinno tam byc "=" To o to chodzilo chyba, tak?

0

nie jednak chyba nie to.

0

Nie chyba jednak nie to.

0

Zdecydowanie za dużo gwiazdek :P to nie eurowizja.

0

Nie no musza byc gwiazdki, zeby dostac sie do konkretnego pola w tablicy przez wzkaznik.

0

Nie no musza byc gwiazdki, zeby dostac sie do konkretnego pola w tablicy przez wzkaznik.

0

Kłamiesz. do elementu tablicy dostajesz się za pomocą operatora []

  int *tab = new int[2];
  tab[0] = 15;
  *(tab + 1) = 20;
  delete[] tab;

Przeanalizuj sobie ten kod.

EDIT:
Poza tym zastanów się też nad tym co Ci napisał @dawidgarus

0

nie muszą... po to są nawiasy [ ].
tab[i] oznacza *(tab+i)
możesz przyjąć, że tablica typu int to wskaźnik na int. (co nie do końca jest prawdą, ale nie przejmuj się tym ;P)
jak chcesz do funkcji przekazać tablicę typu int, to ustalasz jako argument funkcji wskaźnik na int, a potem możesz wewnątrz funkcji traktować ten wskaźnik jak zwyczajną tablicę, czyli robisz tab[index] bez gwiazdek.

0

Czyli powinno byc tak?
void zmiana_pola(int tabstan, int tabtyp, int x, int y,int rozmiar)
{
if(
(tabtyp+(((x
rozmiar)+y))==1)&&((tabstan+((xrozmiar)+y))==0))
{
(tabstan+((xrozmiar)+y))=1;
}
/else if((tabtyp[((xrozmiar)+y)]==1)&&(tabstan[((xrozmiar)+y)]==1))
{
(tabstan[(xrozmiar)+y])=0;
}
/
}

Tylko teraz mi wyrzuca inne 3 bledy, ze nie moze konwersji zrobic np. Ale to jest wkoncu dobrze?

0

Czyli powinno byc tak:

void zmiana_pola(int tabstan, int tabtyp, int x, int y,int rozmiar)
{
if((tabtyp[(x
rozmiar)+y]==1)&&(tabstan[(x
rozmiar)+y]==0))
{
(tabstan+((xrozmiar)+y))=1;
}

mam racje?

0

Obraziłeś się na operator []? Masz źle nawiasy w ifie.

*(tabstan+((x*rozmiar)+y))=1;

jest równoważne z

tabstan[x*rozmiar + y] = 1;
0

musisz sobie komplikować... nawiasy są źle, zwróciłem ci na to wcześniej uwagę:

void zmiana_pola(int *tabstan, int *tabtyp, int x, int y, int rozmiar)
{
	if (tabtyp[x*rozmiar+y]==1 && tabstan[x*rozmiar+y]==0)
	{
		tabstan[x*rozmiar+y] = 1;
	}
	else if (tabtyp[x*rozmiar+y]==1 && tabstan[x*rozmiar+y]==1)
	{
		tabstan[x*rozmiar+y] = 0;
	}
}

sam bym to uprościł tak:

void zmiana_pola(int *tabstan, int *tabtyp, int x, int y, int rozmiar) {
	if (tabtyp[x*rozmiar+y] == 1) {
		tabstan[x*rozmiar+y] ^= 1;
		// a ^= 1, oznacza a = a ^ 1
		// 1 ^ 1 = 0     0 ^ 1 = 1
		// czyli a ^= 1 zamienia w a 0 na 1 i 1 na 0
		// gdy tabstan[x*rozmiar+y] może mieć inne wartości niż 0 i 1 to musisz w ifie dodać:
		// && (tabstan[x*rozmiar+y] == 0 || tabstan[x*rozmiar+y] == 1)
	}
}

jeśli masz problem z gwiazdami, to pisz int tabstan[] zamiast int *tabstan. wtedy tabstan intuicyjnie traktujesz jak tablicę, a nie wskaźnik

0

za to kocham c/c++, można wszystko skrócić tak, że za chwile nie wiesz co ten kod robi ;)
swoją drogą zaniepokoił mnie fragment [x*rozmiar+y]... pewnie lepiej by było utworzyć tablicę dwuwymiarową i robić [x][y]

0

Dzieki chlopaki za pomoc!;)

W tym przypadku prosciej bylo zrobic jednowymiarowa tablice. Mozna oczywiscie uzywac zamiennie tablic. Jak kto woli;]

0
 
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <ctime>
#include <windows.h>
#include <stdio.h>

using namespace std;
 
//---------------------------------Wzkaznik do TABLICE STATYCZNE DO PRZECHOWYWANIA STANU I TYPU
static int *tabstan;
static int *tabtyp;
static int rozmiar;	//Podstawowy bok planszy
static int wymiar;	//Plansza wymnozona juz

//-------------------------------------------

//-----------------------------KLASA ZATRZYMUJACA DZIALANIE PROGRAMU NA MOMENT
class Koniec
{
private:
	void pause();
public:
	void wysw_pause();

};
void Koniec::pause()
{
	system("pause");
}
void Koniec::wysw_pause()
{
	pause();
}
//---------------------------KLASA CZYSZCZACA EKRAN
 class Czyszczenie
 {
 private:
	 void czyszcz();

 public:
	 void getczyszcz();

 };
void Czyszczenie::czyszcz()
 {
	 system("cls");
 }
void Czyszczenie::getczyszcz()
 {
	 czyszcz();
 }

////////////////////////////////////////////////////////KLASA ZASADY**********************************************************

class zasady
{
protected:
void wysw_zasady();
 
public:
void zasady0();
};
 
void zasady::wysw_zasady()
{
printf("Prosze o stosowanie sie do wymienionych zasad gry i informacji. Powodzenia!");
printf("\n");
}
void zasady::zasady0()
{
wysw_zasady();
}
 
class zasady_dal:public zasady
{
public:
void zasady0();
};
 
void zasady_dal::zasady0()
{
cout<<"Zasady gry sa proste:\n"<<endl;
cout<<"Rozmiar planszy podaje uzytkownik. Plansza jest N x N"<<endl;
cout<<"Przejscie planszy polega zapelnieniu planszy 0 lub 1"<<endl;
cout<<"Plansza zawiera [bonusy] ktore zmieniaja inaczej sasiadow"<<endl;
cout<<"\n";
}
 
///////////////////////MENU1*****************************************************************
int menu1()
{
int wybor;
cout<<"Wybierz opcje:\n 1-NOWA GRA\n 2-WCZYTAJ GRE\n 3-Zakoncz"<<endl;
cout<<"Twoj wybor:"<<endl;
cin>>wybor;
return wybor;
}
/////////////////////////////MENU2********************************************************************
int menu2()
{
int wybor;
cout<<"Wybierz opcje:\n1-Podaj wspolrzedne\n2-Zapisz i Zakoncz"<<endl;
cout<<"Twoj wybor:";
cin>>wybor;
return wybor;
}
//---------USTAWIA PLANSZE
void ustaw_plansze(int *tabstan,int *tabtyp, int wymiar)
{
	int j=0;
	for(int i=0;i<wymiar;i++)
	{
		tabstan[i]=rand()%2;
		tabtyp[j]=rand()%4+1;
		//tabtyp[j]=4;
		j++;
		
	}
}
//---------WYSWIETLA PLANSZE
void wysw_plansze(int *tabstan,int *tabtyp, int rozmiar)

{
	for(int i=0;i<rozmiar;i++)
	{
		cout<<"\t";

		for(int j=0;j<rozmiar;j++)
		{
		cout<<tabstan[(i*rozmiar)+j];
		}
	cout<<"\n";
	}
	cout<<"\n";

	for(int i=0;i<rozmiar;i++)
	{
		cout<<"\t";

		for(int j=0;j<rozmiar;j++)
		{
		cout<<tabtyp[(i*rozmiar)+j];
		}
	cout<<"\n";
	}
	cout<<"\n";
}

//---------------------ZMIANA POLA

void zmiana_pola(int *tabstan, int *tabtyp, int x, int y,int rozmiar,int wymiar)
{
	if((tabtyp[(x*rozmiar)+y]==1))
	{
		if((tabstan[(x*rozmiar)+y])==1)
		*(tabstan+(x*rozmiar)+y)=0;
		else
		{
			*(tabstan+((x*rozmiar)+y))=1;
		}
	}
	//OK
	else if((x==0)&&(y==0)&&(tabtyp[(x*rozmiar)+y]==2))
	{
		*(tabstan+1)=rand()%2;
	}
		//OK
	else if(tabtyp[(x*rozmiar)+y]==2)
	{
			*(tabstan+(x*rozmiar)+y-1)=rand()%2;
			*(tabstan+(x*rozmiar)+y+1)=rand()%2;
	}
	//OK DLA nastepnego ELEMENTU TABLICY jak i poprzedniego
	
	else if(tabtyp[(x*rozmiar)+y]==2&&(x+1==rozmiar)&&(y+1==rozmiar))
	{
		*(tabstan+(x*rozmiar)+rozmiar-1)=rand()%2;

	}
	//OK DLA OSTATNIEGO ELEMENTU
	else if(tabtyp[(x*rozmiar)+y]==3)
	{
		int a,b,c;
		for(int i=0;i<10;i++)
		{
			a=rand()%rozmiar;
			b=rand()%rozmiar;
			c=rand()%2;

			*(tabstan+(x*a)+b)=c;
		}
	}
	if((tabtyp[(x*rozmiar)+y]==4))
	{
		for(int i=0;i<wymiar;i++)
		{
			*(tabstan+i)=rand()%2;
		}
	}
	//OK LOSUJE 0 LUB 1 DLA CALEJ PLANSZY. TRZEBA UWAZAC NA TEN TYP!!!!
}
void zapis_gry()
{
	char n_zapis[10];
	int i=0;
	FILE* zapis;
	FILE* zapis2;
	FILE* zapis3;
	cout<<"Podaj nazwe pliku do zapisu stanu gry:";
	cin>>n_zapis;
	zapis=fopen(n_zapis,"w");
	zapis2=fopen("dane planszy.txt","w");
	zapis3=fopen("globalne.txt","w");
	if(zapis!=NULL&&zapis2!=NULL)
	{
		cout<<"Utworzono pomyslnie plik i zapisano stan gy ;-)"<<endl;
		fprintf(zapis3,"%d %d",rozmiar,wymiar);

		for(i=0;i<wymiar;i++)
		{
			fprintf(zapis,"%d ",*(tabstan+i));
			fprintf(zapis2,"%d ",*(tabtyp+i));
		}
	}
	else
	{
		cout<<"BLAD nie mozna zapisac stanu gry-.-"<<endl;
	}
	fclose(zapis);
	fclose(zapis2);
	fclose(zapis3);
}
void wczytanie_gry(int *tabstan,int *tabtyp)
{
	FILE* odczyt;
	FILE* odczyt2;
	char n_odczyt[10];
	cout<<"Podaj plik do odczytu:";
	cin>>n_odczyt;
	int i=0;
	odczyt=fopen(n_odczyt,"r");
	odczyt2=fopen("dane planszy.txt","r");
	//SEEK_SET;
	if(odczyt==NULL)
	{
		cout<<"Blad"<<endl;
	}
	while(feof(odczyt))
	{
			fscanf(odczyt,"%d ",tabstan[i]);
			i++;
	}
	i=0;
	while(feof(odczyt2))
	{
			fscanf(odczyt2,"%d ",tabtyp[i]);
			i++;
	}
	
	cout<<"Zczytano dane zapisanej stan gy ;-)"<<endl;

	fclose(odczyt);
	fclose(odczyt2);
}
void wczytanie_globalnych()
{
	FILE* odczyt;
	
	odczyt=fopen("globalne.txt","r");
	fscanf(odczyt,"%d%d",&wymiar,&rozmiar);
	cout<<"Zczytano dane pomocnicze stan gy ;-)\n"<<endl;
	printf("%d %d",wymiar,rozmiar);
	system("pause");
	fclose(odczyt);
}

int main(int argc, char* argv[])
{
	///////////////WYŚWIETLANIE ZASAD*******************************************************************
//OBIEKT CZYSZCZENIE
Czyszczenie* wsk,A;
wsk=&A;
//  OBIEKT KONIEC
Koniec* kon,K;
kon=&K;
// OBIEKT ZASADY
zasady *pb;
zasady_dal k;
pb=&k; //Rzutowanie w gorę aby dostać sie do klasy bazowaej ("ZASADY1")
k.zasady0();
pb->zasady::zasady0();
kon->wysw_pause();
//-------------------------------------------------------------------------
A.getczyszcz();
///////////////****************Rozgrywka**********************************************************************************
int wybor_gracz;
wybor_gracz=menu1();
 int x,y;	//WSPOLRZEDNE
if(wybor_gracz==1)
{
	srand(time(NULL));

	cout<<"Podaj rozmiar planszy:"<<endl;
	cin>>rozmiar;
	wymiar=rozmiar*rozmiar;		//ilosc pol w tablicy

	tabstan= new int[wymiar];	//TWOTRZY PLANSZE STANU
	tabtyp=new int[wymiar];		//TWORZY PLANSZE TYPOW

	ustaw_plansze(tabstan,tabtyp,wymiar);	//ustawianie poczatkowej planszy
	wysw_plansze(tabstan,tabtyp,rozmiar);	//Wyswietla plansze na ekran

	wybor_gracz=menu2();
	//cout<<"Twoje wspolrzedne:";
	//cin>>x;
	//cin>>y;
	//A.getczyszcz();

	//zmiana_pola(tabstan,tabtyp,x,y,rozmiar,wymiar);
	//wysw_plansze(tabstan,tabtyp,rozmiar);	//Wyswietla plansze na ekran
	//cout<<"\n";

	while(wybor_gracz!=2)
	{
		wybor_gracz=NULL;
	cout<<"Podaj wspolrzedne pola ktore chcesz zmienic:"<<endl;
	cout<<"Twoje wspolrzedne:";
	cin>>x;
	cin>>y;
	zmiana_pola(tabstan,tabtyp,x,y,rozmiar,wymiar);	//ZMIANA POLA
	A.getczyszcz();		//CZYSCI EKRAN PO ZMIANIE

	wysw_plansze(tabstan,tabtyp,rozmiar);	//Wyswietla plansze na ekran
	wybor_gracz=menu2();
	}
	zapis_gry();
kon->wysw_pause();
free (tabstan);
free (tabtyp);
return 0;
}
if(wybor_gracz==2)
{
	wczytanie_globalnych();
	
	tabstan= new int[wymiar];	//TWOTRZY PLANSZE STANU
	tabtyp=new int[wymiar];		//TWORZY PLANSZE TYPOW
	wczytanie_gry(tabstan,tabtyp);
	wysw_plansze(tabstan,tabtyp,rozmiar);	//Wyswietla plansze na ekran
	printf("%d %d",wymiar,rozmiar);
	kon->wysw_pause();

	return 0;
}

	if(wybor_gracz==3)
	{
		kon->wysw_pause();
	return 0;
	}

}

Mozecie mi pomoc?? Chodzi o to ze wywala mi sie zczytywanie z pliku txt. Zapisywanie idzie bardzo dobrze, natomiast jak chce zczytac dane to mi wywala jakies dziwne adresy.

Wiedzie co jest nie tak?

Njapierw utworzcie plik (NOWA GRA) a dopiero potem spróbujcie to wczytać

Proszę o szybką odpowiedz

0
void wczytanie_gry(int *tabstan,int *tabtyp)
{
        FILE* odczyt;
        FILE* odczyt2;
        char n_odczyt[10];
        cout<<"Podaj plik do odczytu:";
        cin>>n_odczyt;
        int i=0;
        odczyt=fopen(n_odczyt,"r");
        odczyt2=fopen("dane planszy.txt","r");
        //SEEK_SET;
        if(odczyt==NULL || odczyt2==NULL)
        {
                cout<<"Blad"<<endl;
        }
        for (i=0; i<wymiar; ++i)
        {
                        fscanf(odczyt,"%d ",&tabstan[i]); // brakowalo &. tabstan[i] jest typu int, a ma byc wskaznikiem na int
        }
        for (i=0; i<wymiar; ++i)
        {
                        fscanf(odczyt2,"%d ",&tabtyp[i]); // patrz wyzej
        }
 
        cout<<"Zczytano dane zapisanej stan gy ;-)"<<endl;
 
        fclose(odczyt);
        fclose(odczyt2);
}

void wczytanie_globalnych()
{
        FILE* odczyt;
 
        odczyt=fopen("globalne.txt","r");
        fscanf(odczyt,"%d %d",&rozmiar,&wymiar); // w zlej kolejnosci wczytales zmienne
        cout<<"Zczytano dane pomocnicze stan gy ;-)\n"<<endl;
        printf("%d %d",rozmiar,wymiar);
        system("pause");
        fclose(odczyt);
}

a tak w ogóle to po co przekazujesz do funkcji zmienne globalne jako argumenty?
imho o niebo prościej by ci było, gdybyś zapisał tablice w trybie binarnym. zapis wyglądał by tak:

fwrite(tabstan, sizeof(int), wymiar, uchwyt);

a odczyt:

fread(tabstan, sizeof(int), wymiar, uchwyt);
0

Dzieki za poprawienie kodu. Wiem ze mozna bylo prosciej to zrobic ale ja jakos tak czuje sie pewniej.

A jeszcze prosze o pomoc.....dlaczego on mi tam jak wczytuje stan poprzedniej gry to na ekran wyswietla same zera??
Co jest nie tak?

0

Mozecie pomoc, bo to jest dla mnie wazne.

0

Juz wszystko poprawilem

Jeszcze raz dzieki za pomoc chlopaki;)

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