Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

speedy

[Warning] assignment makes i

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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í...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 é?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.