Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] praca z wieloma plikami .c oraz .h

Ostatnio zmodyfikowano 2014-12-14 10:55
Autor Wiadomość
Edward
Temat założony przez niniejszego użytkownika
[C] praca z wieloma plikami .c oraz .h
» 2014-12-13 18:24:52
Proszę powiedźcie co robię źle.

//============= teraz.c ===========

#include <stdio.h>
#include "plik1.h"
#include "plik2.h"

int main(void)
{
int b = 3, wynik;
wynik = kwadrat(b)+razydwa(b);
printf("%d",wynik);
return wynik;
}


//============= plik1.h ===========

int kwadrat(int a);


//============= plik1.c ===========

#include "plik1.h"
#include "stale.h"

int kwadrat(int a)
{
int w;
w = a*a+RAZ+dwa;
return w;
}


//============= plik2.h ===========
int razydwa(int a);


//============= plik2.c ===========

#include "plik2.h"
#include "stale.h"

int razydwa(int a)
{
 int e;
 e = 2*a+RAZ+dwa;
 return e;
}

//============= stale.h ===========
#ifndef STALE
        #define STALE
        #define RAZ 100

        int dwa = 50;
#endif

///////////////////////////////
plik główny to  teraz.c błąd jaki dostaję że zmienna dwa jest podwójnie zdefiniowana
z góry dzięki za pomoc.
P-122808
GolemXIV
» 2014-12-13 18:38:52
Po skończeniu kompilacji poprzedniego pliku c, a przed rozpoczęciem kompilacji następnego dotychczas zdefiniowane makra się nie przenoszą.
Do wnętrza #ifndef STALE kompilator zagląda dwa razy - po razie przy kompilacji każdego pliku.
W związku z tym w Twoim programie dwa razy jest użyta definicja: int dwa = 50;
To nie jest deklaracja, że gdzieś tam, kiedyś, będzie zdefiniowana. To jest definicja. że zmienna dwa występuje tu, w tym miejscu. W sumie dwa niezależne razy.
P-122811
Edward
Temat założony przez niniejszego użytkownika
» 2014-12-14 10:03:16
Dzięki za odpowiedź.

Okej walczyłem z tym i wystarczy wprowadzić mała modyfikację

//============= stale.h ===========
#ifndef STALE
        #define STALE
        #define RAZ 100

        int dwa; //<-- sama deklaracja
#endif


zrobić jeszcze jedne plik

//============= stale.h ===========
int dwa=50;   //<-- tu w sumie trzeba drugi raz użyć int

wówczas program działa. Czy jest to poprawne rozwiązanie?

Przy okazji te informacje są mi potrzebne bo robię większy program mam też pytanie bo zwykle pracowałem z jednym plikiem .c

Czy poniższy układ  jest okej dodam, że się poprawnie kompiluje tylko pytanie czy może być, że biblioteki się na wzajem ładują. Czy powinienem popracować na inną architekturą o to o co mi chodzi.

Najlepiej by było dać obrazek, ale postaram się to opisać
Oznaczenie
a-->b  w pliku b jest wpisane #include "a"

f_lcd.h-->f_lcd.c
f_inne.h-->f_inne.c
f_mouse.h-->f_mouse.c
f_obliczenia.h-->f_obliczenia.c

f_lcd.h-->start.c
f_inne.h-->start.c
f_mouse.h-->start.c
f_obliczenia.h-->start.c

ponadto
<stdio.h>-->f_lcd.c
f_inne.h-->f_lcd.c

f_inne.h-->f_mouse.c
f_obliczenia.h-->f_mouse.c
<math.h>-->f_obliczenia.c

Swoją drogą czy możecie polecić jakieś materiały do przestudiowania ap ropo pracy z wieloma plikami, architektura załączeń w kontekście języka C ewentualnie c++

Z góry dziękuję za odpowiedź


P-122842
Monika90
» 2014-12-14 10:55:51
Czy jest to poprawne rozwiązanie?
Nie jest, użyj extern.
P-122843
« 1 »
  Strona 1 z 1