Problem z dynamiczną tablicą dwuwymiarową

2011-05-30 23:19

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Mam tutaj taki kawałek kodu

#include <cstdlib>
#include <iostream>

using namespace std;

int generuj(int il_wierz, int stopien)
{

  int n, b, ost, procent, i, j, ilosc;
  bool start;
  n= il_wierz;
  procent=(n*(n-1))/  2;
  b=procent*stopien / 100;

  int **macierz = new int *[n];
  for (int i=0;i<n-1;i++){
      macierz[i]= new int [n];
  }
  for ( i=0;i<n-1;i++){
  for ( j=0;j<n-1;j++){
      macierz[i,j]=0;
  }
  }

   ilosc=0;
   ost=0;
   i=0;

  while (i<n-1){
     j=ost+1;
     macierz[ost,j]=1;
     ost=j;
     i=i++;  
  }
  macierz[ost,0]=1;

  for (i=0;i<n-1;i++){
  for (j=0;j<n-1;j++){
      if (macierz[i,j]==1) {
          macierz[j,i]=1;
      }
  }
  }         
  srand(time(0));
  start=true;
  while (ilosc<=(b-1)){
        if (start==true){
           i=0;
           start=false;
           }
  }
  j=rand()%n;
  while (j=i) {
        j=rand()%n;
  if (macierz[i,j]=0){
     macierz[i,j]=1;
     macierz[j,i]=1;
     ilosc=ilosc+1;
     i=j;
  }
  }

  if (macierz[i,0]=0) {
     macierz[i,0]=1;
     macierz[0,i]=1;
     ilosc=ilosc+1;
     start=true;
  }
     else
         start=false;
     while (start==false){
           j=rand()%n;
           while(j==i, j==0){
            j=rand()%n;
            if (macierz[0,j]==0, macierz[i,j]==0){
               macierz[j,0]=1;
               macierz[0,j]=1;
               ilosc=ilosc+1;
               macierz[i,j]=1;
               macierz[j,i]=1;
               ilosc=ilosc+1;
               start=true;
     }
         }
          }    
}

int main(){
    generuj(100,40);       

    system("PAUSE");
    return EXIT_SUCCESS;
}

Dlaczego gdziekolwiek gdzie chce przypisać do tablicy macierz(x,y)=1
to wyskakuje błąd konwersji invalid conversion from int to int.
Jeśli chce przypisać 0 to jest ok no ale tak być nie może.
Moim zdaniem gdzieś zrobiłem błąd w deklaracji tablicy

edytowany 1x, ostatnio: madmike, 2011-05-30 23:37

Pozostało 580 znaków

2011-05-30 23:29

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

0

macierz[j][i]


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

2011-05-30 23:36

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Dziex, ale ze mnie osioł, pozostałości po delphi.

Chrzani waść, w delphi jak robiłeś Array of Array to też trzeba dawać [i][j] a tu właśnie to robisz. - _13th_Dragon 2011-05-31 00:13
nie, nie trzeba dawać, w Delphi ZAWSZE [i][j] jest równoważne [i,j] - Azarien 2011-05-31 10:05
To tylko teoria, w delphi 5 miałem dziwne jazdy albo wstawiam [][] albo wyłączam optymalizacje - działa, w pozostałych przypadkach nie działa. - _13th_Dragon 2011-05-31 10:14
widocznie trafiłeś na buga albo miałeś coś nie tak z przydziałem pamięci - Azarien 2011-05-31 10:19
Co co ale na punkcie przydzielania/zwalniania pamięci mam hopla więc ostatnie jest wykluczone. - _13th_Dragon 2011-05-31 10:22

Pozostało 580 znaków

2011-05-31 10:19

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int generuj(int il_wierz, int stopien)
{

  int n, b, ost, procent, i, j, ilosc;
  bool start;

  //tworzenie tablicy dynamicznej
  int **macierz = new int *[n];
  for (int i=0; i<n-1; i++){
      macierz[i]= new int [n];
  }
  //zerowanie grafu
  for ( i=0; i<n-1; i++){
  for ( j=0; j<n-1; j++){
      macierz[i][j]=0;
  }
  }

  n= il_wierz;
  procent=(n*(n-1))/  2;
  b=procent*stopien / 100;
  ilosc=0;
  ost=0;
  i=0;

  //utworz graf (od pierwszego do ostatniego i z powrotem do pierwszego)
  while (i<n-1){
     j=ost+1;
     macierz[ost][j]=1;
     ost=j;
     i=i++;  
  }
  macierz[ost][0]=1;

  //uzupełnienie tablicy o zwrotne krawędzie
  for (i=0; i<=n-1; i++){
  for (j=0; j<=n-1; j++){
      if (macierz[i][j]==1) {
          macierz[j][i]=1;
      }
  }
  }

  i=0;
  j=0;
  ilosc=n;

  //dodawanie klejnych krawędzi aby wypełnić graf    
  srand(time(0));
  start=true;
  while (ilosc <= (b-1)){
        if (start == true){
           i=0;
           start=false;
        }

  j = rand()%n;
  while (j == i) {
        j=rand()%n;
        if (macierz[i][j] == 0){
        macierz[i][j]=1;
        macierz[j][i]=1;
        ilosc = ilosc+1;
        i=j;
        }
  }
  }

  //uzupełnienie końcowej krawędzi
  if (macierz[i][0] == 0) {
     macierz[i][0]=1;
     macierz[0][i]=1;
     ilosc = ilosc+1;
     start = true;
  }
     else
         start = false;
     while (start == true){
           j = rand()%n;
           while(j==i, j==0){
               j = rand()%n;
               if (macierz[0][j]==0, macierz[i][j]==0){
                  macierz[j][0]=1;
                  macierz[0][j]=1;
                  ilosc = ilosc+1;
                  macierz[i][j]=1;
                  macierz[j][i]=1;
                  ilosc = ilosc+1;
                  start = true;

               }
           }
     }

  //zwolnienie pamięci  
  for(i=0;i<n;i++){
      delete[]macierz[i];
      delete[]macierz;
  }

  //utworzenie pliku          
  bool good;
  bool is_open;       
  fstream plik;
  plik.open("plik.txt",ios::out|ios::binary);
  if(plik.good()==true){
     std::cout<<"uzyskano dostep do pliku"<<std::endl;
  }
    else
        std::cout<<"dostep do pliku jest zabroniony"<<std::endl;

}

