Thread: Value of structure can't be changed

  1. #1
    Registered User
    Join Date
    Jul 2006
    Posts
    25

    Value of structure can't be changed

    Hi, I have encountered with a bizarre problem. Though i solved it in a different way, i can't understand why the problem occurs.

    Here is the problematic code:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    typedef struct frac {
    	int ust;
    	int alt;
    
    } frac;
    
    frac fracs[13100];
    frac fracs2[13100];
    
    int cmp(const void *a,const void *b) {
    
    	return ((frac*)a)->ust * ((frac*)b)->alt -  ((frac*)a)->alt * ((frac*)b)->ust;
    }
    
    FILE *in,*out;
    
    void qs(int alt,int ust);
    
    
    int main() {
    	int num,i,j,x=1,y=0,m,n,f,g;
    	clock_t a,b;
    	frac z;
    
    	a=clock();
    
    	in=fopen("frac1.in","r");
    	out = fopen("frac1.out","w");
    	fscanf(in,"%d",&num);
    	/*num=4;*/
    
    	fracs[0].alt = 1;
    	fracs[0].ust=0;
    
    	for (i=1;i<=num;i++) {
    				fracs[x].alt = i;
    				fracs[x].ust=1;
    				x++;
    	}
    
    	for (i=3;i<=num;i++) {
    		for (j=2; j<i; j++) {
    				n=j;
    				for (m=2; m<=n;m++) { 
    					if (!(i%m) && !(j%m)) {
    						j++;
    						break;
    					}
    				}
    				if (i%j == 0) {
    					fracs[x].alt = i/j;
    					fracs[x].ust=1;
    					x++;
    				} else {
    					fracs[x].alt = i;
    					fracs[x].ust=j;
    					x++;
    				}
    		}
    	}
    
    	for (i=0;i<=x;i++) {
    		m=fracs[i].ust;
    		for (j=2;j<=m;j++) {
    			if (!(fracs[i].alt%j) && !(fracs[i].ust%j)) {
    				fracs[i].ust =fracs[i].ust/j;
    				fracs[i].alt =fracs[i].alt/j;
    			}
    		}
    	}
    				
    	qsort(fracs,x,sizeof(fracs[0]),cmp);
    
    	
    
    
    	/*for (i=0;i<x;i++) printf("%d / %d \n", fracs[i].ust,fracs[i].alt);*/
    
    	fracs2[0] = fracs[0];
    	for (i=1;i<x;i++) {
    		if ( (fracs2[y].alt) * (fracs[i].ust) == (fracs2[y].ust) * (fracs[i].alt)) fracs2[y] = fracs[i];
    		else ++y,fracs2[y] = fracs[i],fprintf(out,"%d/%d\n", fracs2[y-1].ust,fracs2[y-1].alt);
    	}	
    	fprintf(out,"%d/%d\n", fracs2[y].ust,fracs2[y].alt);
    	b=clock();
    	printf("\n\n---%f---\n",((float)(a-b)/1000));
    
    	return 0;
    }
    This way, the values in structure cannot be changed! when i changed the bold part with this code, the problem is solved!:

    Code:
    	for (i=0;i<=x;i++) {
    		m=fracs[i].ust;
    		g = fracs[i].alt;
    		for (j=2;j<=m;j++) {
    			if (!(g%j) && !(m%j)) {
    				fracs[i].ust =m/j;
    				fracs[i].alt =g/j;
    			}
    		}
    	}
    I couldn't figure out where i am mistaken.

    Thanks in prior

    Regards

  2. #2
    Registered User
    Join Date
    Aug 2005
    Posts
    1,267
    fracs[i].alt is evaluated on every j loop iteration in your original program but not in the second version.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Passing Structure Pointers to Functions
    By samus250 in forum C Programming
    Replies: 15
    Last Post: 03-20-2008, 03:13 PM
  2. Replies: 13
    Last Post: 12-14-2007, 03:34 PM
  3. Structure Within Structure
    By Shakira in forum C Programming
    Replies: 3
    Last Post: 11-04-2003, 03:35 PM
  4. Tab Controls - API
    By -KEN- in forum Windows Programming
    Replies: 7
    Last Post: 06-02-2002, 09:44 AM
  5. Serial Communications in C
    By ExDigit in forum Windows Programming
    Replies: 7
    Last Post: 01-09-2002, 10:52 AM