
Enviado em 18/02/2016 - 16:25h
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).
# 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;
}
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como fazer a conversão binária e aplicar as restrições no Linux
Como quebrar a senha de um servidor Linux Debian
Como bloquear pendrive em uma rede Linux
Um autoinstall.yaml para Ubuntu com foco em quem vai fazer máquina virtual
Instalar GRUB sem archinstall no Arch Linux em UEFI Problemático









