none
DUDA TECNICA DEL ERRO C2664 RRS feed

  • Pregunta

  • Hola amigos, espero que esten bien, les comento el problema que tengo a la hora de compilar un programa en VS2005 c++:

    int __thiscall CDbdTrace__CDbdTrace(_DWORD, _DWORD);
    .
    .
    .
    .
    .
    int __cdecl sub_401000(__int16 a1, int a2)
    {
      int v2; // eax@1
      int v3; // ecx@1
      int v4; // edx@4
      __int16 v5; // ax@9
      int v7; // [sp+10h] [bp-14h]@1
      signed int v8; // [sp+20h] [bp-4h]@1

      CDbdTrace__CDbdTrace(&v7, "valor"); // llamo la funcion
      v8 = 0;
      CFrameworkCriticalSection__Enter(&unk_40D23C, "agregarelemento");
      v3 = 3152 * a1;
      v2 = *(_DWORD *)(v3 + dword_414500 + 20352);
      if ( v2 )
      {
        if ( *(_WORD *)(v2 + 6) > *(_WORD *)(a2 + 6) )
          goto LABEL_15;
        do
        {
          v4 = v2;
          v2 = *(_DWORD *)v2;
        }
        while ( v2 && *(_WORD *)(v2 + 6) <= *(_WORD *)(a2 + 6) );
        if ( v4 )
          *(_DWORD *)v4 = a2;
        else
    LABEL_15:
          *(_DWORD *)(v3 + dword_414500 + 20352) = a2;
        *(_DWORD *)a2 = v2;
        v5 = *(_WORD *)(a2 + 6);
        if ( v5 == 1 || v5 == 2 )
        {
          SetEvent(*(HANDLE *)(v3 + dword_414500 + 20332));
          CDbdTrace__Write(&v7, 2, 2, "AddElQ: Set WakeUpEv Prty:%ld", *(_WORD *)(a2 + 6));
        }
      }
      else
      {
        *(_DWORD *)(v3 + dword_414500 + 20352) = a2;
        *(_DWORD *)a2 = 0;
        SetEvent(*(HANDLE *)(v3 + dword_414500 + 20332));
        CDbdTrace__Write(&v7, 2, 2, "AddElQ:Set WakeUpEv empty Q");
      }
      CFrameworkCriticalSection__Exit(&unk_40D23C, "AgregarElemento");
      v8 = -1;
      return CDbdTrace___CDbdTrace(&v7); // retorna el valor

    Cuando lo compilo me manda el error C2664:

    Error    1    error C2664: 'CDbdTrace__CDbdTrace' : no se puede convertir el parámetro 1 de 'int *__w64 ' a 'long'    c:\documents and settings\administrador\escritorio\eje\eje.cpp

    le agrege en la llamada de funcion la palabra explicit, se la quite y me vuelve a dar ese mismo error, le puse la palabra tanto al principio y al final de cada instruccion y es lo mismo, como le puedo hacer para que ya no me arroje ese error? o como puedo modificarlo de tal manera que no salga ese error? ya que mi cerebro me da para mas, ya que al momento de leer el error en el MSDN, me dice lo siguiente:

    El error C2664 también se puede generar si una clase oculta un miembro en una de sus clases base.

    Como puedo saber si la clase oculta un miembro? lo revise y nada

    Saludos y gracias por su ayuda!!!!!

    lunes, 27 de mayo de 2013 17:08

Todas las respuestas

  • Hola.

    El compilador simplemente te está avisando de que el segundo parámetro es incorrecto o puede dar lugar a código incorrecto.

    Tu estás pasando un puntero a cadena y la función espera recibir un DWORD, que es un long de 4 bytes si no has tocado nada del estándar. Se da la coincidencia de que un puntero en 32 bits también es un entero de 4 bytes, por lo que te debe de funcionar bien aunque el compilador te avise siempre y cuando esa función sepa que el valor recibido es un puntero a memoria...

    No sé dónde has encontrado eso, o quién lo ha definido, pero es una chapuza muy grande. Por ejemplo, ese código compilado para un procesador de 64 bits fallará sin más. Si lo que quieres es pasar un puntero genérico a algo, usa "void *" como parámetro.

    De todos modos, es un código bastante sucio. Si quieres evitar el problema, "moldea" el puntero a un DWORD en la llamada.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/

    lunes, 3 de junio de 2013 11:46
    Moderador