Problem z dynamiczną tablicą dwuwymiarową

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

0

macierz[j][i]

0

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

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ć?

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.

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;
}

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

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