Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[c]tablica dynamiczna - bzdury w zawartości

hagop 10 Dec 2009 19:55 2475 3
  • #1
    hagop
    Level 15  
    Witam


    tworzę tablicę dynamiczna 1 wymiarową a później wywołuje funkcje która mi zwraca k. inkrementuję k-ty element tablicy rozkład. chcę teraz wyświetlić zawartość tablicy rozkład i qpa.... wywala multum 0 i wyskakuje błąd windows... co jest nie tak?

    Code:

    init(n, E, &total);

    int *rozklad;
    rozklad=(int *) malloc(total *sizeof(int));

    while(rep)
    {
    Gnf1(n,f,total, E, &k);
    rozklad[k]=rozklad[k]+1;
    rep--;
    };


    for (repr=1; total; repr++)
    {
         printf("%d ", rozklad[repr]);
    };



    i
  • #2
    mietekn
    Level 35  
    Po pierwsze dałeś bardzo mały wycinek kodu, nie widać np z niego co jest w zmiennej k.
    Pętla:
    Code:
    for (repr=1; total; repr++)
    nie ma końca i dla tego pewnie wywala błąd. Zamień ją np na:
    Code:
    for (repr=0; rep<total; repr++)
  • #3
    hagop
    Level 15  
    cały kod jest sporo zbędnych fragmentów dlatego go nie wkleiłem całego wczesniej. zmieniłem tak jak podałeś dziwne wartości się wyświetlaja(strasznie duże):

    Będe wykorzystywał funkcje init, Gnf1. Najpierw muszę zrobić rozkład ilości krawędzi w zależności od n i f, później ilość krawędzi w zależności od n przy stałym f i na odwrót.
    Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.h>

    #define nmax 14
    #define kmax nmax *(nmax-1)/2
    #define randomize() srand(unsigned(time(NULL)))
    #define random(a) rand()%a
    #define Random() (rand()%10000)*0.0001


    enum Boolean {falsz=0, prawda=1};

    typedef struct
            {
            int a, b;
            enum Boolean code;
            }r;
    typedef r t1[kmax];     // E
    typedef int t[nmax];

    void Gnf1(int n, int f, int total, t1 E, int *k) ;
    void drukE(int total, t1 E);
    void drukE1(int total, t1 E);
    void init(int n, t1 E, int * total);
    void drukc(int n, t c);

    int main()
    {
    int n, f, total, rep,k,repx,repr;
    t1 E;
    int *rozklad;

    //randomize();

    printf("Podaj n: ");
    scanf("%d",&n);
    printf("\nPodaj  f:" );
    scanf("%d",&f);
    printf("\nPodaj  rep:" );
    scanf("%d",&rep);
    printf("n=%d f=%d\n",n,f);
    init(n, E, &total);
    printf("Ilosc krawedzi: %d\n",total);
    rozklad=(int *) malloc(total *sizeof(int));
    if (rozklad == NULL) printf("cos nie tak");

    while(rep)
    {
    Gnf1(n,f,total, E, &k);
    rozklad[k]=rozklad[k]+1;
    rep--;
    };
    //drukE1(total,E);
    //printf("\n%d\n", k);
    for (repr=1; repr<total; repr++)
    {
         printf("%d ", rozklad[repr]);
    };
      system("PAUSE");   
      return 0;
    }

    void drukE(int total, t1 E)  // dla Gnf
    {
    int h,l;
        printf("\nE:");
        h=0;
        for(l=1;l<=total;l++)
            {
            printf("%4d%2d",E[l].a,E[l].b);
            h++;
            if(h%10==0)
                printf("\n");
            }
        printf("\n");
    } //drukE1


    void drukE1(int total, t1 E)  // dla Gnf
    {
    int h,l;
    char x;
        printf("\nE:");
        h=0;
        for(l=1;l<=total;l++)
            {
            if (E[l].code)
                x='T';
            else x='N';
            printf("%4d%2d%c",E[l].a,E[l].b,x);
            h++;
            if(h%10==0)
                printf("\n");
            }
        printf("\n");
    } //drukE1

    void init(int n, t1 E, int * total)
    {
    int i,j,h;
        h=0;
        for(i=1;i<=n-1; i++)
            for(j=i+1; j<=n;j++)
                {
                 h++;
                 E[h].a=i;
                 E[h].b=j;
                }
        *total=h;
    } //init


    void Gnf1(int n, int f, int total, t1 E, int *k) //EM f-graf
    /* generacja grafu losowego o stopniu wierzcholkow nie wiekszym od f
       EM oznacza Edge Maximal, czyli o najwiekszej mozliwej liczbie krawedzi*/
    {
    int i,h,l,z,los;
    r x;
    t c;
       for(i=1;i<=n;i++)
              c[i]=0;            // aktualny ciag stopni wierzcholkow
       for(i=1;i<=total;i++)
              E[i].code=falsz;  //przygotowanie pola code w E
       h=0; //licznik krawedzi
       for(l=total;l>=1;l--) //ostatni indeks roboczej czesci E
          {
          z=random(l)+1;   // losuj indeks z roboczej czesci E
          los=random(1000);
          if (los>=500)
          {
                       if((c[E[z].a]<f)&&(c[E[z].b]<f)) //krawedz (a,b)
                                {
                                   E[z].code=prawda;
                                   h++;
                                   c[E[z].a]++;
                                   c[E[z].b]++;
                                };   //zamien wylosowany element E z ostatnim z czesci roboczej
             };
          x=E[z];
          E[z]=E[l];
          E[l]=x;
    //      printf("l= %d, z= %d",l,z);
    //      drukE1(total, E);
    //      drukc(n, c);
         }
       *k=h;
       printf("\n%d\n",*k);
    } //Gnf1


    void drukc(int n, t c)
    {
    int i;
        printf("c:");
        for(i=1;i<=n;i++)
            printf("%3d",c[i]);
        printf("\n");
    } //drukc


    Dodano po 33 [minuty]:

    ok udało się wystarczyło wyzerować tablice po jej inicjalizacji

    Code:

    for (repr=0; repr<total; repr++)
    {
         rozklad[repr]=0;
    };
  • #4
    x3r
    Level 18  
    Zamiast robić to w pętli możesz użyć memset-a:

    Code:

    memset(rozklad, 0, total*sizeof(int));


    pozdrawiam