Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
speedy

[Warning] assignment makes i

Recommended Posts

speedy

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.

Share this post


Link to post
Share on other sites
_deXter

Convém que mostre todo o warning... Ele diz a linha, dava jeito meteres aqui também..

Share this post


Link to post
Share on other sites
Localhost

Isto é o erro:

*op=&o;

Mete assim:

op = &o;

Pelo menos só foi este que encontrei, vi apenas na diagonal.


here since 2009

Share this post


Link to post
Share on other sites
speedy

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

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites
speedy

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

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites
speedy

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

Share this post


Link to post
Share on other sites
_deXter

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.

Share this post


Link to post
Share on other sites
speedy

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

Share this post


Link to post
Share on other sites
_deXter

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.

Share this post


Link to post
Share on other sites
speedy

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?

Share this post


Link to post
Share on other sites
_deXter

Podes simplesmente receber com o getch. Mas depois fazer algo do género:

...
odo = getch();
odo -= '0';
...

Tenta perceber o que é que é feito aí...

Share this post


Link to post
Share on other sites
speedy

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 é?

Share this post


Link to post
Share on other sites
_deXter

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.

Share this post


Link to post
Share on other sites
speedy

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!

Share this post


Link to post
Share on other sites
_deXter

O que tu queres nesse while é: "enquanto o valor de odo for diferente de 1 e diferente de 2".

É isso que tens lá?

Share this post


Link to post
Share on other sites
speedy

ja percebi. tinha la ou. errei na parte do e e ou.

obrigado pela ajuda ate agora. o resto fica para amanha, que amanha recomeçam as aulas da uni, e eu entro bem cedinho. mais uma vez, obrigado

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.