Skocz do zawartości

[STM32][C] struktura jako argument funkcji


mike660

Pomocna odpowiedź

Cześć

Walczę aktualnie walczę ze strukturą jako argument funkcji.

Mam taki kod:

struct mcp_struct {
    uint8_t mcp;
    uint8_t port;
    uint8_t pin;
} wcisnietyPrzycisk;

uint8_t throwButtonNumber(mcp_struct przycisk)
{
	return 0;
}

I otrzymuję błąd: "unknown type name 'mcp_struct'; did you mean 'struct'?" 

Czy mogę prosić o pomoc ?

Link do komentarza
Share on other sites

Nic dziwnego - w funkcji musisz podać typ argumentu, a typem jest w tym przypadku "struct mcp_struct".

Czyli:

uint8_t throwButtonNumber(struct mcp_struct przycisk)

Poza tym pamiętaj, że w tym przypadku "przycisk" będzie przekazany przez wartość (tzn. wewnątrz funkcji zostanie stworzona kopia struktury) i jeśli w funkcji będziesz chciał zmienić coś w tej strukturze - po wyjściu z funkcji te zmiany zostaną zapominane. Lepiej przekazywać takie rzeczy przez wskaźnik, czyli:

uint8_t throwButtonNumber(struct mcp_struct * przycisk)
{
	// tu coś zmieniasz w "przycisk"
  return 0;
}

i wywoływać:

uint8_t wynik = throwButtonNumber(&wcisnietyPrzycisk);

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

typedef struct mcp_struct {
    uint8_t mcp;
    uint8_t port;
    uint8_t pin;
};

// lub w zależności od kompilatora

typedef struct{
    uint8_t mcp;
    uint8_t port;
    uint8_t pin;
}mcp_struct;

mcp_struct variable = {0};
uint8_t throwButtonNumber(mcp_struct*);
// int main(){
// 	while(1){

variable.mcp = 1;
throwButtonNumber(&variable);

//	 }
// }
uint8_t throwButtonNumber(mcp_struct *v){
  return v->mcp;
}

wtedy wewnątrz funkcji możesz modyfikować przekazaną strukturę za pomocą ->

Edytowano przez Anonim
Link do komentarza
Share on other sites

Warto zauważyć, że struktura to nie to samo co tablica (heh), tj. nazwa struktury nie jest wskaźnikiem do pierwszego elementu tak jak ma to miejsce w przypadku tablicy. Widzę, że wielu początkujących ma z tym kłopot. Definicję struktury trzeba traktować bardziej jak definicję typu.

Przekazywanie parametrów przez wartość ("domyślne" dla struktur) a nie przez wskaźnik ("domyślne" dla tablic) ma jeszcze tę cechę, że paskudnie obciąża procesory. Trzeba mieć dodatkowe miejsce na stosie, zbudować tam ramkę a potem ją posprzątać - to zajmuje i pamięć i czas. Oczywiście czasem tego chcemy (zrobienia kopii i przekazania przez wartość) ale warto wiedzieć co w trawie piszczy i robić to świadomie 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Pojawił się kolejny problem ze strukturą tym razem ze zwracaniem z funkcji. Mam kod :

typedef struct  {
    uint8_t mcp;
    uint8_t port;
    uint8_t mask;

} mcp_out_struct;

mcp_out_struct throwOut(uint8_t out) {
	mcp_out_struct ret;

		ret.mcp = MCP23017_OUT_ADDR;
		ret.port = MCP23017_OUT_ADDR;
		ret.mask = 0;

	return ret;
}

i wywołanie

mcp_out_struct output;

output = throwOut2(2);

 

dostaję błąd:

incompatible types when assigning to type 'mcp_out_struct {aka struct <anonymous>}' from type 'int'

Pomoże ktoś ?

Link do komentarza
Share on other sites

Prawdę mówiąc spodziewałbym się wtedy innego komunikatu o błędzie. Moim zdaniem autor pokazał nam tylko fragment programu i to nie ten, który jest używany podczas kompilacji.

Ale jak wyjaśnimy o co chodzi i z tymi nazwami, to będzie pewnie łatwiej coś doradzić.

  • Lubię! 1
Link do komentarza
Share on other sites

9 minut temu, Elvis napisał:

Prawdę mówiąc spodziewałbym się wtedy innego komunikatu o błędzie.

Jakiego (serio pytam)? Bo próba skompilowania czegoś takiego:

struct costam {
    int a;
};

int main(void)
{
    struct costam x;
    x=jakasfunkcja(2);
    return 0;
}

skończyła się:

$ gcc -o xxx xxx.c
xxx.c: In function ‘main’:
xxx.c:8:7: warning: implicit declaration of function ‘jakasfunkcja’ [-Wimplicit-function-declaration]
     x=jakasfunkcja(2);
       ^~~~~~~~~~~~
xxx.c:8:6: error: incompatible types when assigning to type ‘struct costam’ from type ‘int’
     x=jakasfunkcja(2);
      ^

czyli w sumie czymś podobnym... a wyświetlanie ostrzeżeń co poniektórzy wyłączają żeby sobie nie psuć humoru 🙂

 

Edytowano przez ethanak
  • Lubię! 1
Link do komentarza
Share on other sites

Dzięki za pomoc, zła nazwa wywoływanej funkcji była spowodowana różnymi próbami uruchomienia programu.

Wydawało mi się że nawet w przypadku prawidłowego wywołania pojawiał się ten błąd ale to pewnie mylne przekonanie 🙂

W między czasie przerobiłem funkcję na działającą na wskaźniku i program ruszył.

Teraz już niestety nie jestem w stanie wrócić do poprzedniej wersji ale za chwilę z ciekawości napiszę sobie ją na nowo żeby sprawdzić.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.