2014-03-03 4 views
0

저는 C 프로그래밍에 익숙하며 라이브러리에서 배열을 전달하려고합니다. char 배열을 만드는 라이브러리 c 파일에 함수가 있습니다. main 함수에서이 배열을 사용하는 방법. 이것은 내가 시도 일의 짧은 코드 :라이브러리에서 배열을 전달하는 방법

libfile.c

char *myArray; 
void PopulateArray() 
{ 
    // Getting data from serial port in char buffer[100] 
    myArray = buffer; 
} 

exter char *myArray; 
void PopulateArray(); 

libfile.h program.c에이

int main() 
{ 
    // in fore loop 
    printf("%s\n" , myArray[i]); 
} 

이 조합 중 하나입니다 나는 시도했지만 아무것도 작동하지 않습니다. 이 작업을 수행하는 방법?

+1

이 도서관은 당신의 프로젝트에 정적으로 또는 동적으로 링크되어 있습니까? – Bathsheba

+0

필요한 헤더를 포함 했습니까? – tesseract

+0

정적으로 연결되어 있습니다. 하지만 차이가 있다면 두 가지를 모두 알고있는 것이 좋습니다. D – user2081328

답변

1

라이브러리 함수에서 주변 코드로 배열을 전달하려면 함수의 반환 값을 사용하거나 포인터 포인터 인수를 사용할 수 있습니다.

다음 예제 코드를 참조하십시오.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char* createSourceCopy() { 
    const char *source = "Example Text"; 
    // We got some text in variable source; 
    const size_t sourceSize = strlen(source); 
    char *result = (char*)malloc(sizeof(char)*(sourceSize+1)); 
    strncpy(result, source, sourceSize); 
    return result; 
} 

라이브러리의 사용자가이 같은 기능을 사용할 수 있습니다

main() { 
    char *result = createSourceCopy(); 
    // Do something with result. 
    // After the use, destroy the array 
    delete[] result; 
    return 0; 
} 

어떻게 배열을 전달하는 또 다른 방법은 이것이다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

bool copySourceText(char **outText) { 
    const char *source = "Example Text"; 
    // We get some text in variable source; 
    const size_t sourceSize = strlen(source); 
    *outText = new char[sourceSize]; 
    strncpy(*outText, source, sourceSize); 
    return true; // success 
} 

이 두 번째 변종 이점을 가지고 그 반환 값을 상태로 사용할 수 있습니다. 성공시 true을 반환하거나 오류가있는 경우 false을 반환 할 수 있습니다.

이 두 번째 버전은 이와 같이 사용할 수 있습니다.

int main() { 
    char *result; 
    if (copySourceText(&result)) { 
     // Do something with result. 
     // After the use, destroy the array 
     free(result); 
     result = NULL; 
    } else { 
     // Error handling 
    } 
    return 0; 
} 
+2

'new'와'delete []'는 질문에 태그가 추가되면 일반 C가 아닙니다. C 등가물을 사용할 수 있다면 편리 할 것입니다. – halex

+0

예, 그렇습니다. 내 실수 ... – Flovdis

0

그것은 분명하지 않다 정확히 (더 코드를보고 도움이 될 것이다) 게시 된 코드에서 잘못되어 가고 있지만, 컴파일 오류,이 라인 중 하나가 잘못 될 수도되지 않는 문제를 가정의 새로운 기능 :

char *myArray; 
printf("%s\n" , myArray[i]); 
  • char *myArray 는 (하나의 문자열 적합 할 것이다)는 char에 대한 포인터를 선언합니다.

  • printf 라인 myArray은 (a char, 즉 하나 개의 문자를 제조) 역 참조. char을 전달 중이지만 %s 형식의 포인터는 char입니다. 당신이 문자열을 문자를 인쇄 할 경우

, 당신은 %c 사용할 수 있습니다 myArray 한 문자열과 null로 끝나는 경우

for (i = 0; i < length; i++) { 
    printf("%c\n", myArray[i]); /* or %x or %d if you want */ 
} 

그렇지 않으면 (Why is a null terminator necessary? 참조), 다음 당신은 할 수있다 :

printf("%s\n" , myArray); /* [i] removed, no for loop necessary */ 
+0

이 작동하지만 내 문제를 해결하지 않습니다. 일부 문자'buffer [100] = {0x2, 0x17, 0x20 etc ..}와 함께 버퍼를 가지고 있으며, 나는이 문자들 각각에 개별적으로 액세스하려고합니다. 버퍼는 libfile.c에있는 함수의 데이터로 채워지고 program.c의 함수에서이 데이터를 읽으 려합니다. – user2081328

+0

@ user2081328 OK, 최신 편집을 참조하십시오. – benj

관련 문제