WolfmanZ Posted April 5, 2012 at 01:58 PM Report #447744 Posted April 5, 2012 at 01:58 PM Boas estou com problemas a optimizar este codigo será que alguém pode dar uma ajuda! #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #include<unistd.h> #include<string.h> int main(int argc, const char* argv[]){ char string[100]; char stringfinal[100]; char b[3]; int i; int fd = open( argv[1], O_RDONLY); if (fd== -1) exit(1); stringfinal[0]='\0'; while(1){ read(STDIN_FILENO,b,3); i = atoi(&b[2]); if(b[0]=='r'){ read( fd, string, i); strcat(stringfinal,string); } if(b[0]=='i'){ lseek(fd, i, SEEK_SET); } if(b[0]=='f'){ lseek(fd, -i, SEEK_END); } if(b[0]=='+'){ lseek(fd, i, SEEK_CUR); } if(b[0]=='-'){ lseek(fd, -i, SEEK_CUR); } else if(b[0]=='s' && b[2]=='0'){ break; } } strcat(stringfinal,"\n"); int tamanho = strlen(stringfinal); write(STDOUT_FILENO, stringfinal, tamanho); close(fd); return 0; } O programa serve para avançar e recuar na frase do ficheiro de acordo com o i/f/+/- e quando aparece r tende ler exemplo: i 2 vai po inicio e avança 2 caracteres + 2 vai po inicio e avança 2 caracteres f 2 vai po inicio e recua 2 caracteres - 2 vai po inicio e recua 2 caracteres r 2 le dois caracteres Atençao que nao posso usar printfs e tenho de usar write read e lseeks.
HappyHippyHippo Posted April 5, 2012 at 01:59 PM Report #447745 Posted April 5, 2012 at 01:59 PM isso parece um enunciado .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
WolfmanZ Posted April 5, 2012 at 02:05 PM Author Report #447748 Posted April 5, 2012 at 02:05 PM isto é para o exercicio de universidade so que é para ser entrege numa plataforma que faz teste e da um resultado a mim disse que demora muito a correr o programa logo tem de se optimizar! o exercicio está feito so falta é optimiza-lo, mas nao sei como optimiza-lo mais!
pmg Posted April 5, 2012 at 02:09 PM Report #447752 Posted April 5, 2012 at 02:09 PM Em vez de atoi(&b[2]) experimenta i = b[2] - '0'; E ainda ... O strcat() vai ser ler a string destino desde o principio. Podes guardar um ponteiro para a proxima posição de escrita e usá-lo em vez de fazeres strcat() constantemente. Atenção ao buffer overflow! What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
brunoais Posted April 5, 2012 at 02:40 PM Report #447775 Posted April 5, 2012 at 02:40 PM Usa o switch. É um pouco mais rápido que if then else "[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31 Life is a genetically transmitted disease, induced by sex, with death rate of 100%.
WolfmanZ Posted April 5, 2012 at 03:22 PM Author Report #447789 Posted April 5, 2012 at 03:22 PM ainda nada :down:
HappyHippyHippo Posted April 5, 2012 at 03:24 PM Report #447791 Posted April 5, 2012 at 03:24 PM Atençao que nao posso usar printfs e tenho de usar write read e lseeks. não há milagres ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
brunoais Posted April 5, 2012 at 03:45 PM Report #447798 Posted April 5, 2012 at 03:45 PM mostra o código atual, sff "[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31 Life is a genetically transmitted disease, induced by sex, with death rate of 100%.
WolfmanZ Posted April 5, 2012 at 04:21 PM Author Report #447805 Posted April 5, 2012 at 04:21 PM o codigo está igual visto que as alteraçoes nao fizeram efeito!
pedrosorio Posted April 5, 2012 at 05:21 PM Report #447817 Posted April 5, 2012 at 05:21 PM o codigo está igual visto que as alteraçoes nao fizeram efeito! A minha ideia inicial seria que com strcat (no if b[0]=='r') o teu código corre em O(N^2) em que N é o número de caracteres da string final, provavelmente precisarias de um algoritmo O(N). Terias que guardar um apontador para o fim da tua string e acrescentar o que lês diretamente no fim, em vez de fazer strcat. No entanto, depois de ver a constante que tens aí (e se tens a certeza absoluta que a nunca vais ler mais que 100 caracteres), não pode ser esse o problema. Uma dúvida: tens sempre apenas um algarismo nas instruções garantidamente? Não respondo a dúvidas por mensagem.
WolfmanZ Posted April 5, 2012 at 05:42 PM Author Report #447820 Posted April 5, 2012 at 05:42 PM em primeiro lugar, sim a constante nao tem mais de 100 caracteres quanto a ter dois digitos é uma boa pergunta porque no exemplo e num enuciado ele nao fala em 2 algarismos mas se calhar pode ter 2 algarismos! Afinal nao pode ter 2 algarismos.
WolfmanZ Posted April 5, 2012 at 06:12 PM Author Report #447829 Posted April 5, 2012 at 06:12 PM codigo actual: #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #include<unistd.h> int main(int argc, const char* argv[]){ char string[100]; char b[3]; int i,m=0; int fd = open( argv[1], O_RDONLY); if (fd == -1) exit(1); while(1){ read(STDIN_FILENO,b,3); i=b[2]-'0'; if(b[0]=='r'){ read( fd, string+sizeof(char)*m , i*sizeof(char)); m += i; } if(b[0]=='i'){ lseek(fd, i, SEEK_SET); } if(b[0]=='f'){ lseek(fd, -i, SEEK_END); } if(b[0]=='+'){ lseek(fd, i, SEEK_CUR); } if(b[0]=='-'){ lseek(fd, -i, SEEK_CUR); } else if(b[0]=='s' && b[2]=='0'){ break; } } write(STDOUT_FILENO, string, m); write(STDOUT_FILENO, "\n", 1); close(fd); return 0; }
bsccara Posted April 5, 2012 at 06:15 PM Report #447831 Posted April 5, 2012 at 06:15 PM Aposto que o que domina o tempo de execução desse código são essas chamadas constantes ao lseek e read.
HappyHippyHippo Posted April 5, 2012 at 06:18 PM Report #447832 Posted April 5, 2012 at 06:18 PM parece que estas a ler do teclado os i/f/+/- ... porque não : - guardas numa variável o tamanho do ficheiro - tratas lógicamente do ponteiro onde deverás ler os bytes isto é : alteras o valor da variável que guarda a posição a ser lida do ficheiro - só executas um lseek quando necessitas de ler bytes do ficheiro IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
WolfmanZ Posted April 5, 2012 at 06:22 PM Author Report #447833 Posted April 5, 2012 at 06:22 PM pessoal ja descrobri porque nao aceitava a resoluçao : a instruçao é : por exemplo "i 3" mas tem o \n no final e no codigo tinha char b[3]; read(STDIN_FILENO,b,3); e devia estar : char b[4]; read(STDIN_FILENO,b,4); obrigado a todos pela ajuda!!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now