JDEIFIK@ISI.EDU (Jeff Deifik) (04/18/89)
I have a program that works with ultrix cc, but doesn't with gcc. The program bubble-sorts a linked list of structures, by taking in a pointer to the first structure. The passed in pointer, points to the sorted list when the function returns, but gcc returns the wrong pointer. The bug is evident with and without the optimizer. The code is below. Jeff Deifik jdeifik@isi.edu /* These functions sort linked lists. Written by Jeff Deifik 4/17/89. */ #include <stdio.h> struct linke { int comp; /* The comparison field.*/ struct linke * next; /* Pointer to next element.*/ } ; typedef struct linke FLOU; typedef FLOU * FLOUP; #ifdef __STDC__ extern unsigned long int VAXRAND(int); extern int Length(FLOUP ptr); extern void Bubblesort(FLOUP ptr); extern void printptr(FLOUP foo); #else extern unsigned long int VAXRAND(); extern int Length(); extern void Bubblesort(); extern void printptr(); #endif /* A function used to determine the length of a linked list. */ int #ifdef __STDC__ Length(FLOUP ptr) #else Length(ptr) FLOUP ptr; #endif { int i; FLOUP x; if (ptr == NULL) return(0); i = 1; x = ptr; while(x->next != NULL) { x = x->next; i++; } return(i); } /* A function used to bubble-sort linked lists. */ /* It is faster when the list is small enough. */ void #ifdef __STDC__ Bubblesort(FLOUP ptr) #else Bubblesort(ptr) FLOUP ptr; #endif { int upper,i,j; FLOUP a,b,c,d; if (ptr == NULL) return; upper = Length(ptr) - 1; printf("DEBUG upper %d\n",upper); while (upper > 0) { j = 0; a = ptr; for (i = 0; i < upper; i++) { printf("DEBUG i is %d\n",i); b = a->next; printf("DEBUG a->comp %d b.comp %d\n",a->comp,b->comp); if (a->comp > b->comp) { /* Switch elements.*/ printf("DEBUG greater i is %d\n",i); d = b->next; if (i == 0) { ptr = b; ptr->next = a; } else { c->next = b; b->next = a; } a->next = d; c = a; a = b; b = c; /* Switch pointers.*/ j = i; /* Save last switch.*/ } c = a; a = b; printptr(ptr); printf("Ptr.comp is %d\n",ptr->comp); } upper = j; /* Array is totally sorted up to here.*/ } } #define SIZEA 5 FLOU a[SIZEA]; void main() { int i; VAXRAND(1); for (i = 0; i < SIZEA; i++) { if (i == SIZEA - 1) a[i].next = NULL; else a[i].next = &(a[i+1]); a[i].comp = (int)VAXRAND(0) / 1000; } printptr(a); printf("Length is %d\n",Length(a)); Bubblesort(a); printf("Bubble\n"); printptr(a); } void #ifdef __STDC__ printptr(FLOUP foo) #else printptr(foo) FLOUP foo; #endif { if (foo != NULL) { printf("%d\n",foo->comp); printptr(foo->next); } } #include <sys/time.h> unsigned long int VAXRAND(set) register int set; { static char name[8] = "VAXRAND"; static unsigned long int store; struct timeval tp; /* For timing.*/ struct timezone tzp; int gettimeofday(); if (set) /*Set store to system time.*/ { if (gettimeofday(&tp,&tzp) != 0) exit(1); store = tp.tv_usec * tp.tv_sec; /* Set store sec * microsec.*/ } store = 69069*store+1; /*Generate the next random number.*/ return(store); } -------