2012-03-28 2 views
0

У меня есть эти методы.
Я определил массив символов в файле stringcontent.h и этот массив взят из метода в другом файле test.c.Получение массива из другого файла в C

// stringcontent.h 
char content1[] = "blahblah"; 
void get_char_array(int which,char *buffer){ 
    if(which == 1) 
     buffer = content1; 
     printf("%s",buffer); // prints : "blahblah" 
    // and so on..... 
} 

// test.c 
#include "stringcontent.h" 
main(){ 
    char *buf; 
    get_char_array(1,buf); 
    printf("%s",buf); // prints rubbish rubbish !!! 
} 

Я должен придерживаться этого метода интерфейса (подписи функций) и как я могу это исправить?

+2

Код, который вы назвали «stringcontent.h», на самом деле должен быть «stringcontent.c». В «stringcontent.h» вы должны только объявлять 'void get_char_array (int, который имеет char * buffer);'. Если вы этого не сделаете, у вас появятся ошибки компоновщика. Ответ @ rbelli кажется тем, что вам нужно, поэтому я принял решение отредактировать его ответ. – j4x

+0

@ D-Shan: Не в тему, но я заметил ваш аватар, и я полностью одобряю. – cHao

+0

@cHao Твой тоже. – Dinushan

ответ

3

Если я понимаю, вы хотите получить переменную, используя функцию get_char_array. Тогда Если я понимаю, что вам нужно сделать следующее (изменить get_char_function получить указатель на указатель на гольца):

// stringcontent.h 
char content1[] = "blahblah"; 
void get_char_array(int which,char **buffer){ 
    if(which == 1) 
     *buffer = content1; 
     printf("%s",*buffer); // prints : "blahblah" 
    // and so on..... 
} 

// test.c 
#include "stringcontent.h" 
main(){ 
    char *buf; 
    get_char_array(1,&buf); 
    printf("%s",buf); // prints "blahblah" !!! 
} 

EDIT:

Положите ваши Объявления и декларации в заголовочном файле и реализация в «.c» или у вас будут ошибки компоновщика.

// stringcontent.h 
#ifndef __STRINGCONTENT_H 
# define __STRINGCONTENT_H 

void get_char_array(int which,char **buffer); 

#endif 

// stringcontent.c 
char content1[] = "blahblah"; 
void get_char_array(int which,char **buffer){ 
    if(which == 1) 
     *buffer = content1; 
     printf("%s",*buffer); // prints : "blahblah" 
    // and so on..... 
} 

// test.c 
#include "stringcontent.h" 
main(){ 
    char *buf; 
    get_char_array(1,&buf); 
    printf("%s",buf); // prints "blahblah" !!! 
} 

Для компиляции (при использовании GCC):

gcc -Wall test.c stringcontent.c -o test 

Примечание Вам не нужно «экспортировать» content1 так как единственное, что вам нужно, указатель, возвращаемый функцией.



Вот еще одно решение, использующее STRCPY. В этом случае вам не нужно передавать указатель на указатель.

// stringcontent.h 
char content1[] = "blahblah"; 
void get_char_array(int which,char *buffer){ 
    if(which == 1) 
     strcpy(buffer,content1); 
     printf("%s",buffer); // prints : "blahblah" 
    // and so on..... 
} 

// test.c 
#include "stringcontent.h" 
#define GOOD_SIZE (100) 
main(){ 
    char buf[GOOD_SIZE]; 
    get_char_array(1,buf); 
    printf("%s",buf); // prints "blahblah" !!! 
} 

В этом случае вы должны позаботиться о выделении достаточного размера, находящихся в буфере, прежде чем вызвать get_char_array.

Я предпочитаю первое решение, ему не нужно использовать strcpy. И если вы не выделяете достаточное пространство в buf, у вас могут быть проблемы. Одним из решений является передача размера функции buf в функцию и проверка ее перед strcpy или использование strncpy.

+0

Ваше решение отлично работает. Но здесь метод называется как (1, ** & buf **), а (1, ** buf **). Возможно ли это? – Dinushan

+1

Да, в этом случае вам нужно передать адрес указателя, поскольку вы будете изменять указатель. – rbelli

+0

Я имею в виду способ вызова типа (1, ** buf **), но не как (1, ** и buf **). Вот что я хотел сказать - «Я должен придерживаться этого интерфейса метода». – Dinushan

0

Использование:

extern char content1[]; 

заявление в stringcontent.h и поставить определение массива и определение функции в файле с именем stringcontent.c. Вы не должны указывать определения объектов и функций в файлах заголовков.