logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Błąd wczytywania pliku w C++ - problem z alokacją pamięci i pętlą `for`

Wawa_19_ 12 Sty 2008 20:08 1020 4
REKLAMA
  • #1 4686944
    Wawa_19_
    Poziom 14  
    Posty: 166
    Ocena: 6
    #include <stdio.h>
    #include <iostream.h>
    #include <stdlib.h>
    #include <string.h>
    
    main()
    {
    int i,j;
    int k=0;
    int w=0; //w - liczba wszystkich wezlow(wierzcholkow)
    int x=0;
    const int max_kol=9;
    const int max_sas=max_kol-1;
    FILE *plik;
    char znak,nazwa_pliku[20];
    struct Wierzcholek{
          int wezel;
          int sasiedzi[max_sas];  //czy trzeba zerami wypełnic kazdy wsk[i]???
          int liczba_sas;
          int kolor;
          } *wezel_pomoc;
    
    
    //lista kolorów wg malejacego ich priorytetu
    int *kolory=(int *)malloc((max_kol+1)* sizeof(int));
    for(i=1;i<=max_kol+1;i++);
    kolory[i]=i;
    
    
    //odczyt z pliku tabeli
    printf("Podaj nazwe pliku w ktorym miesci sie graf:\n");
    scanf("%s",&nazwa_pliku);
    plik = fopen(nazwa_pliku, "r");
    do
      {
      fscanf(plik,"%d%c",&i,&znak);
      w=w+1;
      }
    while((znak==' ')||(znak==','));
    rewind(plik);
    int tab[w][w];
    for(i=0;i<=w-1;i++)
      for(j=0;j<=w-1;j++)
        {
        fscanf(plik,"%d,",&tab[i][j]);
        }
    fclose(plik);
    
    
    //wypisanie tablicy sasiedztwa grafu
    printf("\n\nTABLICA SASIEDZTWA GRAFU:\n\n");
    for(i=0;i<=w-1;i++)
       {
       for(j=0;j<=w-1;j++)
          printf("%d \t",tab[i][j]);
       printf("\n");
       }
    
    
    // stworzenie tylu pól o nazwie KrawedzGrafu ile jest krawędzi
    struct Wierzcholek *wsk=(Wierzcholek *)malloc(w* sizeof(struct Wierzcholek));
    
    
    // przekazywanie informacji z tablicy do odpowiedniej struktury
    for(i=0;i<w;i++)
      {
      (wsk+i)->wezel=i+1;
      (wsk+i)->liczba_sas=0;  //pocz.deklaracja liczby sasiadow
      for(j=0;j<w;j++)
        if(tab[i][j]!=0)
          {
          (wsk+i)->sasiedzi[k]=j+1;
          (wsk+i)->liczba_sas=(wsk+i)->liczba_sas+1;
          k=k+1;
          }
        k=0;
      }
    
    
    // Sortowanie
    while(x<w)
    {
      for(i=x;i<w;i++)
        if((wsk+i)->liczba_sas>k)
          {
          k=(wsk+i)->liczba_sas;
          j=i;
          }
      k=0;
      wezel_pomoc->wezel=(wsk+x)->wezel;
      wezel_pomoc->liczba_sas=(wsk+x)->liczba_sas;
      for(i=0;i<max_sas;i++)
        wezel_pomoc->sasiedzi[i]=(wsk+x)->sasiedzi[i];
      (wsk+x)->wezel=(wsk+j)->wezel;
      (wsk+x)->liczba_sas=(wsk+j)->liczba_sas;
      for(i=0;i<max_sas;i++)
        (wsk+x)->sasiedzi[i]=(wsk+j)->sasiedzi[i];
      (wsk+j)->wezel=wezel_pomoc->wezel;
      (wsk+j)->liczba_sas=wezel_pomoc->liczba_sas;
      for(i=0;i<max_sas;i++)
        (wsk+j)->sasiedzi[i]=wezel_pomoc->sasiedzi[i];
      x=x+1;
    }
    
    
    // przypisywanie wezlom kolorów wg algorytmu LF
    while(x<w)
    {
      for(i=0;i<(wsk+x)->liczba_sas;i++)
        for(j=0;j<w;j++)
          {
          if((wsk+x)->sasiedzi[i]!=(wsk+j)->wezel)
          continue;
          else
          kolory[(wsk+j)->kolor]=0;
          }
        k=max_kol;
        for(i=1;i<max_kol;i++)
          if((kolory[i]<k)&&(kolory[i]!=0))
            k=kolory[i];
        (wsk+x)->kolor=k;
        for(i=1;i<=max_kol;i++)
          kolory[i]=i;
        x=x+1;
    }
    
    
    for(i=0;i<w;i++)
      printf("\n\n %d, %d, %d \n",(wsk+i)->wezel,(wsk+i)->liczba_sas,(wsk+i)->kolor);
    
    
    system("PAUSE");
    return 0;
    }


    Mam pytanie czy jak deklaruje strukturę i w niej jakąś zmienną np. tablicową to czy elementy domyslnie są w niej równe 0??? W trakcie programu po podaniu nazwy pliku pojawia się windosowskie okienko, że wystąpił problem z aplikacją... Obczaiłem dając instrukcję printf("caasdasdsd") że problem w tkwi we fragmencie kodu //SORTOWANIE Po prostu za tym fragmentem kodu napis się nie pojawiał a przed jak dałem printfa to się pojawił, więc cośtam jest nie tak tylko ciekawe co... Jeszcze dokładniej to instrukcje za k=0. Może przepisze ten fragment:
      wezel_pomoc->wezel=(wsk+x)->wezel;
      wezel_pomoc->liczba_sas=(wsk+x)->liczba_sas;
      for(i=0;i<max_sas;i++)
        wezel_pomoc->sasiedzi[i]=(wsk+x)->sasiedzi[i];
      (wsk+x)->wezel=(wsk+j)->wezel;
      (wsk+x)->liczba_sas=(wsk+j)->liczba_sas;
      for(i=0;i<max_sas;i++)
        (wsk+x)->sasiedzi[i]=(wsk+j)->sasiedzi[i];
      (wsk+j)->wezel=wezel_pomoc->wezel;
      (wsk+j)->liczba_sas=wezel_pomoc->liczba_sas;
      for(i=0;i<max_sas;i++)
        (wsk+j)->sasiedzi[i]=wezel_pomoc->sasiedzi[i];
      x=x+1;
    }
    


    Chcę aby (wsk+j) powędrował na miejsce (wsk+x) a (wsk+x) na miejsce (wsk+j).
  • REKLAMA
  • #2 4687143
    iwomirce
    Poziom 11  
    Posty: 6
    wiesz jest mała nie ścisłośc w twoim kodzie
    a mianowicie brak ścieżki do pliku którego podajesz nazwę
  • REKLAMA
  • #3 4687336
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Kolego Iwomirce co kolega ma na myśli ? Przypominam że zdania rozpoczynamy wielką literą i kończymy kropką, zachęcam też do używania przycisku "pisownia".

    Tablice nie są niczym domyślnie wypełniane, musisz zadbać o to sam. Niestety nie mam czasu wczytywać się w kod, a nie widzę błędu na pierwszy rzut oka - ale w tym wypadku polecam użycie debuggera i prześledzenie co dzieje się z programem.

    Pozdrawiam, Krzysztof.
  • REKLAMA
  • Pomocny post
    #4 4687650
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    No to chyba błąd w tym, że wezel_pomoc to tylko wskaźnik, któremu nigdzie nie przypisałeś pamięci (malloc) a odwołujesz się do jego skłądowych. W tym miejscu program się wywala.
  • #5 4688050
    Wawa_19_
    Poziom 14  
    Posty: 166
    Ocena: 6
    Aha rozumiem, czyli trzeba temu wskaźnikowi też mallokiem przypisać pamięć. Ano rzeczywiście. Dzięki za info. Poza tym wszystko działa przynajmniej do tego momentu bo dalej nie mogłem sprawdzić bo zawieszał sie.:)
REKLAMA