Laboratorija za računarsku tehniku

Softverske teme => Programiranja => C => Temu započeo: pseudobluz 02.12.2009, 14:11

Naslov: Problem sa listom
Poruka od: pseudobluz 02.12.2009, 14:11
Ovako, imam jednu funkciju koja odredjene elemente iz jedne liste struktura kopira redom u novoformiranu listu struktura drugog tipa.
Fakticki, tada dobijem niz kao listu. Sada moram nad vrednostima te liste da izvrsim odredjene operacije.
Prvi element (kn-najvise pozicija) mora da ostane nepromenjen. Pocevsi od drugog (npr. kn-1) vrsi se operacija oblika:
bn-2=x*bn-1+an-1,...,b0=x*b1+a1. Dakle, an mora da ostane isti, a svi nizi od njega se menaju po datoj formuli. X je argument funkcije.

Evo, kako sam ja to probao da uradim:



struct niz
{
int indeks;
double koef;
struct niz *pok;
};



struct niz *amnoz(struct niz *a,int m, int n)
{
struct niz *prvi=a;
struct niz *current=a->pok;
    struct niz *newList = NULL;
    struct niz *tail = NULL;
    while (current != NULL )
{



if (newList == NULL) {
        newList = (struct niz*) malloc(sizeof(struct niz));
        newList->koef = current->koef+(m*prvi->koef);
        newList->indeks=n;
        newList->pok=NULL;
        tail = newList;

n--;
}
else {

tail->pok =(struct niz*) malloc(sizeof(struct niz));
    tail = tail->pok;
    tail->koef = current->koef+m*prvi->koef;
prvi=prvi->pok;
    tail->indeks = n;
    tail->pok = NULL;
prvi->pok = NULL;
}
current = current->pok;
}
return(newList);
}


Problem na koji nailazim je sto izmena krece od prvog cvora i sve vreme funkcija sabira sve vrednosti niza argumenta samo za x*an tj. samo sa pomnozenim najvisim clanom, umesto redom sa svakim.
Moje pitanje je: Kako da izmenim gornju funkciju obavlja operaciju nad svim susednim elementima redom? Da li mora da se uvede jos jedan pokaziva? To bi mi predstavljalo problem, jer se narusava postojece strukura. Ove brojeve sam vec provoako kroz nekoliko funkcija pre ove.
Unapred, hvala!
Naslov: Re: Problem sa listom
Poruka od: pseudobluz 19.12.2009, 12:38
Uspeo sam delimicno da resim problem.


struct niz *bform(struct niz *koef, int n, int a)
{
     int i=0;
struct niz *p=koef;
struct niz *temp1=p;
struct niz *proba=NULL;
struct niz *temp2=p->pok;
double b=temp1->koef;
insertn(proba,b);
for(i=1; i++; i=n-1)
{
temp1=temp1->pok;
temp2=temp2->pok;
b=a*temp1->koef+temp2->koef;
insertn(proba, b);
}
return(proba);
}


Komplajler se ne buni.
Dobijam runtime gresku sa kodom 0xC0000005: Access Violation na liniji: b=a*temp1->koef+temp2->koef;.
E sad, nasao sam da je ovo najverovatnije neki problem oko rezervisanje memorije i nepravilnog koriscenja pokizavaca.
Ima li neko iskustva sa ovom greskom? Ja vise ne znam sta da radim.
Naslov: Re: Problem sa listom
Poruka od: Zepi 20.12.2009, 23:53
Definitivno je problem sa memorijom a napravila ti ga je beskonacna for petlja,
pa si zauzeo sve što je moglo a pokušao i ono što ne može.

for(i=1; i++; i=n-1)

Prepravi to i ako ti je logika problema pravilno rešena (nisam imao vremena da proveravam)
trebalo bi da bude ok.

Naslov: Re: Problem sa listom
Poruka od: pseudobluz 21.12.2009, 10:54
Citat: Zepi  20.12.2009, 23:53
Definitivno je problem sa memorijom a napravila ti ga je beskonacna for petlja,
pa si zauzeo sve što je moglo a pokušao i ono što ne može.

for(i=1; i++; i=n-1)

Prepravi to i ako ti je logika problema pravilno rešena (nisam imao vremena da proveravam)
trebalo bi da bude ok.

Ok. Hvala na odgovoru.
Kako mislis beskonacna?
Broj n je ceo i on je argument funkcije koja se unosi u main() rutini, pa prema tome for petlja ide od 1 do celog broja n sa korakom 1.
Naslov: Re: Problem sa listom
Poruka od: maxogm 21.12.2009, 13:05
Ne znam kako je u C++ u ali ovako veoma moguce da nije


for(i=1; i++; i=n-1)


mozda si hteo ovo da napises


