Jump to content

[Warning] assignment makes i


speedy
 Share

Recommended Posts

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

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

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

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

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

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

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
 Share

×
×
  • Create New...

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.