Extern zostaje wyzerowany - dlaczego?

0

Cześć !

Mam problem z 'extern"

W pliku a.c mam zmienna " unsigned int zmienna1", natomiast w plika a.h mam "extern unsigned int zmienna1"
Zmienna ta przechowuje wartość odczytaną z wejść prądowych. Wszystko działa dobrze dopóki nie chcę wykorzystać tej zmiennej w innym pliku.
Gdy dodam do pliku a.h exten wartość zostaje wyzerowana lub wskazuje jakieś dziwne wartości ...

0

Pokaż kod, tak jak opisujesz powinno działać.
Sądzę że masz gdzieś coś w rodzaju if(zmienna=0) ...

0

W pliku a.h powinna być definicja Twojej zmiennej, czyli:

unsigned int zmienna1 = 0;

później w pliku a.c możesz na niej operować do woli.
Natomiast w pozostałych plikach *.h, które dołączasz powinieneś dodać deklarację:

extern unsigned int zmienna1;

Przynajmniej tak wywnioskowałem z Twojego opisu. Najlepiej będzie jeśli zrobisz tak jak napisał @_13th_Dragon i podasz kod.

0

plik a.c:

 unsigned int readP1, readT1, readP3, readP4, readNV1, read_freq, test;    // wielkośći odczytane z AI  

plik a.h :

extern unsigned int readP1, readT1, readP3, readP4, readNV1, read_freq, test; // wielkośći odczytane z AI

Wtedy zmienna jest już = 0

I nic już nie mogę zrobić...

Ciekawe jest jeszcze w tym to że gdy deklaruję tablicę np

  tablica[3]

i ustawiam w nich bity na poszczególnych miejscach to wszystko działa.

0
  1. Która zmienna jest już = 0 ?
  2. A jaką musi mieć wartość ?
  3. Gdzie tą wartość ustawiasz ?
0

ad.1 Każda zmienna zostaje automatycznie wyzerowana - gdy użyję "extern"
ad.2 Wartość jest dynamiczna - w zależności jaki płynie prąd
ad.3 Wartość jest odczytywana przez gotową funkcję - specyficzną dla danego sterownika

0

Pokaż jak zmieniasz i jak sprawdzasz czy jest zerem.

0

Sprawdzam w debugger'e (AVR STUDIO - funkcja "watch") a wartość odczytana przypisuję do zmiennej np. funkcja_odczytu = readP1;.
To jest gotowa funkcja (nie zrobiona przeze mnie) i wszystko działa prawidłowo dopóki nie zrobie "extern".

1

Czy po wierszu: funkcja_odczytu = readP1; spodziewasz się zmiany zmiennej readP1 ?

0

Zmienne globalne są zgodne ze standardem zerowane przy starcie programu.

Jeśli przed odczytem zmiennej nie zapisujesz do niej żadnej wartości, to odczytasz zero.

0
_13th_Dragon napisał(a):

Czy po wierszu: funkcja_odczytu = readP1; spodziewasz się zmiany zmiennej readP1 ?

Powinno być odwrotnie :)

Ok - zmienna może być zerowana ale gdy rusza program to funkcja cały czas sczytuje wartość i przepisuje ją do zmiennej.

0

no to po kolei.
Słowo kluczowe extern przed zmienną globalną mówi kompilatorowi, że to jest deklaracja zmiennej, a nie jego definicja i kompilator nie powinien tworzyć nowej instancji tej zmiennej, ale spodziewać się, że tą instancję dostanie w czasie procesu linkowania programu.
Jeśli w pliku nagłówkowym masz zmienną globalną bez extern to za każdym razem gdy do jakiegoś pliku c/cpp dołączysz ten plik nagłówkowy dostaniesz NOWĄ instancję tej zmiennej, a podczas linkowania kompilator zacznie krzyczeć, że ma tą zmienną zdefiniowaną więcej niż raz.
Skoro twierdzisz, że bez extern ci działało (i budowało się), znaczy, że dołączasz ten plik nagłówkowy tylko raz (i nie masz definicji w c/cpp), albo nam czegoś nie mówisz (przykładowo użyłeś słowa kluczowego static).

0

Zauważyłem coś dziwnego :

Gdy przy extern mam więcej niż 1 zmienną zostaje ona wyzerowana.

Czyli jeśli mam :

extern unsigned int  test, readT1, readP3, readP4, readNV1, read_freq; 

To zmienna "test" jest wyzerowana a reszta pozostaje bez zmian. Gdy po extern mam tylko jedną pozycję wszystko działa prawidłowo.

dodanie znacznika <code class="c"> - fp

0

Może pokaż całość bo to co piszesz naprawdę nie ma sensu.

0

Cała ta dyskusja jest troche jałowa, bo poprawna odpwiedź brzmi: nie powinieneś używac zmiennych globalnych. I tyle. Nic więcej.

0

Dlaczego ? Nie mogę umieszczać wszystkiego w jednym pliku bo się nie odnajdę w tym wszystkim ...

0

To napisz ten program z głową, jak normalny człowiek. Za pomocą struktur i przekazywania argumentów do odpowiednich funkcji. Zmienne globalne nigdy nie są konieczne, a zwykle oznaczają ze kod jest słabej jakości i że raczej będzie się sypał a nie działał.

1 użytkowników online, w tym zalogowanych: 0, gości: 1