Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

wyłuskanie czyli operator *

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków
wyłuskanie czyli operator *

Postautor: Guru » 14 lip 2006, o 05:54

Czy w Ansi C jest możliwa operacja wyłuskania struktury (kawałek wyjaśniającego kodu)

Kod: Zaznacz cały

struct st1 *w_str; struct st1 str2; str2 = *w_str;
i późniejszy dostęp do składników struktury prze tzw. kropkę czyli:

Kod: Zaznacz cały

str2.skladnik = 4;

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 14 lip 2006, o 07:58

o ile MSVC jest zgodne z Ansi C to chyba tak...
popatrz proszę na taki strzępek kodu:

Kod: Zaznacz cały

struct PERSON { char name [32]; int age; }; struct PERSON person_info; struct PERSON *ptrPerson_info; struct PERSON other_info; person_info.age = 10; strcpy ( person_info.name, "Ola" ); ptrPerson_info = &person_info; other_info = *ptrPerson_info; printf ("%s %d \n", other_info.name, other_info.age );
przypisanie other_info = *ptrPerson_info; spowoduje zwykłe przekopiowanie
obszaru pamięci wskazanego zmienną ptrPerson_info pod adres, gdzie mieszka
zmienna other_info, czyli można je zastąpić
memcpy ( &other_info, ptrPerson_info, sizeof(other_info) ); i będzie to samo...

tasza

ps.
hmm, taka uwaga, dość oczywista....
wszelkie operacje na strukturze other_info nie mają żadnego wpływu
na źródłową strukturę person_info, wskazaną pointerem ptrPerson_info

użycie operatora * bezpośrednio na wskaźniku do struktury wręcz przeciwnie,
operujesz na źródłowej strukturze, tylko zamiast - > masz .

Kod: Zaznacz cały

( *ptrPerson_info ).age = 28; strcpy ( ( *ptrPerson_info ).name , "Kama" ); // sprawdzenie printf ("%s %d \n", person_info.name, person_info.age );

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 14 lip 2006, o 10:34

Bo ja mam kompilator SDCC i właśnie taka operacja nie jest możliwa.
I właśnie o to mi chodziło czy SDCC podąża w stronę ANSI C czy też inne kompilatory wyprzedzają ANSI C. Kiedyś na formum trwała rozmowa na temat tablic.
I oto jakie mam przemślenia:
w przypadku tablic operacja wyłuskania zwraca (w większości kompilatorów) zawartość pierwszej komórki tablicy, natomiast w przypadku rekordów (oczywiście po zastosowaniu operatora = ) powinna kopiować strukturę do nowej lokalizacji w pamięci i to
MI SIĘ NIE MIEŚCI W GŁOWIE
:632:

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 14 lip 2006, o 11:19

trochę głupio wyszło.... :roll:

Kod: Zaznacz cały

void main (void) { struct SSS { unsigned char m_f1; unsigned char m_f2; }; struct SSS var1; struct SSS *pVar; struct SSS var2; pVar = &var1; var2 = *pVar; }
SDCC test.c:12: error 48: cannot assign values to aggregates
sprawdziłam jeszcze w uC/51...
test.c 12: Error: unable to generate code for this expression
a przecież piszą, że uC/51 jest Ansi C.... :|

hmm, wydaje mi się że ja takie właśnie podstawienia robiłam...
w Keilu (C51)...i to na strukturach...no albo coś mi się roi...
jak będzie okazja to też sprawdzę... chyba że ktoś ma teraz Keila pod ręką

tasza

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 88 gości