Problem sa listom

Započeo pseudobluz, 02.12.2009, 14:11

prethodna tema - sledeća tema

pseudobluz

02.12.2009, 14:11 Poslednja Izmena: 02.12.2009, 14:13 od pseudobluz
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!

pseudobluz

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.

Zepi

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.


pseudobluz

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.

maxogm

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++)


pseudobluz

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.

maxogm

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.

pseudobluz

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.

Marko Аcović

Postuj ceo source kod na forum pa da probamo, da vidimo da li ce da izbaci istu gresku.

pseudobluz


# 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.

Marko Аcović

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.

pseudobluz

23.12.2009, 09:45 #11 Poslednja Izmena: 23.12.2009, 17:27 od pseudobluz
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

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);
}