int main(){
    generuj(700,40);   

    system("PAUSE");
    return EXIT_SUCCESS;
}

No i teraz kolejny problem. Dodałem zapisywanie do pliku ale do tego nawet nie dochodzi. Po uruchomieniu wyświetla się windows'owe okno "Wystąpił problem z aplikacją Project1.exe".

teraz może być?

edytowany 4x, ostatnio: daniel285, 2011-05-31 12:31

Pozostało 580 znaków

2011-05-31 10:59

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Ok, czyli co trzeba poprawić??
Ja ten program wcześniej napisałem w delphi i tam wszystko śmiga. Więc problem raczej na pewno leży po stronie technicznej.

edytowany 2x, ostatnio: daniel285, 2011-05-31 18:21
Ja bym zaczął od formatowania kodu, bo w takiej postaci mi nawet się nie chce tego analizować. - _13th_Dragon 2011-05-31 11:14

Pozostało 580 znaków

2011-05-31 18:21

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int generuj(int il_wierz, int stopien)
{

  int n, b, ost, procent, i, j, ilosc;
  bool start;
  n = il_wierz;
  //tworzenie tablicy dynamicznej
  int **macierz = new int *[n];
  for (int i=0; i < n-1; i++){
      macierz[i] = new int [n];
  }
  //zerowanie grafu
  for ( i = 0; i < n-1; i++){
  for ( j = 0; j < n-1; j++){
      macierz[i][j] = 0;
  }
  }

  procent = (n*(n-1)) /  2;
  b = procent * stopien / 100;
  ilosc = 0;
  ost = 0;
  i = 0;

  //utworz graf (od pierwszego do ostatniego i z powrotem do pierwszego)
  while (i < n-1){
     j = ost+1;
     macierz[ost][j] = 1;
     ost = j;
     i = i++;  
  }
  macierz[ost][0] = 1;

  //uzupełnienie tablicy o zwrotne krawędzie
  for (i = 0; i < n-1; i++){
  for (j = 0; j < n-1; j++){
      if (macierz[i][j] == 1) {
          macierz[j][i] = 1;
      }
  }
  }

  i = 0;
  j = 0;
  ilosc = n;

  //dodawanie klejnych krawędzi aby wypełnić graf    
  srand(time(0));
  start = true;
  while (ilosc <= b-1){
        if (start == true){
           i = 0;
           start = false;
        }

  j = rand()%n;
  while (j == i) {
        j = rand()%n;
        if (macierz[i][j] == 0){
        macierz[i][j] = 1;
        macierz[j][i] = 1;
        ilosc = ilosc+1;
        i = j;
        }
  }
  }

  //uzupełnienie końcowej krawędzi
  if (macierz[i][0] == 0) {
     macierz[i][0] = 1;
     macierz[0][i] = 1;
     ilosc = ilosc+1;
     start = true;
  }
     else
         start = false;
     while (not start){
           j = rand()%n;
           while(j == i, j == 0){
               j = rand()%n;
               if (macierz[0][j] == 0, macierz[i][j] == 0){
                  macierz[j][0] = 1;
                  macierz[0][j] = 1;
                  ilosc = ilosc+1;
                  macierz[i][j] = 1;
                  macierz[j][i] = 1;
                  ilosc = ilosc + 1;
                  start = true;

               }
           }
     }

  //zwolnienie pamięci  
  for(i = 0; i < n; i++){
      delete[]macierz[i];
      delete[]macierz;
  }

  //utworzenie pliku          
  bool good;
  bool is_open;       
  fstream plik;
  plik.open("plik.txt", ios::out | ios::binary);
  if(plik.good() == true){
     std::cout<<"uzyskano dostep do pliku"<<std::endl;
  }
    else
        std::cout<<"dostep do pliku jest zabroniony"<<std::endl;

}

int main(){
    generuj(700,40);   

    system("PAUSE");
    return EXIT_SUCCESS;
}

Pozostało 580 znaków

2011-05-31 22:05

Rejestracja: 8 lat temu

Ostatnio: 3 dni temu

0

Tak na pierwszy rzut oka:

 int generuj(int il_wierz, int stopien) 

ta funkcja nic nie zwraca

 while (not start){

chyba chodziło o while(!start)

 for(i = 0; i < n; i++){
      delete[]macierz[i];
      delete[]macierz;
  }

delete []macierz za pętlę dać

 for (int i=0; i < n-1; i++){
      macierz[i] = new int [n];
  }

jeśli to ma być macierz kwadratowa to pętla ma wyglądać: for (int i=0; i < n; i++)

 if(plik.good() == true)

wystarczy samo if(plik.good())

i do srand(time(0)); chyba trzeba zaincludować time.h

Pozostało 580 znaków

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