Problem z Pamięcią

0

Witam,

Problem jest taki że gdy odkomentuje linijkę :
d->tablicaSplotowa = (float *) calloc(3, sizeof(float)); to zachowuję się jakby mi nadpisywała tablice tab.

spotkał się ktoś kiedyś z takim problemem??

 
#include <stdio.h>
#include <stdlib.h>    // malloc, free


struct Dane {

float k1, k2, k3;
int wielkoscTablicy; //liczba elementow tablicy z którą dokonamy splotu z zmiennymi k1,k2,k3
int *tab; // tablica zawierajaca wartosci podane przez uzytkownika
float *tablicaSplotowa;
};

void wypelnijTablice(struct Dane *d); //funkcja sluzy do wypelnienia tablicy danymi pobranymi przez uzytkownika
void wypiszTablice(struct Dane d); //wypisuje tablice z danymi podanymi przez uzytkownika
void dokonajSplotu(struct Dane *d)
{
int i; // iterator petli
float tmp; // wartosc tymczasowa
float sumaWag = (d->k1 + d->k2 + d->k3);

    d->tablicaSplotowa = (float *) calloc(3, sizeof(float));
    if( d->tablicaSplotowa == NULL) printf("nie udalo sie przydzielic pamieci");
    printf(" tab[0] = %d  tab[1] = %d tab[2] = %d  tab[3] = %d \n ", d->tab[0], d->tab[1], d->tab[2], d->tab[3]);
    /*
    for(i = 1; i < d->wielkoscTablicy - 1; ++i)
    {
        tmp = ((d->tab[i-1] * (d->k1)) + (d->tab[i] * d->k2) + (d->tab[i+1] * (d->k3)) / sumaWag);
        d->tablicaSplotowa[i-1] = ((d->tab[i-1] * (d->k1)) + (d->tab[i] * d->k2) + (d->tab[i+1] * (d->k3)) / sumaWag);
        //printf(" tmp = %f \n ", tmp);
        printf(" tab[-1] = %d  tab[0] = %d tab[1] = %d \n ", d->tab[i-1], d->tab[i], d->tab[i+1]);
    }
    */
}

void wypiszTabliceSplotowa(struct Dane d)
{
int i;
    for(i = 0; i < d.wielkoscTablicy - 2; ++i)
        printf("%f ", d.tablicaSplotowa[i]);
}

int main()
{
struct Dane dane;
    printf("Podaj liczbe elementow : ");
    scanf("%d", &dane.wielkoscTablicy);
    printf("Podaj elementy k1, k2, k3 \n");
    scanf("%f %f %f", &dane.k1, &dane.k2, &dane.k3);
    wypelnijTablice(&dane);
    wypiszTablice(dane);
    dokonajSplotu(&dane);
    wypiszTabliceSplotowa(dane);

  return 0;
}

void wypelnijTablice(struct Dane *d)
{
int i; // iterator petli for
int elementTablicy;
    d->tab = (int *)malloc(sizeof(d->wielkoscTablicy * sizeof(int))); //zamiast calloc , stworzyłem jeden wielka przestezen pamieci
    for(i = 0; i < d->wielkoscTablicy; ++i)
    {
        printf("\nPodaj %i element rablicy ", i);
        scanf("%d", &elementTablicy);
        *((d->tab) + i) = elementTablicy;
    }
}

void wypiszTablice(struct Dane d) //wypisuje tablice z danymi podanymi przez uzytkownika
{
int i;
    for(i = 0; i < d.wielkoscTablicy; ++i)
        printf("%d ", d.tab[i]);
}

0

Kiedyś wyzytalem, że nie można przy #incude dodawać komentarzy

0

Co debugger twierdzi na ten temat?

0

Nie bardzo ogarniam co ty tam robisz. tablicaSplotowa ma u ciebie 3 (!) elementy a iterujesz po niej tak:

i = 1; i < d->wielkoscTablicy - 1; ++i

A jak ją wypisujesz to tak:

i = 0; i < d.wielkoscTablicy - 2; ++i

A co jak wielkość tablicy będzie 100? ;]

0

jest 3 bo szukałem błędu w prgramie.

0

No błąd polega zapewne na tym że wyłazisz poza tablicę i maziasz nie tam gdzie trzeba ;]

0

program działa dobrze dopóki nie będe włącze funkcji calloc, a calloc tylko przydziela miejsce na stercie, więc nie powinno naruszać miejsca tablicy tab

0
gswidwa napisał(a):

Kiedyś wyzytalem, że nie można przy #incude dodawać komentarzy

kiedyś wyczytałem, że przed #include nie może być spacji, czyli zamiast takiego wcinania

#ifdef cośtam
    #define cośinnego
#endif

należy wcinać

#ifdef cośtam
#    define cośinnego
#endif

standard swoje a kompilatory swoje: oba zapisy działają wszędzie.

0

Ech jestem ślepy. Błąd jest tu:

malloc(sizeof(d->wielkoscTablicy * sizeof(int)))

Robisz malloca na 4 bajty. Brawo.

2
Azarien napisał(a):
gswidwa napisał(a):

Kiedyś wyzytalem, że nie można przy #incude dodawać komentarzy

kiedyś wyczytałem, że przed #include nie może być spacji, czyli zamiast takiego wcinania

#ifdef cośtam
    #define cośinnego
#endif

należy wcinać

#ifdef cośtam
#    define cośinnego
#endif

standard swoje a kompilatory swoje: oba zapisy działają wszędzie.

Opisujecie stan sprzed 14 lat i wprowadzacie ludzi w błąd. Wszystko to jest jasno opisane w standardzie: 5.1.1.2 punkt 3 oraz 6.10.2 (C11), kompilator który to akceptuje jest zgodny ze standardem a nie "robi po swojemu".

O tych wcięciach to już Ci nawet pisałem kiedyś

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