Problem z zamianą kolumn tablicy dynamicznej //c++


(Bcd8421) #1

Witam, poniżej prezentuję kod źródłowy fragmentu mojego programu. W visualu 2010 wyskakuja mi komunikaty o błędzie:

1>------ Build started: Project: przeplywowy, Configuration: Debug Win32 ------

1>Build started 2011-10-26 01:43:12.

1>InitializeBuildStatus:

1> Touching "Debug\przeplywowy.unsuccessfulbuild".

1>ClCompile:

1> brute.cpp

1>c:\users\padaka\documents\visual studio 2010\projects\przeplywowy\przeplywowy\szereg.h(116): error C2109: subscript requires array or pointer type

1>c:\users\padaka\documents\visual studio 2010\projects\przeplywowy\przeplywowy\szereg.h(117): error C2109: subscript requires array or pointer type

1>c:\users\padaka\documents\visual studio 2010\projects\przeplywowy\przeplywowy\szereg.h(117): error C2109: subscript requires array or pointer type

1>c:\users\padaka\documents\visual studio 2010\projects\przeplywowy\przeplywowy\szereg.h(118): error C2109: subscript requires array or pointer type

1>c:\users\padaka\documents\visual studio 2010\projects\przeplywowy\przeplywowy\szereg.h(125): error C2109: subscript requires array or pointer type

1>c:\users\padaka\documents\visual studio 2010\projects\przeplywowy\przeplywowy\szereg.h(126): error C2109: subscript requires array or pointer type

1>c:\users\padaka\documents\visual studio 2010\projects\przeplywowy\przeplywowy\szereg.h(126): error C2109: subscript requires array or pointer type

1>c:\users\padaka\documents\visual studio 2010\projects\przeplywowy\przeplywowy\szereg.h(127): error C2109: subscript requires array or pointer type

1>

1>Build FAILED.

1>

1>Time Elapsed 00:00:00.81

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Bardzo proszę o pomoc gdyż nie wiem zbytnio co mogę robić źle. W kodzie źródłowym pogrubiłem elementy które podkreśla mi kompilator.

funkcja perm jak sama nazwa głosi generuje mi kolejne permutacje kolumn tablicy dwuwymiarowej, nastepnie oblicza wartość kryterium i aktualizuje najlepsze rozwiązanie zapisując tym samym permutację dla której ono występuje.

#ifndef SZEREG_H

#define SZEREG_H


/*-------------------------*/

class szereg

{

public:

	int l_zadan;

	int l_maszyn;

	int iter;

	int **TabWag;

	int **TabWagPrzeplyw;

	int **TabWagPrzeplywKopia;

	int dana;

	int cmax;

	int cmaxbest;


	~szereg()