for(i=1; i<= n-1; i++)

Naslov: Re: Problem sa listom
Poruka od: pseudobluz 21.12.2009, 13:22
Citat: maxo  21.12.2009, 13:05
Ne znam kako je u C++ u ali ovako veoma moguce da nije


for(i=1; i++; i=n-1)


mozda si hteo ovo da napises


for(i=1; i<= n-1; i++)


Upravo sam probao i to. Opet se javlja identicna greska.
Naslov: Re: Problem sa listom
Poruka od: maxogm 21.12.2009, 22:03
Da li si probao sa nekim primerom da prodjes kroz debug, pa da vidis na sta se inicijalizuju tvoje promenljive i koje vrednosti posle dobijaju.
Naslov: Re: Problem sa listom
Poruka od: pseudobluz 22.12.2009, 00:05
Jesam. To sam uradio odmah kada se javio problem. Posle prvo prolaza petlje program jednostavno stane, iako nije prekoracio rezervisanu memoriju.

Nego nesto sada razmislja. Moze li ovaj problem da se javi jer sam koristio 32-bitni kompajler na 64-bitnoj masini?
Mozda je glupo pitanje, ali stvarno ne znam vise.
Naslov: Re: Problem sa listom
Poruka od: Marko Аcović 22.12.2009, 01:03
Postuj ceo source kod na forum pa da probamo, da vidimo da li ce da izbaci istu gresku.
Naslov: Re: Problem sa listom
Poruka od: pseudobluz 22.12.2009, 11:41

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

struct pnode
   {
      int exp;
      double coeff;
      struct pnode *link;
   };
struct niz
{

double koef;
struct niz *pok;
};

struct pnode *insert(struct pnode *, int,double);
void printlist ( struct pnode * );

struct pnode *sortlist(struct pnode *);

/* Funkcija koja kreira polinom preko liste */
struct pnode *insert(struct pnode *p, int e,double c)
{
   struct pnode *temp;
   if(p==NULL)
   {
      p=(struct pnode *)malloc(sizeof(struct pnode));
      if(p==NULL)
      {
         printf(" Greska\n ");
         exit(0);
      }
      p-> exp = e;
      p->coeff = c;
      p-> link = NULL;
   }
   else
   {
      temp = p;
      while (temp-> link!= NULL)
      temp = temp-> link;
      temp-> link = (struct pnode *)malloc(sizeof(struct pnode));
      if(temp -> link == NULL)
      {
   printf(" Greska\n ");
         exit(0);
      }
    temp = temp-> link;
      temp-> exp = e;
      temp->coeff = c;
      temp-> link = NULL;
   }
   return (p);
}


/*nova insert funkcija za listu sa strukturom niz*/
struct niz *insertn(struct niz *p, double c)
{
   struct niz *temp;
   if(p==NULL)
   {
      p=(struct niz *)malloc(sizeof(struct niz));
      if(p==NULL)
      {
         printf(" Greska\n ");
         exit(0);
      }
     
      p->koef = c;
      p-> pok = NULL;
   }
   else
   {
      temp = p;
      while (temp-> pok!= NULL)
      temp = temp-> pok;
      temp-> pok = (struct niz *)malloc(sizeof(struct niz));
      if(temp -> pok == NULL)
      {
   printf(" Greska\n ");
         exit(0);
      }
    temp = temp-> pok;
     
      temp->koef = c;
      temp-> pok = NULL;
   }
   return (p);
}


/*funkcija koja formira niza an*/
struct niz *kopiranje(struct pnode *p, struct niz *b)
{
struct pnode *current = p;
    struct niz *newList = NULL;
    struct niz *tail = NULL;
    while (current != NULL) {

if (newList == NULL) {
        newList = (struct niz*) malloc(sizeof(struct niz));
        newList->koef = current->coeff;
       
        newList->pok=NULL;
        tail = newList;
}
else {

tail->pok =(struct niz*) malloc(sizeof(struct niz));
    tail = tail->pok;
    tail->koef = current->coeff;
   
    tail->pok = NULL;
}
current = current->link;
}
return(newList);
}

/*struct niz *bform(struct niz *koef, int n, int a)
{
     int i=0;
struct niz *p=koef;
struct niz *temp1=p;
struct niz *temp2=p->pok;
double b=temp1->koef;
koef=insertn(koef,b);
for(i=1; i++; i=n-1)
{
temp1=temp1->pok;
temp2=temp2->pok;
b=a*temp1->koef+temp2->koef;
koef=insertn(koef, b);
}
return(koef);
}*/



