< 문제 현상 >

mysql> delimiter |
mysql> CREATE FUNCTION bonjour (s CHAR(20)) RETURNS CHAR(50)
    -> RETURN CONCAT('Bonjour, ',s,'!');
    -> |
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)


 

< 문제 해결 >

show global variables like 'log_bin_trust_function_creators';

-> 옵션이 ON인지 OFF인지 알수 있다.


SET GLOBAL log_bin_trust_function_creators = 1; 하면 ON
SET GLOBAL log_bin_trust_function_creators = 0; 하면 OFF


ON일때만 function을 생성할 수 있는 것입니다.

출처 : http://blog.daum.net/z-dream/16803946
by 널부러 2009. 4. 28. 13:56
유니코드와 멀티코드(안시코드)를 쉽게 바꿀때 사용 하는 USES_CONVERSION 매크로가 있는데
사용할때 #include <atlconv.h> 링크 하고 아래와 같이 사용하면 된다.
#include <atlconv.h>

USES_CONVERSION;

TCHAR widechar[]=L"sample";
char ansichar[10];
ansi = W2A(widechar);

하지만 간혹 헤더만 링크 시키고 아래와 같은 에러가 발생할때가 있다.
 1>xxxxx.obj : error LNK2001: "unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)" (?g_pfnGetThreadACP@ATL@@3P6GIXZA) 외부 기호를 확인할 수 없습니다.

이런 에러가 발생할 경우에는 라이브러리 파일이 링크가 안되서 발생하는 문제이다
아래와 같이 라이브러리 파일을 링크 해주면 된다.
#pragma comment (lib, "atls.lib")


by 널부러 2009. 4. 20. 17:39
에 템플릿을 사용하면서 발생하는 문제가 생겨서 정리 해본다.

template < class T >
calss test
{
     std::queue< T > m_queue;
     T Pop()
     {
        if( m_Queue.empty() )
            return NULL;

        T data = m_Queue.front();
        m_Queue.pop();
        return data;
    }
}

예를 들어 위와 같은 template가 있다고 치자
그래서 아래와 같이 사용한다.
 int temp;
test<int> val;
temp = val.pop();
이런식으로 정적인 자료형을 선언 하면 값을 받아오는것이 가능하다
위에서는 queue에 값을 넣은게 없으니 그냥 NULL 값을 받을것이다.

하지만 문제가 되는건 아래와 같은 상황이다
 struct testTemplet
{
     int a;
     int b;
}

testTemplet temp;
test<testTemplet> val;
temp = val.pop();
코드상으로는 이상이 없어보이지만 컴파일러에서는 에러가 발생한다.

컴파일러 에러 내용은 아래와 같다.
 원인: 'int'에서 'const testTemplet'(으)로 변환할 수 없습니다.
소스 형식을 가져올 수 있는 생성자가 없거나 생성자 오버로드 확인이 모호합니다.

에러원인으로 생각되는것은 구조체형은 NULL이라는 값을 알수가 없기에 발생하는 문제이다.
동적으로 생성한다면 이와 같은 문제는 발생하지 않는다.
하지만 정적일 경우에는 위와 같은 코드로는 프로그램을 작성할수가 없다

일단 임시 방편으로 값을 받아오는 방법을 바꾸서 처리하니 해결은 되었지만 뭔가 그리 깔끔하지 않은거 같아 찝찝하긴 하다
아래는 내가 해결한 방법에 대해서 적어보겠다.
 template < class T >
calss test
{
     std::queue< T > m_queue;
     bool Pop( T& data )
     {
        if( m_Queue.empty() )
            return false;

        data = m_Queue.front();
        m_Queue.pop();
        return true;
    }
}

 struct testTemplet
{
     int a;
     int b;
}

testTemplet temp;
test<testTemplet> val;
if( true == val.pop( temp ))
{
    printf("정상적으로 값을 받음");
}
else
{
    printf("값을 받지 못했음");
}

이방법 말고 해결 방법이 있다면 누가 좀 알려주기 바란다.


by 널부러 2009. 3. 26. 16:23