Autor Tema: Error de compilación inexplicable en MikroC  (Leído 1465 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado BlueWind

  • PIC10
  • *
  • Mensajes: 20
Error de compilación inexplicable en MikroC
« en: 10 de Enero de 2021, 23:39:30 »
Hola a todos.

He escrito un pequeño código en MikroC y al compilarlo me sale un error bastante raro. Nunca antes había tenido problemas con las multiplicaciones, pero ahora resulta que no salen....

Si escribo:
Final = 2*10;  // (Final es una variable  int declarada global)
La compilación pasa de maravillas.

Si escribo: Final = Final*10;
La compilación me marca un error: Undeclared identifier 'Mul_16x16_U' in expression

Por más vueltas que le he dado, no veo donde la regué - ¿Alguna pista?

Saludos y gracias.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:Error de compilación inexplicable en MikroC
« Respuesta #1 en: 11 de Enero de 2021, 03:31:15 »
Pega el código completo a ver si encontramos la causa. Me huele a que hay un problema en las declaraciones de variables.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Error de compilación inexplicable en MikroC
« Respuesta #2 en: 11 de Enero de 2021, 12:08:36 »
Ten en cuenta que C es case sensitive.

 Final != final.

 Un saludo. 
« Última modificación: 11 de Enero de 2021, 12:20:08 por remi04 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error de compilación inexplicable en MikroC
« Respuesta #3 en: 11 de Enero de 2021, 13:57:58 »
Busque el mismo error y hablan de:

Desactivar el Case Sensitive.... realmente no entiendo porque o como, si el compilador es si o si case sensitive.
Y otros que se soluciono reinstalando el compilador.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Error de compilación inexplicable en MikroC
« Respuesta #4 en: 11 de Enero de 2021, 15:49:16 »
Sin al menos el código y la versión de mikroc no se puede decir nada.

Tengo instalada una versión 7.1 que prácticamente no uso y a esa instrucción la compila sin errores.

Desconectado BlueWind

  • PIC10
  • *
  • Mensajes: 20
Re:Error de compilación inexplicable en MikroC Fragmento del código)
« Respuesta #5 en: 11 de Enero de 2021, 16:42:14 »
Hola a todos. Gracias por la colaboración. Les pongo el fragmento del código donde se presenta el error.
De hecho si escribo la expresión fuera de ese fragmento , se compila sin errores. - Eso es lo más interesante....
Todas la variables son globales y lo tipos  unsigned short y unsigned int

while(1)
    {
      switch(Key)
       {
        case 1:
              { if (M==0)  // Menú 1 activo - Function:Time increment
                   Key=0; PrnT=1;
               }
                  else   
                     {
                      Menu1();  //  Shows initial screen
                      M=0;
                     }
               break;
              }   //funciona bien, ya se probó
             
        case 2:    // Decrement
              { if (M==0)  // Menú 1 activo
                 { TimeDecrement();
                   Key=0; PrnT=1;
                 }
              break;
              } //Funciona bien ya se probó

        case 3:   //Enter  time
              { if (M==0)  // Menú 1 activo
                 {
                  BTminU=TminU; BTminD=TminD; BTsecD=TsecD; BTsecU=TsecU; // Backup of Time interval
                 }
                 else
                    {
                     TminU=BTminU; TminD=BTminD; TsecU=BTsecU; TsecD=BTsecD; //Restoring last Time interval
                    }
                TotalSec=TminD*10;    // En esta línea y en la que sigue es donde aparece el error
                TotalSec+=(TsecD*10)+TsecU;   // Si las borro, todo se compila bien, si pongo una de las dos o ambas, da error
                                                                  // Undeclared identifier 'Mul_16x16_U' in expression
                                                                  // TotalSec es unsigned int y las demás son unsigned short
                if(TotalSec>0)
                 {
                  Key=0;
                  IT0=1;        // Resets flag on 50 ms int.
                  KBoard_OFF();   // Turning OFF Keyboard
                  PrStart=1; // Stars counting process
                 }
                break;
               }
       }   // end Switch
 } // end while

Saludos

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Error de compilación inexplicable en MikroC Fragmento del código)
« Respuesta #6 en: 11 de Enero de 2021, 17:54:15 »
... Les pongo el fragmento del código donde se presenta el error.
...

¿Y como hace uno para verificar que compila sin errores?

De todas formas, en el switch tenés mal puestas varias llaves. No entiendo como no te saltan esos errores.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Error de compilación inexplicable en MikroC
« Respuesta #7 en: 11 de Enero de 2021, 18:56:41 »
Los case: de los Switch no son necesario enllavetarlos y como ya te han dicho tienes mal puestas las llaves de los if else. Te dejo un ejemplo de sintaxis de cómo hacer lo que quieres hacer: 

Código: C
  1. switch(indice) {
  2.   case 0:
  3.     instruccion1;
  4.     instruccion2;
  5.     if (condicion) {
  6.       instr1;
  7.       instr2;
  8.       }
  9.     else {
  10.       instr1;
  11.       instr2;
  12.       }
  13.     instruccion3;
  14.     etc;
  15.     break;
  16.  
  17.   case 1:
  18.     instruccion;
  19.     instruccion;
  20.     etc;
  21.     break;
  22.  
  23.   case 2:
  24.     instruccion;
  25.     instruccion;
  26.     etc;
  27.     break;
  28. }
« Última modificación: 11 de Enero de 2021, 19:04:53 por remi04 »

