Тема: КіР розділ 5.6
Намагаюсь виконати програму приведену в розділі, але не виходить з'явилося декілька питань:
row.h
/* row.h */
#define MAXLINES 5000
#define MAXLEN 1000
int readlines(char *array[], int);
void writelines(char *array[], int);
void qsort(char *array[], int, int);
int getline(char *, int);
main.c
#include <stdio.h>
#include "row.h"
// Масив покажчиків
char *lineptr[MAXLINES];
int main(int argc, char *argv[])
{
int nlines; //number of rows read
// Зчитуємо рядки
if((nlines = readlines(lineptr, MAXLINES)) >= 0){
// Сортуємо
qsort(lineptr, 0, nlines-1);
// Виводимо результат
writelines(lineptr, nlines);
return 0;
} else {
printf("Error: too much rows\n");
return 1;
}
}
getline.c
#include <stdio.h>
#include <string.h>
#include "row.h"
/* Rows reading */
int readlines(char *lineptr[], int maxlines){
int len, nlines;
char *p, line[MAXLEN];
nlines = 0;
// Виконати функцію, доки є рядок довжиною більше 0
while((len=getline(line, MAXLEN)) > 0){
// Призначаємо покажчику p адресу покажчика на вільне місце в буфері
if(nlines >= maxlines || (p = alloc(len)) == NULL)
return -1;
else{
strcpy(p, line);
lineptr[nlines++] = p;
}
}
return nlines;
}
/* Rows printing */
void writelines(char *lineptr[], int nlines){
while(nlines-- > 0)
printf("%s\n", *lineptr++);
}
/* Writing symbols into array */
int getline(char *s, int max){
int i=0;
while((*s = getchar()) != '\n' && *s != EOF && i < max-1){
s++;
i++;
}
*s = '\0';
if(*s == EOF)
return 0;
return i+1;
}
/* Ascendingly sorting v[left] ... v[right] */
void qsort(char *v[], int left, int right){
int i, last;
void swap(char *v[], int i, int j);
if(left == right) // nothing to do if there are less than 2 elements in an array
return;
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 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;
}
alloc.c
#define ALLOCSIZE 10000 // free space
char *alloc(int);
void afree(char *p);
static char allocbuf[ALLOCSIZE]; //memory for alloc
static char *allocp = allocbuf; //pointer to free place in buffer
char *alloc(int n){ //returns pointer on n symbols
if(allocbuf + ALLOCSIZE - allocp >= n){
allocp += n; //space is exist
return allocp - n; //old p
} else
return 0; //no free space
}
void afree(char *p){
if(p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}