@Redproxima
Студент технического ВВУЗ'а

Как передать в функцию указатель на структуру, описанную в другом хедере?

объявил и определил структуру в отдельных файлах и из main я к ним обращаюсь без проблем, но при попытке передать указатель на структуру в функции, которые в свою очередь так же объявлены и определены в других файлах, возникает проблема:
1) В хедере func.h объявленные в функции параметры отказываются быть видимыми во вне.
2) Соответственно, ошибка типизации в модуле func.c.
на Тостере нашел "грамотное описание структур в отдельных файлах, дабы ими можно было пользоваться отовсюду" q46806
Вот исходники:
работающего экземпляра

main.c
#include <stdio.h>
#include "str.h"
int main(int argc, char const *argv[])
{

    myStr.a = 1;
    myStr.b = 9;
    printf("%d %d\n", myStr.a, myStr.b);

    return 0;
}

str.h
struct StrA
{
    int a;
    int b;
};

extern struct StrA myStr;

str.c
#include "str.h"

struct StrA myStr;



В вот:
пациент

main.c
#include <stdio.h>
#include "str.h"
#include "func.h"
int main(int argc, char const *argv[])
{
    func(&myStr);

    printf("%d %d\n", myStr.a, myStr.b);

    return 0;
}

str.h
struct StrA
{
    int a;
    int b;
};

extern struct StrA myStr;

ctr.c
#include "str.h"

struct StrA myStr;

func.h
#ifndef FUNC
#define FUNC

    void func(struct StrA *myStr);

#endif

func.c
<
#include "func.h"
#include "str.h"

void func(struct StrA *myStr){

    (*myStr).a = 1;
    (*myStr).b = 9;
}


Ошибки:
5e7ced9976ae1259396080.png

Пример искусственно упрощен.
  • Вопрос задан
  • 457 просмотров
Пригласить эксперта
Ответы на вопрос 1
hakain
@hakain
Немного знаю С/С++, Qt, и микроконтроллеры
Не знаю как другие, но лично я стараюсь не использовать extern'ы из-за того, что возникает путаница со структурами и переменными, когда она определена где то в дебрях файла foo.c, а используется в bar.c.
Я стараюсь придерживаться модульного подхода, который может иметь примерно следующий вид.

// point.c

/* определение */
struct point {
int x;
int y;
};

void init_point(struct point** p, const int x, const int y)
{
    (*p)->x = x;
    (*p)->y = y;
}

int get_x(struct point* p)
{
  return p->x;
}

int get_y(struct point* p)
{
  return p->y;
}
// ... тут может быть много логики ...


// point.h

/* объявление */
/* тут можно подумать, что это инкапсуляция, но это обман зрения. 
 * на самом деле это просто аля сокрытие данных  */
struct point;

// интерфейс
void init_point(struct point** p, const int x, const int y);
int get_x(struct point* p);
int get_y(struct point* p);
// ... ect ...

// main.c
#include "point.h"

int main()
{
    struct point* p;
    init_point(&p, 1, 1);
    p->x; // ошибка
    
    // в других файлах так же изменение и чтение данных производим с помощью функций, а напрямую поля структуры недоступны
    const int x = get_x(p); 
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы