speedy Posted January 3, 2010 at 09:28 PM Report Share #303952 Posted January 3, 2010 at 09:28 PM boas. estou aqui com um problema. isto esta-me a dar um aviso, que eu simplesmente nao faço a mais "p%$a#" ideia do que puderá ser. então, é este o codigo do programa. void cresc(int *p, int np){ int j, aux, c; do{ c=0; for (j=1; j<np;j++){ if (p[j-1]>=p[j]){ aux=p[j]; p[j-1]=p[j]; p[j]=aux; c=1; printf("%d",c); } } }while(c!=0); printf("blae"); } void decresc(int *p, int np){ int j, aux, c; do{ c=0; for (j=1; j<np;j++){ if (p[j-1]<=p[j]){ aux=p[j]; p[j]=p[j-1]; p[j-1]=aux; c=1; printf("%d",c); } } }while(c!=0); printf("blae\n"); } main(){ int i, n, odo; int *o, *op; do{ printf("QUANTOS NUMEROS QUER ORDENAR?(DIGITE 0 PARA SAIR)"); scanf("%d",&n); o=(int*) calloc(n,sizeof(int)); if (n!=0){ for (i=0;i<n;i++){ system("cls"); printf("QUAL O NUMERO %d?:", i+1); scanf("%d",&o[i]); } system("cls"); for (i=0;i<n;i++){ printf("%d\n",o[i]); } sleep(1000); system("cls"); do{ printf("QUERO ORDENAR POR ORDEM\n"); printf("\t\t|1|\t CRESCENTE.\n"); printf("\t\t|2|\t DECRESCENTE."); //odo=getch(); scanf("%d",&odo); system("cls"); printf("\n %d \n", odo); sleep(1000); system("cls"); }while (odo != 1 || odo != 2);//---------------------------------------------------------------------------------|82| op=&o;//--------------------------------------------------------------------------------------------------------------|84| if (odo==1){ cresc(&op, n);//CHAMAR FUNÇÃO CRESC//------------------------------------------------------------------|86| for(i=0; i<n;i++){ printf("%d: \t%d\n",i+1, o[i]); } }else{ decresc(&op, n);//CHAMAR FUNÇÃO DECRESC//----------------------------------------------------------------|91| for(i=0; i<n;i++){ printf("%d: \t%d\n",i+1, o[i]); } } } }while(n!=0); printf("\t\t\bOBRIGADO POR UTILIZAR ESTE PROGRAMA. ATE BREVE."); sleep(2000); } os erros são: 84 F:\UAlg\1ºAno - 1ºSemestre\Programação\HOME\H4.c [Warning] assignment from incompatible pointer type 86 F:\UAlg\1ºAno - 1ºSemestre\Programação\HOME\H4.c [Warning] passing arg 1 of `cresc' from incompatible pointer type 91 F:\UAlg\1ºAno - 1ºSemestre\Programação\HOME\H4.c [Warning] passing arg 1 of `decresc' from incompatible pointer type ha ali partes que sao completamente desnecessarias, e para apagar, tal como um for que ta la em cima a fazer prints do conteudo do array (feito so para ver se tava a funcionar), e é provavel que tenha mais erros do que só aquele, mas foi o unico que o dev-cpp so se queixou. digo isto porque tenho frequencia de C quinta feira, e so agora é que me lembrei de revisoes. baseie-me na minha experiencia em c++, e esqueci-me do que me faltava aprender. desde ja agradeço a ajuda. Link to comment Share on other sites More sharing options...
_deXter Posted January 3, 2010 at 09:32 PM Report Share #303955 Posted January 3, 2010 at 09:32 PM Convém que mostre todo o warning... Ele diz a linha, dava jeito meteres aqui também.. Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 09:33 PM Author Report Share #303956 Posted January 3, 2010 at 09:33 PM peço desculpa, esqueci-me de adicionar essa info. ja la ta. Link to comment Share on other sites More sharing options...
Localhost Posted January 3, 2010 at 09:58 PM Report Share #303963 Posted January 3, 2010 at 09:58 PM Isto é o erro: *op=&o; Mete assim: op = &o; Pelo menos só foi este que encontrei, vi apenas na diagonal. here since 2009 Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 10:00 PM Author Report Share #303965 Posted January 3, 2010 at 10:00 PM Isto é o erro: *op=&o; Mete assim: op = &o; Pelo menos só foi este que encontrei, vi apenas na diagonal. da o mesmo erro e o mesmo resultado :s Link to comment Share on other sites More sharing options...
Localhost Posted January 3, 2010 at 10:04 PM Report Share #303967 Posted January 3, 2010 at 10:04 PM Mas isso é um erro. Esse teu programa está confuso, existem aí if's que nem estão fechados por causa dos comentários. here since 2009 Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 10:05 PM Author Report Share #303968 Posted January 3, 2010 at 10:05 PM sory, erro meu. agora da outro (tinha visto warning, pensei que era o mesmo) agora da: 72 F:\UAlg\1ºAno - 1ºSemestre\Programação\HOME\H4.c [Warning] assignment from incompatible pointer type e o resultado continua igual. os if's estão todos fechados. PS: ja mudei no codigo acima também Link to comment Share on other sites More sharing options...
Localhost Posted January 3, 2010 at 10:08 PM Report Share #303970 Posted January 3, 2010 at 10:08 PM Se indicasses as linhas era mais fácil, com um comentário por exemplo. Existe aí outro erro que é nas chamadas das funções, tens de passar o endereço (&) e não valor da variável ou seja: cresc(&op, n); decresc(&op, n); Edit: De resto, acho que não tens mais problemas mas mais uma vez digo, não olhei a fundo. Só olhei para a função main here since 2009 Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 10:14 PM Author Report Share #303972 Posted January 3, 2010 at 10:14 PM ta fechado antes do else Link to comment Share on other sites More sharing options...
Localhost Posted January 3, 2010 at 10:14 PM Report Share #303974 Posted January 3, 2010 at 10:14 PM Sim, tens razão. Já está resolvido o teu problema? Edit: Ah, e se o if está fechado, tens um problema, o sinal de igualdade (comparação) em programação é == e não = here since 2009 Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 10:50 PM Author Report Share #303987 Posted January 3, 2010 at 10:50 PM ainda nao. agora, é o seguinte: ele faz tudo correcto até chegar à linha em que pede a ordem da ordenaçao (crescente ou decrescente). ele é suposto receber o valor 1 ou 2, consoante a escolha do user. o problema é que eu meto 1 e ele escreve 49, ou meto 2 e ele escreve 50. o "odo" é recebido nesta linha: odo=getch(); faz ideia do que puderá ser? eu simplesmente nao sei. se receber pela função scanf ele faz bem. entretanto pus esta operação num ciclo do...while (linha 82), e ele mesmo com os valores la, nao sai dali, coisa que nao percebo. meti um prinft ao valor que se escolhe, e ele mostra os tais valores de 1 e 2 (49 e 50 quando uso o getch), mas com valores certos ou errados, ele começa ali às voltas continua tambem a dar erros na chamada das funções. 89 F:\UAlg\1ºAno - 1ºSemestre\Programação\HOME\H4.c [Warning] assignment from incompatible pointer type 92 F:\UAlg\1ºAno - 1ºSemestre\Programação\HOME\H4.c [Warning] passing arg 1 of `cresc' from incompatible pointer type 98 F:\UAlg\1ºAno - 1ºSemestre\Programação\HOME\H4.c [Warning] passing arg 1 of `decresc' from incompatible pointer type vo actualizar o codigo acima e indicar as linhas EDIT: também reparei nesse mesmo agora antes de fazer o post Link to comment Share on other sites More sharing options...
_deXter Posted January 3, 2010 at 11:07 PM Report Share #303989 Posted January 3, 2010 at 11:07 PM ainda nao. agora, é o seguinte: ele faz tudo correcto até chegar à linha em que pede a ordem da ordenaçao (crescente ou decrescente). ele é suposto receber o valor 1 ou 2, consoante a escolha do user. o problema é que eu meto 1 e ele escreve 49, ou meto 2 e ele escreve 50. o "odo" é recebido nesta linha: odo=getch(); O getch recebe um char. O que está acontecer é que o odo deve ser um int logo, o char é convertido para int através da sua representação ASCII (49 no caso do 1 e 50 no caso do 2). Coloca o código actualizado para mais ajuda. Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 11:13 PM Author Report Share #303990 Posted January 3, 2010 at 11:13 PM hmmm... mas o odo é um int, ta declarado no meio dos outros. não vejo o porque disso. o codigo ja ta actualidado acima no 1º post. actualizei-o logo asseguir ao post anterior Link to comment Share on other sites More sharing options...
_deXter Posted January 3, 2010 at 11:15 PM Report Share #303992 Posted January 3, 2010 at 11:15 PM hmmm... mas o odo é um int, ta declarado no meio dos outros. não vejo o porque disso. o codigo ja ta actualidado acima no 1º post. actualizei-o logo asseguir ao post anterior É exactamente por o odo ser um int que acontece o que eu disse. O getch retorna um char. Estás a atribuir um char a um int, a conversão é feita automaticamente através do valor ASCII. Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 11:18 PM Author Report Share #303994 Posted January 3, 2010 at 11:18 PM ahhh, ja percebi. ele ta a receber um char, e nao um int.... e nao ha nenhuma função como o getch que de para receber um inteiro? Link to comment Share on other sites More sharing options...
_deXter Posted January 3, 2010 at 11:20 PM Report Share #303995 Posted January 3, 2010 at 11:20 PM Podes simplesmente receber com o getch. Mas depois fazer algo do género: ... odo = getch(); odo -= '0'; ... Tenta perceber o que é que é feito aí... Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 11:22 PM Author Report Share #303996 Posted January 3, 2010 at 11:22 PM pelo que percebo, recebe na mesma com o getch, e subtrai 0. o que provavelmente fará com que se converta o valor ASCII no inteiro equivalente, ficando o que eu pretendo (1 ou 2). é isso, não é? o que nao percebo é o porque das pelicas. supostamente, assim é tratado como um char, nao é? Link to comment Share on other sites More sharing options...
_deXter Posted January 3, 2010 at 11:28 PM Report Share #303997 Posted January 3, 2010 at 11:28 PM As plicas fazem com que seja tratado como um char, ou seja, é subtraído o valor ASCII do 0 ao valor actual de odo, tal como disseste. Link to comment Share on other sites More sharing options...
speedy Posted January 3, 2010 at 11:32 PM Author Report Share #303998 Posted January 3, 2010 at 11:32 PM hmm. ja to a perceber. agora ele encalha no do...while. simplesmente nao percebo isto! a linha final é }while (odo != 1 || odo != 2); a ideia é ele nao sair do do...while enquanto nao escolher 1 ou 2. que senao, no if asseguir, ele faria o 2 mesmo se metessemos um numero infitivamente grande. mas ele simplesmente fica no while, quer se mete os valores certos (1 ou 2), ou valores errados! Link to comment Share on other sites More sharing options...
_deXter Posted January 3, 2010 at 11:37 PM Report Share #304000 Posted January 3, 2010 at 11:37 PM O que tu queres nesse while é: "enquanto o valor de odo for diferente de 1 e diferente de 2". É isso que tens lá? Link to comment Share on other sites More sharing options...
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