Desconectado BlueWind

  • PIC10
  • *
  • Mensajes: 20
Re:Error de compilación inexplicable en MikroC
« Respuesta #8 en: 11 de Enero de 2021, 23:37:58 »
Eduardo 2 y Remi04,

Las llaves de los if- else están bien puestas, de lo contrario el compilador hubiera saltado enseguida. De hecho, la misma estructura que me propones que siga (Remi 04) es la que tengo armada, con la diferencia que enllaveté los cases después de darle tantas vueltas y no ver donde está el error, pero si le quitás las llaves a lo cases, sigue saliendo el error que mencionaba antes.

Para salir de dudas, armé uin procedimiento aparte y lo nombré CalcTime()

void CalcTime()
{
 TotalSec=TminD*10;  //  solo le puse esta línea
}
 
Y lo llamé desde el Case3

case 3:
          { CalcTime();
             break;
          }   // puedes ponerle las llaves o no al case, a C no le molestan.

El hecho es que salta el error aunque el procedimiento esté fuera del while principal.

Sigo dándole vueltas a ver donde está el meollo del asunto.

Saludos.
Uso la versión 6.6.2 del MikroC

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error de compilación inexplicable en MikroC
« Respuesta #9 en: 12 de Enero de 2021, 00:31:44 »
Seguramente tenes un error, en el copy & paste que hiciste.
Además asegúrate siempre de usar corchetes en el if, para no tener problemas luego.

Código: C
  1. while(1)
  2.     {   // ABRO 1
  3.       switch(Key)
  4.        {    // ABRO 2
  5.         case 1:
  6.               { if (M==0)     // ABRO 3
  7.                    Key=0; PrnT=1;
  8.                }     // CIERRO 3
  9.                   else  
  10.                      {     // ABRO 4
  11.                       Menu1();
  12.                       M=0;
  13.                      }    // CIERRO 4
  14.                break;
  15.               }   //  CIERRO 2 el del switch

Como te dijeron, quedaria mas claro:

Código: C
  1. while(1)
  2.     {
  3.       switch(Key)
  4.        {
  5.         case 1:
  6.                if (M==0) {
  7.                    Key=0; PrnT=1;
  8.                } else {
  9.                    Menu1();
  10.                    M=0;
  11.                }
  12.                break;
  13.  
  14.         case 2:
  15.            // etc


En tu código hay 10 { y 11 } , como para que te des cuenta que hay un error, que como dije seguramente fue el copy & paste. Recordá que nosotros no tenemos un programa compilando, si queres pasar un programa mucho mas pequeño y que tengas el mismo problema mejor, de esa forma alguien puede probar compilarlo en su PC y decirte si le ocurre lo mismo.


Y no es que queramos tratar de imponerte esto, sino que primero nos aseguramos que este bien escrito, luego se requiere de algun ejemplo simple donde no funcione y luego pasamos a ver cual es el problema, es un proceso de eliminación.

Para mi es problema de compilador. Vuelvo a repetirte que es lo unico que encontre en internet es esto:

Citar
It's related to the compiler option 'Case sensitive'
I get the error when this flag is ON (in my case in the USB CDC library)

La opcion del compilador "Case Sensitive" ponerlo en Off, tal ves en
Options > Output > Output settings.
« Última modificación: 12 de Enero de 2021, 00:35:45 por KILLERJC »

Desconectado BlueWind

  • PIC10
  • *
  • Mensajes: 20
Re:Error de compilación inexplicable en MikroC
« Respuesta #10 en: 12 de Enero de 2021, 00:40:24 »
Problema resuelto compañeros.

EL TIPO DE DATOS - ése era el problema.

MikroC no te deja hacer la operación   Int= short*const, pero si te deja sumarlas. - aunque el destino sea más largo que la fuente.

Tampoco te deja multiplicar Long int= short*const - a pesar de que Long int es mucho más largo que short.

Solución: Long int= long int*const - sí funciona y no da error al compilar.

Entonces convertí los resultados parciales que eran del tipo short int, que debía multiplicar por ciertos valores constantes al tipo long int y listo. Solo convertí dos variables de short a long int.

Al compilar - CERO ERROR- y el código funciona en el Hardware.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error de compilación inexplicable en MikroC
« Respuesta #11 en: 12 de Enero de 2021, 09:37:35 »
Citar
EL TIPO DE DATOS - ése era el problema.

Ningún sentido tiene lo que decís, ya que antes dijiste que era dependiente de la posición el error, por lo tanto no debería ser eso.

Además el tipo de dato no es problema ya que la promoción a un entero superior siempre ocurre. El problema es la función esa Mul_16x16_U, que lo que estas haciendo ahora es usar otra multiplicación que es Mul_32x32_U, que esa seguramente este bien escrita en el compilador. Y por eso no te da problemas.

Te lo recalco en negrita a lo de promoción, porque es parte del funcionamiento de C.

En fin... llegaste a una "solución" pero no al verdadero problema. Que es el compilador, solución: Actualizar el compilador.

PD: Const no define el tamaño, sino su persistencia y en el caso del microcontrolador, su lugar de almacenamiento.

Desconectado BlueWind

  • PIC10
  • *
  • Mensajes: 20
Re:Error de compilación inexplicable en MikroC
« Respuesta #12 en: 08 de Noviembre de 2021, 14:09:38 »
Resuelto: Reinstalé el compilador y funcionó.

Gracias a los que respondieron. ((:-)) ((:-)) ((:-))


 

anything