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

20_LESI

Dúvida - "error: incompatible types in assignment"

7 mensagens neste tópico

Tou a fazer um trabalho de C, e não estou a conseguir perceber o porquê deste erro: "error: incompatible types in assignment"

Ele dá erro nesta linha de código:

       

tmp  = fix_uce2ident(tmp);

E eis a função em questão:

char *fix_uce2ident(char *str)
{
   int i, j;
   
   for ( i=3, j=3 ; str[j]!='\0' ; i++ )
      if( isupper(str[i]) )
      {
         str[j]=str[i];
 j++;
      }

   return str;
}

Estou de directa a tentar acabar a minha parte de um trabalho, e este erro (supostamente de caca) está a arrumar comigo! Alguém me ajude sff...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se dá erro nessa linha e diz que os tipos são incompatíveis a única coisa que interessa é o tipo de retorno da função (char*) e o tipo da variável tmp que tu não nos mostraste.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"error: incompatible types in assignment"

Ele dá erro nesta linha de código:

tmp  = fix_uce2ident(tmp);

Não podes fazer isso porque o tipo de tmp é char[] e o tipo da função é char*.

Em C não podes mudar os arrays assim.

char tmp[100];
tmp = "exemplo para teste"; /* invalido */

Tens (pelo menos) duas soluções:

a) declarar tmp como char* e fazer a gestão de memória "à pata" (malloc e free)

b) copiar os caracteres para o array

#include <string.h>
/* solucao b */
strcpy(tmp, fix_uce2ident(tmp));

Ou ainda ... que é o teu caso específico, fazes a função alterar a string directamente e não precisas de fazer assigns

strcpy(tmp, "exemplo para teste");
fix_uce2ident(tmp);
printf("%s\n", tmp); /* tmp ja esta alterado */

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include <string.h>
/* solucao b */
strcpy(tmp, fix_uce2ident(tmp));

Assim não resulta, tive agora a testar e não resulta! Já não sei bem qual era o problema...

Ou ainda ... que é o teu caso específico, fazes a função alterar a string directamente e não precisas de fazer assigns

strcpy(tmp, "exemplo para teste");
fix_uce2ident(tmp);
printf("%s\n", tmp); /* tmp ja esta alterado */

Teria de declarar mais uma string auxiliar para que isto funcionasse, nem testei mais depois de tentar fazer:

strcpy(tmp,fix_uce2ident(tmp))

Pois entretanto fez-se luz!

a) declarar tmp como char* e fazer a gestão de memória "à pata" (malloc e free)

Baseei-me nesta solução, mas em vez de alocar memória para a variável tmp, aloquei para uma outra variável auxiliar, dentro da função:

void fix_uce2ident(char *str)  // converte a UCE num identificador da mesma UCE
{
   int i=strlen(str), j;
   char *aux;

   aux = (char*) malloc (sizeof(char)*i);
   aux = str;
   
   for ( i=3, j=0 ; str[i]!='\0' ; i++ )
      if( isupper(str[i]) )
      {
         aux[j]=str[i];
 j++;
      }

   aux[j]='\0';
   strcpy(str,aux);
}

E voilá! Já faz o que eu quero! Obrigado a todos pela ajuda! Peço desculpa por ter ocultado grande parte do código, mas não tenho a política de chegar aqui, postar um projecto de 1000 e tal linhas, dizer que me dá um erro e pedir ao povo para me orientar enquanto vou coçá-los....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta assim (não testado):

void fix_uce2ident(char *str)  // converte a UCE num identificador da mesma UCE
{
   char *aux;

   if (!(*str && *(str+1) && *(str+2)))
   {
     return;
     /* nao faz nada, se `str` tem uma string com 3 ou menos caracteres. */
   }

   aux = str + 2;
   while (*(++aux))
   {
      if (isupper((unsigned char)*aux))
      {
         *str++ = *aux;
      }
   }
   *str = '\0';
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Funciona a minha função, e também funciona a tua, mas a tua é mais leet, vou utilizá-la!  :cheesygrin:

0

Partilhar esta mensagem


Link 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