Skocz do zawartości

Adres to pola struktury


multidot

Pomocna odpowiedź

Cześć.

Mam następującą strukturę

typedef struct MojaStruktura_t{
	uint8_t line;
	char buf[10];
}MojaStruktura;

i teraz chciałbym pobrać adres do np 2 elementu z buf. 

&MojaStruktura.buf

w ten sposób mogę pobrać adres buf. Jak przesunąć teraz ten adres na drugi element?

Link do komentarza
Share on other sites

To polecam jeszcze eksperyment:

typedef struct {
    int vel;
    char buf[10];
} costam_t;

I w setupie:

void setup() {
    Serial.begin(115200);
    costam_t costam = {1, {1, 2, 3}};

    Serial.print("Sizeof int [B] "); Serial.println(sizeof(int));
    Serial.print("Sizeof char [B] "); Serial.println(sizeof(char));
    Serial.println((int)(costam.buf + 2));
    Serial.println((int)(&costam.buf[2]));
    Serial.println((int)((char *)(&costam.vel) + sizeof(int) + 2));
    Serial.println((int)((char *)(&costam) + sizeof(int) + 2));
}

W wyniku będzie to samo 🙂 

Sizeof int [B] 4
Sizeof char [B] 1
1073422210
1073422210
1073422210
1073422210

W pierwszym przypadku otrzymujesz adres bufora posługując się jego nazwą i zwiększać go o 2 bajty dodając zmienną skojarzoną z adresem char * czyli adresem o koku 1B.

W drugim przypadku to co pisał @farmaceuta z użyciem indeksowania i operatora, który wyciąga adres na zmienną.

Trzeci przypadek to tylko edukacyjny - bierzesz inną zmienną ze struktury, adres rzutujesz na adres skojarzony ze zmienną char i dodajesz do niej 4 + 2 pozycje. Dlaczego tyle? 4 B to tyle ile zajmuje int, a że posługujemy się adresem zmiennych char to musimy zrzutować adres na char * i później skakać o 1B. Więc aby pominąć int trzeba dodać 4, a później przejść do komórki 2 dodajemy kolejne 2. Można zauważyć że dane w strukturze są podobnie jak w tablicy poukładane.

Ostatni przypadek jest podobny i pokazuje że adres  pierwszego elementu struktury to też adres struktury.

  • Lubię! 2
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

@Gieneq Jak lubisz ciekawostki, to proponuję przeanalizować taki program:

void setup() {
  int buf[3] = { 1, 2, 3, };

  Serial.print("v1 = "); Serial.println(buf[2]);
  Serial.print("v2 = "); Serial.println(2[buf]);
  Serial.print("v3 = "); Serial.println((int)&buf[2]);
  Serial.print("v4 = "); Serial.println((int)&2[buf]);
}

Pytanie z gatunku tych podczas rozmowy o pracę - czy program się skompiluje? Jakie będą błędy? Co trzeba ew. poprawić, żeby się kompilował i jakie będą wyniki?

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

@farmaceuta yup, 3,4 to wyciągnięcie adresu - po to też rzutowanie na int, bo Serial Arduino nie wie co to typ * i tego nie wypisze

Cytat

A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).

@Elvis ciekawy przykład 🙂 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

5 minut temu, Gieneq napisał:

@farmaceuta yup, 3,4 to wyciągnięcie adresu - po to też rzutowanie na int

Tak tak...oczywiscie zauwazylem to wyciaganie adresu i tak skojarzylem ze to rzutowanie na int wlasnie ze wzgledu na adres, ale noga nie tupalem i sie nie upieralem bo za cieniutki Jestem🙂

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.