2013-04-02 2 views
0

PostgreSQL C 라이브러리 libpq을 사용 중입니다. PQgetvalue 함수로포인터에서 값을 가져올 수 있습니다.정적 문자 배열로 도우미 함수 만들기

는 지금, 나는 10 ~ 20 열이있는 테이블이 있고, 나는 간단한 printf 호출을 인쇄하려면 :

resA resB에이 문자열이 PGgetvalue 기능을 사용하여로드
printf("%s,%s,%s..(so on...)...%s", resA, resB, resC,..., resN); 

. 이제, (나는 하나의 printf 그것을 밖으로 인쇄 할 경우)이 방법은 선언 10 ~ 20 포인터를 필요로하고, 나는 같은 간단한 사용하는 거라고 :

char* getFieldVal(PGresult* res, int row, char* fieldName) 
{ 
    static char tmp[1000]; 
    memset(tmp, 0, sizeof(tmp)); 

    // Load data here... 

    return tmp; 
} 

을하고 전화를 printf 같은 :

그러나
printf("%s,%s,%s..(so on...)...%s", 
     getField(r, 0, "A"), getField(r, 0, "B"), ... , getField(r, 0, "N")); 

printf 기능의 출력은 (그냥 이전의 문자열을 삭제 한 경우에도 모든 getField 호출 (이 경우에 A 필드의 값을) 먼저 데이터베이스에서 요청 된대로 반환하는 것을 나타내는한다 물론) memset 전화와 함께.

어디서 잘못 되었나요? 내 코드에 뭔가가 있거나 gcc에서 모든 getField 호출이 동일한 메모리에 포인터를 반환한다고 가정하므로 실제로 여러 번 호출하지는 않습니다.

또는 먼저 printf은 모든 매개 변수를 역순으로 평가 한 다음 실제로 함수를 호출합니까? 이것이 사실이라면 (그리고 나는 그것이 내기 일 것입니다), 제가 시도하고있는 것을 성취하기위한 더 간단한 패턴이 있습니까?

+0

난 당신이 정적 배열을 사용하고 (printf와에 호출하기 때문에하지 틀렸다 경우는) 그 정의가 없습니다 :

함수에서 시작, 당신과 함께 row에 대한 fieldName의 값으로 포인터를 얻을 수 있습니다 C의 행동? –

+0

포인트는 같은 메모리에 포인터를 반환하고 있으므로 마지막 표현식이 평가 된 후에 그 포인터가 세 번 인쇄됩니다. – teppic

+0

예, 그렇습니다 (마지막 단락 참조). 실제로 함수를 호출하기 전에 모든 매개 변수를 평가해야하기 때문에 실제로 이해할 수 있습니다. –

답변

1

또는 printf 함수는 먼저 모든 매개 변수를 반대로 ( 순서로) 평가 한 다음 실제로 함수를 호출합니까?

예.

그러나 결과는 PQclear(PGresult*)이 호출 될 때까지 메모리에 남아 있기 때문에 복사 할 필요가 없습니다.

char* getFieldVal(PGresult* res, int row, char* fieldName) 
{ 
    int n = PQfnumber(res, fieldName); 
    if (n == -1) 
    return NULL; /* missing field, you might prefer to return an empty string here */ 
    else 
    return PQgetvalue(res, row, n); 
} 
+0

예, libpq 문서를 읽는 동안 30 분 전에 끝났습니다! 감사! –

1

이 함수는 정적/전역 변수의 주소를 반환하기 때문에 호출 할 때마다 데이터가 덮어 쓰여지고 동일한 포인터가 반환됩니다.

이렇게하는 간단한 방법 중 하나는 데이터 세트를 반복하고 형식이 지정된 문자열 대신 각 변수를 개별적으로 인쇄하는 것입니다.