Pamiec dynamiczna i struktura

0

Dlaczego mi to nie działa ?

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


struct glosy
{
   char rodzajgminy[5];
   int liczbamieszkacow;
   float procentpartia1;
   float procentpartia2;
};

void wczytajtab(int i, int n,float *x)
{
    printf("\t%d glosowanie\n",i);
    printf("Podaj rodzaj gminy \n");
    scanf("%4s", x->rodzajgminy[5]);
    printf("Podaj ilosc mieszkancow\n");
    scanf("%d", x->liczbamieszkacow);
    printf("Podaj procent glosow na parite1 \n");
    scanf("%f", x->procentpartia1);
    printf("Podaj procent glosow na parite2 \n");
    scanf("%f", x->procentpartia1);
}

int main()
{
  int b;
    int i=1;
    struct glosy *x;

    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",b);
    if(b==1){
    x = (struct glosy*) malloc(sizeof (struct glosy));
    wczytajtab(i,n,x);
    i=i+1;
    *x++;
    }

    do{
    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",b);
    x = (struct glosy*) realloc(x,sizeof (struct glosy) * i);
    wczytajtab(i,n,x);
    i=i+1;
    *x++;
    }while(b!=1);

    free(x);
    return 0;
}
 
1

A czemu argumentem wczytajTab() jest float* a nie struct glosy* ? o_O

1

Jak wyżej, oraz:

    scanf("%4s", x->rodzajgminy);
    scanf("%d", &(x->liczbamieszkacow)); // wszystkie z tym ampersandem
0

xD jeszcze sie zastanawiam xD hehe

Shalom napisał(a):

A czemu argumentem wczytajTab() jest float* a nie struct glosy* ? o_O

No dobra troche pozmieniałem i jeszcze usunąłem "n" bo nie wiem co tam robiło ; d no i jak uruchamiam program to wciskam 1 albo cokolwiek i sie program wysypuje

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


struct glosy
{
   char rodzajgminy[5];
   int liczbamieszkacow;
   float procentpartia1;
   float procentpartia2;
};

void wczytajtab(int i,struct glosy* x)
{
    printf("\t%d glosowanie\n",i);
    printf("Podaj rodzaj gminy \n");
    scanf("%4s", x->rodzajgminy);
    printf("Podaj ilosc mieszkancow\n");
    scanf("%d", &(x->liczbamieszkacow));
    printf("Podaj procent glosow na parite1 \n");
    scanf("%f", &(x->procentpartia1));
    printf("Podaj procent glosow na parite2 \n");
    scanf("%f", &(x->procentpartia1));
}

int main()
{
  int b;
    int i=1;
    struct glosy *x;

    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",b);
    if(b==1){
    x = (struct glosy*) malloc(sizeof (struct glosy));
    wczytajtab(i,x);
    i=i+1;
    *x++;
    }

    do{
    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",b);
    x = (struct glosy*) realloc(x,sizeof (struct glosy) * i);
    wczytajtab(i,x);
    i=i+1;
    *x++;
    }while(b!=1);

    free(x);
    return 0;
}
0

pozmieniałem troche :) już się pierwsze wczytanie tej tablicy odobywa ale gdy robie by wczytało drugie elementy to wyskakuje błąd

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


struct glosy
{
   char rodzajgminy[5];
   int liczbamieszkacow;
   float procentpartia1;
   float procentpartia2;
};

void wczytajtab(int i,struct glosy* x)
{
    printf("\t%d glosowanie\n",i);
    printf("Podaj rodzaj gminy \n");
    scanf("%4s", &(x->rodzajgminy));
    printf("Podaj ilosc mieszkancow\n");
    scanf("%d", &(x->liczbamieszkacow));
    printf("Podaj procent glosow na parite1 \n");
    scanf("%f", &(x->procentpartia1));
    printf("Podaj procent glosow na parite2 \n");
    scanf("%f", &(x->procentpartia1));
}

int main()
{
  int b;
    int i=1;
    struct glosy *x;
    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",&b);
    if(b==1){
    x = (struct glosy*) malloc(sizeof (struct glosy));
    wczytajtab(i,x);
    i=i+1;
    *x++;
    }


    do{
    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",&b);
    if(b==1){
    x = (struct glosy*) realloc(x,sizeof (struct glosy) * i);
    wczytajtab(i,x);
    i=i+1;
    *x++;
    }
    }while(b!=1);

    free(x);
    return 0;
}
0

Kod jest tragiczny. Kupa jakichś instrukcji z d**y jak to x++
Błąd leci bo nie ustawiłeś na początku wskaźnika x na nulla i jeśli ominiesz pierwszego malloca to masz w x jakąś wartość z d**y a próbujesz na nim wołać realloc, czego ci robić nie wolno.

0

Może wyjaśnij co próbujesz osiągnąć. Bo to co napisał o tym kodzie @Shalom to jest miękko powiedziane :)

0

faktycznie to *x++ dziwne dla mnie było, usunąłem to i w funkcji wczytującej tablice wstawiłem taką łamigłówkę

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


struct glosy
{
   char rodzajgminy[5];
   int liczbamieszkacow;
   float procentpartia1;
   float procentpartia2;
};