	{

		delete [] TabWag;

		delete [] TabWagPrzeplyw;

		delete [] TabWagPrzeplywKopia;

	}

/*-------------------------*/

void wczytaj_Wypelnij()

{

	int wartosc;

	iter=0;

	ifstream in("dane.txt"); // plik do czytania

	in >> l_maszyn; // pierwsza dana z pliku - kolumny (Maszyny)

	in >> l_zadan; //ilosc wierszy (Procesy)


	//warunek zakresu danych wejsciowych

	if(l_zadan>MAX_I || l_maszyn>MAX_J)

	{

		cout<<"Za duzy zakres danych wejsciowych!"<
		exit(1);

	}


	TabWag = new int *[l_zadan+1];//inicjowanie tablic - wartosci grafu oraz cmax

	TabWagPrzeplyw = new int *[l_zadan+1];

	TabWagPrzeplywKopia = new int *[l_zadan+1];


	for(int tmp=0;tmp
	{

		TabWag[tmp] = new int[l_maszyn+1];

		TabWagPrzeplyw[tmp] = new int[l_maszyn+1];

		TabWagPrzeplywKopia[tmp] = new int[l_maszyn+1];

	}


	//wypelnianie pierwszej kolumny i pierwszego wiersza zerami

	for(int a=0;a<=l_zadan;a++)

	{

		TabWag[a][0]=0;

		TabWagPrzeplyw[a][0]=0;

		TabWagPrzeplywKopia[a][0]=0;

	}

	for(int b=0;b<=l_maszyn;b++)

	{

		TabWag[0][b]=0;

		TabWagPrzeplyw[0][b]=0;

		TabWagPrzeplywKopia[0][b]=0;

	}

	//dane wejsciowe do tablic

	for(int k=1;k<=l_zadan;k++)

	{

		for(int l=1;l<=l_maszyn;l++)

		{

			in>>wartosc;

			dana=wartosc;

			TabWag[k][l]=dana;

			TabWagPrzeplyw[k][l]=dana;

			TabWagPrzeplywKopia[k][l]=dana;

		}

	}

}

/*-------------------------*/

void wyswietl_Wagi()

{

	cout<<"Wagi wierzcholkow:"<
	for(int k=1;k<=l_zadan;k++)

	{

		for(int l=1;l<=l_maszyn;l++)

		{

			cout<
		}

		cout<
	}

}

/*-------------------------*/

/*

void writeln(int *TabWagPrzeplyw, int l_maszyn)

{

	iter++;

	printf("\npermutacja: %d",iter);

    cout << endl <
        for(int i=0; i
        {

			cout << setw(2)<< TabWagPrzeplyw[i];

        }

	//oblicz_CMAX();

	wyswietl_CMAX();

    cout << endl;

}*/


void permut(int *TabWagPrzeplyw, int *TabWagPrzeplywKopia)

{

	for(int i=1; i <= l_maszyn; i++)

	{

		for(int j=i+1; j <= l_maszyn; j++)

		{

			if(j != i) 

			{

				for(int k=1; k <= l_zadan; k++)

				{

					TabWagPrzeplywKopia = TabWagPrzeplyw[k][[b]i[/b]];

					TabWagPrzeplyw[k][[b]i[/b]] = TabWagPrzeplyw[k][[b]j[/b]];

					TabWagPrzeplyw[k][[b]j[/b]] = TabWagPrzeplywKopia;

				}

				oblicz_CMAX();

				is_best();

				wyswietl_CMAX();

				for(int k=1; k <= l_zadan; k++)

				{

					TabWagPrzeplywKopia = TabWagPrzeplyw[k][[b]i[/b]];

					TabWagPrzeplyw[k][[b]i[/b]] = TabWagPrzeplyw[k][[b]j[/b]];

					TabWagPrzeplyw[k][[b]j[/b]] = TabWagPrzeplywKopia;

				}

			}

		}

	}

}


void brute()

{	

	permut(*TabWagPrzeplyw, *TabWagPrzeplywKopia);

}

/*-------------------------*/

int oblicz_CMAX()

{

	for(int x=1;x<=l_zadan;x++)

	{

		for(int y=1;y<=l_maszyn;y++)

		{

			TabWagPrzeplyw[x][y]=max(TabWagPrzeplyw[x-1][y],TabWagPrzeplyw[x][y-1])+TabWagPrzeplyw[x][y];

			cmax=TabWagPrzeplyw[x][y];			

			//obliczanie cmax dla problemu przeplywowego

		}

	}

	return cmax;

}


/*-------------------------*/

void wyswietl_CMAX()

{

	cout<<"Wyniki posrednie CMAX:"<
	for(int k=1;k<=l_zadan;k++)

	{

		for(int l=1;l<=l_maszyn;l++)

		{

			cout<
		}

		cout<
	}

	cout<
}


void is_best()

{

	if (cmax
	{//aktualize cmax & save permutation

		cmaxbest=cmax;

		for (int i=1; i<=l_zadan; i++)

		{

			for (int j=1; j<=l_maszyn; j++)

			{

				TabWag[i][j] = TabWagPrzeplyw[i][j];

			}

		}

	}

}

};


#endif

(Blapiter) #2

Przesyłam lekko poprawioną wersje, przeanalizuj ją może coś CI to da bo nie do końca rozumiem o co chodziło :smiley:

#ifndef SZEREG_H

#define SZEREG_H

#include 

#include 


using namespace std;

/*-------------------------*/

class szereg

{

        private:

        int l_zadan;

        int l_maszyn;

        int iter;

        int **TabWag;

        int **TabWagPrzeplyw;

        int **TabWagPrzeplywKopia;

        int dana;

        int cmax;

        int cmaxbest;

        public:

        szereg()

        {

            TabWag = 0;

            TabWagPrzeplyw = 0;

            TabWagPrzeplywKopia = 0;

        }


        ~szereg()

        {

            if(TabWag != 0) // jak w ogóle tablice zostały zainicjowane to w tedy kasuj

            {

              for(int i=0; i
              {

                delete [] TabWag[i];

                delete [] TabWagPrzeplyw[i];

                delete [] TabWagPrzeplywKopia[i];

              }

              //kasowanie pierwszego wymiaru;

              delete [] TabWag;

              delete [] TabWagPrzeplyw;

              delete [] TabWagPrzeplywKopia;

            }

        }

        /*-------------------------*/

        void wczytaj_Wypelnij()

        {

            int wartosc;

            iter=0;

            ifstream in("dane.txt"); // plik do czytania

            in >> l_maszyn; // pierwsza dana z pliku - kolumny (Maszyny)

            in >> l_zadan; //ilosc wierszy (Procesy)


            //warunek zakresu danych wejsciowych

            /*if(l_zadan>MAX_I || l_maszyn>MAX_J) // brak ddeklaracji i definicji MAX

            {

              cout<<"Za duzy zakres danych wejsciowych!"<
              exit(1);

            }*/


            TabWag = new int *[l_zadan+1];//inicjowanie tablic - wartosci grafu oraz cmax

            TabWagPrzeplyw = new int *[l_zadan+1];

            TabWagPrzeplywKopia = new int *[l_zadan+1];


            for(int tmp=0;tmp
            {

              TabWag[tmp] = new int[l_maszyn+1];

              TabWagPrzeplyw[tmp] = new int[l_maszyn+1];

              TabWagPrzeplywKopia[tmp] = new int[l_maszyn+1];

            }


            //wypelnianie pierwszej kolumny i pierwszego wiersza zerami

            for(int a=0;a<=l_zadan;a++)

            {

              TabWag[a][0]=0;

              TabWagPrzeplyw[a][0]=0;

              TabWagPrzeplywKopia[a][0]=0;

            }

            for(int b=0;b<=l_maszyn;b++)

            {

              TabWag[0]=0;

              TabWagPrzeplyw[0]=0;

              TabWagPrzeplywKopia[0]=0;

            }

            //dane wejsciowe do tablic

            for(int k=1;k<=l_zadan;k++)

            {

              for(int l=1;l<=l_maszyn;l++)

              {

                 in>>wartosc;

                 dana=wartosc;

                 TabWag[k][l]=dana;

                 TabWagPrzeplyw[k][l]=dana;

                 TabWagPrzeplywKopia[k][l]=dana;

              }

            }

         in.close(); // zamknij strumień

        }

            /*-------------------------*/

        void wyswietl_Wagi()

        {

            cout<<"Wagi wierzcholkow:"<
            for(int k=1;k<=l_zadan;k++)

            {

              for(int l=1;l<=l_maszyn;l++)

              {

                 cout<
              }

              cout<
            }

        }

            /*-------------------------*/

            /*

            void writeln(, int l_maszyn)

            {

            iter++;

            printf("\npermutacja: %d",iter);

            cout << endl <
                for(int i=0; i
                {

                 cout << setw(2)<< TabWagPrzeplyw[i];

                }

            //oblicz_CMAX();

            wyswietl_CMAX();

            cout << endl;

            }*/


        void permut() // Wszystkie tablice są w klasie wiec ta funkcja nic nie przyjmuje

        {

            for(int i=1; i <= l_maszyn; i++)

            {

              for(int j=i+1; j <= l_maszyn; j++)

              {

                 if(j != i)

                 {

                    for(int k=1; k <= l_zadan; k++)

                    {

                       //TabWagPrzeplywKopia = TabWagPrzeplyw[k][i]; // tu chyba chodziło Ci o bufor jednej liczby an ie całej tablicy ?

                       int bufor = TabWagPrzeplyw[k][i];

                       TabWagPrzeplyw[k][i] = TabWagPrzeplyw[k][j];

                       TabWagPrzeplyw[k][j] = bufor;

                    }

                    oblicz_CMAX();

                    is_best();

                    wyswietl_CMAX();

                    for(int k=1; k <= l_zadan; k++)

                    {

                       //TabWagPrzeplywKopia = TabWagPrzeplyw[k][i]; // tu chyba chodziło Ci o bufor jednej liczby an ie całej tablicy ?

                       int bufor = TabWagPrzeplyw[k][i];

                       TabWagPrzeplyw[k][i] = TabWagPrzeplyw[k][j];

                       TabWagPrzeplyw[k][j] = bufor;

                    }

                 }

              }

            }

        }


        void brute()

        {

            permut();// Wszystkie tablice są w klasie wiec ta funkcja nic nie przyjmuje

        }

            /*-------------------------*/

        int oblicz_CMAX()

         {

            for(int x=1;x<=l_zadan;x++)

            {

              for(int y=1;y<=l_maszyn;y++)

              {

                 TabWagPrzeplyw[x][y]=max(TabWagPrzeplyw[x-1][y],TabWagPrzeplyw[x][y-1])+TabWagPrzeplyw[x][y];

                 cmax=TabWagPrzeplyw[x][y];

                 //obliczanie cmax dla problemu przeplywowego

              }

            }

            return cmax;

          }


            /*-------------------------*/

       void wyswietl_CMAX()

       {

            cout<<"Wyniki posrednie CMAX:"<
            for(int k=1;k<=l_zadan;k++)

            {

              for(int l=1;l<=l_maszyn;l++)

              {

                 cout<
              }

              cout<
            }

            cout<
       }


       void is_best()

       {

            if (cmax
            {//aktualize cmax & save permutation

              cmaxbest=cmax;

              for (int i=1; i<=l_zadan; i++)

              {

                 for (int j=1; j<=l_maszyn; j++)

                 {

                    TabWag[i][j] = TabWagPrzeplyw[i][j];

                 }

              }

            }

      }

};


#endif

(Bcd8421) #3

Dzieki za pomoc. Teraz wszystko działa jak należy. deklaracje zmiennych mam w pliku z naglowkami. A funkcje permutacji musialem zmienic calkowicie, bo ta nie generowala wszystkich przypadkow. Pozdrawiam.