undefined symbol

Discussion in 'Mac Programming' started by jamesapp, May 29, 2008.

  1. jamesapp macrumors 6502a

    Joined:
    Mar 7, 2008
    #1
    james-collinss-macbook-pro:chap5 jamescollins$ gcc sorting.c -o sorting.out
    Undefined symbols:
    "_alloc", referenced from:
    _readlines in cc0j5pcd.o
    ld: symbol(s) not found
    collect2: ld returned 1 exit status

    got the following output from terminal when i tried to compile a program from the
    K and R book on c. the program is supposed to sort a list alphabetically.

    here is the source file which i called sorting.c:

    Code:
    #include <stdio.h>
    #include <string.h>
    
    #define MAXLINES 5000 /* max #lines to be sorted */
    
    char *lineptr[MAXLINES];  /* pointers to text lines */
    
    int readlines(char *lineptr[], int nlines);
    void writelines(char *lineptr[], int nlines);
    
    void qsort(char *lineptr[], int left, int right);
    
    /* sort input lines */
    main()
    {
      int nlines;  /* number of input lines read */
      
      if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
         qsort(lineptr, 0, nlines-1);
         writelines(lineptr, nlines);
         return 0;
      } else {
         printf("error: input too big to sort\n");
         return 1;
      }
    }
    
    #define MAXLEN 1000  /* max length of any input line */
    int getline(char *, int);
    char *alloc(int);
    
    /* readlines: read input lines */
    int readlines(char *lineptr[], int maxlines)
    {
      int len, nlines;
      char *p, line[MAXLEN];
      
      nlines = 0;
      while ((len = getline(line, MAXLEN)) > 0)
          if (nlines >= maxlines || (p = alloc(len)) == NULL)
              return -1;
          else {
              line[len-1] = '\0'; /* delete newline */
              strcpy(p, line);
              lineptr[nlines++] = p;
          }
      return nlines;
    }
    
    /* writelines: write ouput lines */
    void writelines(char *lineptr[], int nlines)
    {
      int i;
      
      for (i = 0; i < nlines; i++)
          printf("%s\n", lineptr[i]);
    }
    
    /* getline: read a line into s, return length */
    int getline(char s[], int lim)
    {
      int c, i;
      
      for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
          s[i] = c;
      if (c == '\n') {
          s[i] = c;
          ++i;
       }
       s[i] = '\0';
       return i;
    }
    
    /* qsort: sort v[left]...v[right] into increasing order */
    void qsort(char *v[], int left, int right)
    {
      int i, last;
      void swap(char *v[], int i, int j);
      
      if (left >= right)  /* do nothing if array contains */
          return;  /* fewer than two elements */
      swap(v, left, (left + right)/2);
      last = left;
      for (i = left+1; i <= right; i++)
           if (strcmp(v[i], v[left]) < 0)
               swap(v, ++last, i);
      swap(v, left, last);
      qsort(v, left, last-1);
      qsort(v, last+1, right);
    }
    
    /* swap interchange v[i] and v[j] */
    void swap(char *v[], int i, int j)
    {
      char *temp;
      
      temp = v[i];
      v[i] = v[j];
      v[j] = temp;
    }
    
    any help would be appreciated.
     
  2. yeroen macrumors 6502a

    yeroen

    Joined:
    Mar 8, 2007
    Location:
    Cambridge, MA

Share This Page