void wczytajtab(int i,struct glosy* x)
{
    struct glosy *n = x;
    n=n+sizeof(struct glosy)*i;
    printf("\t%d glosowanie\n",i);
    printf("Podaj rodzaj gminy \n");
    scanf("%4s", &(n->rodzajgminy));
    printf("Podaj ilosc mieszkancow\n");
    scanf("%d", &(n->liczbamieszkacow));
    printf("Podaj procent glosow na parite1 \n");
    scanf("%f", &(n->procentpartia1));
    printf("Podaj procent glosow na parite2 \n");
    scanf("%f", &(n->procentpartia1));
}

int main()
{
  int b;
    int i=1;
    struct glosy *x =NULL;
    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",&b);
    if(b==1){
    x = (struct glosy*) malloc(sizeof (struct glosy));
    wczytajtab(i,x);
    i=i+1;
    }


    do{
    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",&b);
    if(b==1){
    x = (struct glosy*) realloc(x,sizeof (struct glosy) * i);
    wczytajtab(i,x);
    i=i+1;
    }
    }while(b==1);

a co do samego osiągnięcia to chodzi mi o to ze jeżeli przyjdzie jakiś gościu do komputera kliknie ze chce oddać głos to oddaje klika 1 i pamięć się zwieksza na kolejny głos i ten gościu oddaje głos ;D

0

Ale po co jest cała ta kopia kodu przed while? Przecież to nie ma sensu. Wywal to i nadal będzie działać. Zostaw tylko to nullowanie wskaźnika i i=1

0

to można realloc dać bez malloca ? i chyba i musze dać = 0 bo mi wtedy ta moja łamigłówka źle będzie przypisywać, a nie bo wtedy realloc będzie źle działał :) to jednak dam i=1 a w funkcji dam

 n=n+sizeof(struct glosy)*(i-1);
0
#include <stdio.h>
 
struct glosy
 {
  char rodzajgminy[5];
  int liczbamieszkacow;
  float procentpartia1,procentpartia2;
  };
 
void wczytajtab(int i,struct glosy *x)
  {
   printf("\t%d glosowanie\n",i+1);
   printf("Podaj rodzaj gminy: ");
   scanf("%4s",x[i].rodzajgminy);
   printf("Podaj ilosc mieszkancow: ");
   scanf("%d", &x[i].liczbamieszkacow);
   printf("Podaj procent glosow na parite1: ");
   scanf("%f", &x[i].procentpartia1);
   printf("Podaj procent glosow na parite2: ");
   scanf("%f", &x[i].procentpartia1);
  }
 
int more()
  {
   int b;
   printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc: ");
   scanf("%d",&b);
   return b==1;
  }

int main()
  {
   int i=0;
   struct glosy *x=NULL;
   while(more())
     {
      x=(struct glosy*)realloc(x,(i+1)*sizeof(struct glosy));
      wczytajtab(i++,x);
     }
   free(x);
   return 0;
  }
0

a ja to zrobiłem tak : i też działa :)) dziękuje za pomoc :)

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


struct glosy
{
   char rodzajgminy[5];
   int liczbamieszkacow;
   float procentpartia1;
   float procentpartia2;
};

void wczytajtab(int i,struct glosy* x)
{
    struct glosy *n = x;
    n=n+sizeof(struct glosy)*(i-1);
    printf("\t%d glosowanie\n",i);
    printf("Podaj rodzaj gminy \n");
    scanf("%4s", &(n->rodzajgminy));
    printf("Podaj ilosc mieszkancow\n");
    scanf("%d", &(n->liczbamieszkacow));
    printf("Podaj procent glosow na parite1 \n");
    scanf("%f", &(n->procentpartia1));
    printf("Podaj procent glosow na parite2 \n");
    scanf("%f", &(n->procentpartia2));
}

int main()
{
  int b;
    int i=1;
    struct glosy *x =NULL;
   /* printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",&b);
    if(b==1){
    x = (struct glosy*) malloc(sizeof (struct glosy));
    wczytajtab(i,x);
    i=i+1;
    }
*/

    do{
    printf("Nacisnij 1 jesli chcesz oddac glos, Nacisnij cokolwiek zeby wyjsc\n");
    scanf("%d",&b);
    if(b==1){
    x = (struct glosy*) realloc(x,sizeof (struct glosy) * i);
    wczytajtab(i,x);
    i=i+1;
    }
    }while(b==1);



        struct glosy *n = x;
    int k;
    for(k=0;k<i-1;++k) //bo int i=1 czyli zaczelismy liczyc od 1
    {
        printf("%4s\n",n->rodzajgminy);
        printf("%d\n",n->liczbamieszkacow);
        printf("%.2f\n",n->procentpartia1);
        printf("%.2f\n",n->procentpartia2);
        n=n+sizeof(struct glosy)*(k+1);
    }


    free(x);
    return 0;
}
 
0

Pewny jesteś? Bo przecież arytmetyka wskaźników działa normalnie, tzn nie musisz przesuwać sie o X bajtów. Jak masz wskaźnik na strukturę to ++ na tym wskaźniku przesuwa go automatycznie o sizeof(struktura) bajtów. Powinieneś tam mieć po prostu n++.

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