struct niz *bform(struct niz *koef, int n, int a)
{
     int i=0;
struct niz *p=koef;
struct niz *temp1=p;
struct niz *proba=NULL;
struct niz *temp2=p->pok;
double b=temp1->koef;
insertn(proba,b);
for(i=1; i<= n-1; i++)
{
temp1=temp1->pok;
temp2=temp2->pok;
b=a*temp1->koef+temp2->koef;
insertn(proba, b);
}
return(proba);
}

/* funkcija koja listu koja predstavlja polinom sortira od najviseg eksponenta do najmanjeg */
struct pnode *sortlist(struct pnode *p)
{
   struct pnode *temp1,*temp2,*max,*prev,*q;
   q = NULL;
   while(p != NULL)
   {
      prev = NULL;
      max = temp1 = p;
      temp2 = p -> link;
      while ( temp2 != NULL )
      {
         if(max -> exp < temp2 -> exp)
              {
         max = temp2;
                 prev = temp1;
               }
               temp1 = temp2;
               temp2 = temp2-> link;
            }
      if(prev == NULL)
            p = max -> link;
            else
            prev -> link = max -> link;
            max -> link = NULL;
            if( q == NULL)
            q = max;
         else
         {
            temp1 = q;
           
         while( temp1 -> link != NULL)
         temp1 = temp1 -> link;
         temp1 -> link = max;
         }
      }
      return (q);
   }
   

   void printlist (struct pnode *p)
   {
      while (p!= NULL)
  {
      printf("%d %lf\t",p-> exp,p->coeff);
               p = p-> link;
  }
   }

      void printniz (struct niz *p)
   {
      while (p!= NULL)
  {
      printf("%d %lf\t",p->koef);
               p = p-> pok;
  }
   }




/*ovo sam ubacio samo da bi proverio duzinu niza*/
int duzina(struct niz* cvor) {
struct niz* current = cvor;
int count = 0;
while (current != NULL) {
count++;
current = current->pok;
}
return count;
}



 
void main()
   {
         int e,a,n,i,h;
         double c;
struct niz *koef=NULL;
struct pnode *poly1 = NULL ;
printf(" Uneti broj clanova prvog polinoma: \n");
         scanf("%d",&n);
         i=1;
h=n;
while ( n-- > 0 )
         {
      printf("Uneti eksponent i koeficijent clana broj %d\n",i);
               scanf("%d %lf",&e,&c);
               poly1 = insert ( poly1,e,c);
   
i++;
         }


printf("Uneti a za x-a \n");
         scanf("%d",&a);


         poly1 = sortlist(poly1);

printf(" Prvi polinom glasi: \n");
         printlist ( poly1 );
         
koef=kopiranje(poly1,koef);

printf("\n Duzina je: ");
i=duzina(koef);

printf("\n%d",i);

koef=bform(koef,h,a);

         
printf("Niz b glasi: \n");
         printniz(koef);
   }


Evo ga ceo kod. Isti sam poslao jednom strancu i on mi kaze da kod njega radi bez problema. Moguce da je nesto do mojeg kompajlera.
Naslov: Re: Problem sa listom
Poruka od: Marko Аcović 23.12.2009, 00:04
Sad sam probao kod sebe tvoj kod. I meni izbacuje istu gresku kao i tebi. U drugom prolazu kroz for petlju u f-ji bform ne inicijalizujes dobro promenljive pa onda puca. Btw, sta treba da ti radi pomenuta f-ja. Malo ti je kod konfuzan.
Naslov: Re: Problem sa listom
Poruka od: pseudobluz 23.12.2009, 09:45
Program treba da racuna koeficijente Hornerove seme.

A ta funkcija bform treba da formira niz koeficijenta b,
ciji oblik mozes videti ovde:

http://en.wikipedia.org/wiki/Horner_scheme#Description_of_the_algorithm (http://en.wikipedia.org/wiki/Horner_scheme#Description_of_the_algorithm)

Provalio sam gde je problem:

struct pnode *temp2=p->link;

Ta vrednost ne moze da se inicijalizuje. Ali ne znam zasto?
Desni deo ima tecnu vrednost na steku, ali program odbija da je dodeli levom delu.

EDIT:

Uradio sam :) Zabolela me glava, a problem bio jednostavan. Cim sredim malo kod postovacu. Mozda nekome zatreba.

Inace, ovak glasi ispravljena funkcija, koja je ranije pravila problem:


struct pnode *bform(struct pnode *coeff, int a)
{
         struct pnode *p=coeff;
struct pnode *temp1=p;
struct pnode *proba=NULL;
double b=temp1->coeff;
proba=insert(proba,1,b);
while(temp1->link!=NULL)
{   
temp1->link->coeff=a*(temp1->coeff)+(temp1->link->coeff);
proba=insert(proba,1,temp1->link->coeff);
temp1=temp1->link;

}
return(proba);
}