Olá pessoal, eu estudo a linguagem c pelo livro do Dennis Ritchie : C A
linguagem de Programação Padrão Ansi. No capítulo 5 de Apontadores e
vetores, na parte 5.6 : “Vetores de Apontador; Apontadores para
apontadores”, tem um código que eu não consigo compilar, a mensagem de
erro é : “na função lelinhas': Ex_pag_107.c:(.text+0x129): referência indefinida para
aloca’ collect2: error: ld returned 1 exit status”.
Bom, o erro é nessa parte : “if(nlinhas >= maxlin || (p = aloca(tam))
== NULL)” na função “lelinhas”.Eu não entendi a construção : “char
*aloca(int);” aloca é um ponteiro de tipo char, mais eu não entendi o
(int).
Na função original : “int lelinha(char *, int)”, porque não têm os
nomes das variáveis?(essa função foi modificada no código, acrescentando
os nomes das variáveis)
O código :
`# include <stdio.h>
include <string.h>
define MAXLIN 500
char *ptrlinha[MAXLIN]; // ponteiros para linhas de texto
int lelinhas(char *ptrlinha[], int nlinhas);
void imprlinhas(char *ptrlinha[], int nlinhas);
void qsort(char *v[], int esq, int dir);
int main(void){
int nlinhas;
if((nlinhas = lelinhas(ptrlinha,MAXLIN)) >= 0){
qsort(ptrlinha, 0, nlinhas - 1);
imprlinhas(ptrlinha, nlinhas);
return 0;
}else{
printf(“Erro: entrada muito grande\n”);
return 1;
}
}
define TAMMAX 1000
int lelinha(char *s, int lim); // int lelinha(char *, int)
char *aloca(int); // ??
int lelinha(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;
}
int lelinhas(char *ptrlinha[], int maxlin){
int tam, nlinhas;
char *p, linha[TAMMAX];
nlinhas = 0;
while((tam = lelinha(linha, TAMMAX)) > 0 )
if(nlinhas >= maxlin || (p = aloca(tam)) == NULL)
return -1;
else{
linha[tam - 1] = '\0';
strcpy(p,linha);
ptrlinha[nlinhas++] = p;
}
return nlinhas;
}
void imprlinhas(char *ptrlinha[], int nlinhas){
int i;
for(i = 0; i < nlinhas; i++)
printf("%s\n",ptrlinha[i]);
}
void qsort(char *v[], int esq, int dir){
int i, ultimo;
void troca(char *v[], int i, int j);
if( esq >= dir)
return;
troca(v, esq, (esq + dir)/2);
ultimo = esq;
for( i = esq + 1; i <= dir; ++i)
if( v[i] < v[esq])
troca(v, ++ultimo, i);
troca(v, esq, ultimo);
qsort(v, esq, ultimo-1);
qsort(v, ultimo+1,dir);
}
void troca(char *v[], int i, int j){
char *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}`