• dziub-dziub  
    Outsider
    Wydział: W-4 EKA
    Rok studiów: 1

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Witam,
    Czy ktoś może mi wyjaśnić co dokładnie ma robić program z poniższego polecenia?? Bo mam problem ze zinterpretowaniem polecenia :/


    Ćwiczenie wykorzystania wskaźników jako alternatywnej metody dostępu
    do zmiennych tworzonych przez kompilator tzn. zmiennych globalnych i lokalnych.
    ( Patrz przykład z wykładu nr 5 strona nr 3 )

    - Utwórz zmienne różnych typu: char, int, long, ...
    - Napisz instrukcje zapisu wartości do jednej zmiennej (np. typu long)
    za pomocą adresu innej zmiennej (tego samego typu lub innego)
    - Kontrolnie wyświetlaj zawartości zmiennych po dokonaniu tych zapisów

    Dodatkowo można napisać fragment programu, który wyświetli
    zawartości poszczególnych bajtów zajmowanych w pamięci
    przez w/w zmienne.
    _________________
    ----------------------------------------------------------
    Szukam dorywczej pracy w weekendy i wieczorami przy nagłośnieniu we Wrocławiu. W klubie w sali koncertowej, w teatrze, przy imprezach plenerowych!!!
    d41d8cd98f00b204e9800998ecf8427e
  • VIPscho  
    Wydział: W-4 EKA

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Zadanie faktycznie niezbyt zrozumiałe... Może w tych notatkach z wykładu jest coś co by to rozjaśniło... Jedyne co mi do głowy przychodzi to cos w stylu

    #include<stdio.h>

    void dumpmem(void *ptr, int nbytes)
    {
    while(nbytes--) {
    int val=*(unsigned char*)ptr;
    printf("%d ", val);
    ptr++;
    }
    printf("\n");
    }

    int main()
    {
    int i=0x11111111;
    printf("%d\n", i);
    dumpmem(&i, sizeof(int));
    *((char *)&i)=65;
    printf("%d\n", i);
    dumpmem(&i, sizeof(int));

    return 0;
    }
    d41d8cd98f00b204e9800998ecf8427e
  • dziub-dziub  
    Outsider
    Wydział: W-4 EKA
    Rok studiów: 1

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • ee a może jednak coś co nie jedzie na bitach??
    _________________
    ----------------------------------------------------------
    Szukam dorywczej pracy w weekendy i wieczorami przy nagłośnieniu we Wrocławiu. W klubie w sali koncertowej, w teatrze, przy imprezach plenerowych!!!
    d41d8cd98f00b204e9800998ecf8427e
  • VIPscho  
    Wydział: W-4 EKA

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • dziub-dziub napisał/a:
    ee a może jednak coś co nie jedzie na bitach??


    A jest coś co robi komputer co nie jedzie po bitach ?
    Tak czy inaczej - podaj namiary na te notatki z wykładu to może uda się zrozumieć co autor miał na myśli pisząc to czego nie napisał ;)
    d41d8cd98f00b204e9800998ecf8427e
  • dziub-dziub  
    Outsider
    Wydział: W-4 EKA
    Rok studiów: 1

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • chodzi mi o nie operowanie na bitach kapishi?? (kompilator z komputerem niech sobie operują ja nie chcę tego widzieć xD )

    link do listy zadani z laborek:

    http://marek.piasecki.sta...ium.html#LAB_5_
    _________________
    ----------------------------------------------------------
    Szukam dorywczej pracy w weekendy i wieczorami przy nagłośnieniu we Wrocławiu. W klubie w sali koncertowej, w teatrze, przy imprezach plenerowych!!!
    d41d8cd98f00b204e9800998ecf8427e
  • VIPscho  
    Wydział: W-4 EKA

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • dziub-dziub napisał/a:
    chodzi mi o nie operowanie na bitach kapishi?? (kompilator z komputerem niech sobie operują ja nie chcę tego widzieć xD )


    W tym kodzie nie ma żadnego magiczniego operowania na bitach. Może parę mniej oczywoistych rzeczy:

    int i=0x11111111;

    To nie jest żadna "magiczna" operacja na bitach, tylko zwykłe zainicjowanie wartości zmiennej całkowitej za pomocą stałej w reprezentacji szesnastkowej. Wygodne, bo od razu wiadomo co jest w którym bajcie - w tym przypadku każdy z nich zawiera 0x11, czyli 17. Ale to nieistotne.

    int val=*(unsigned char*)ptr;

    ptr jest wskaźnikiem na void (żeby można było funkcji przekazać adres zmiennej dowolnego typu). Tu konwertujemy go na wskaźnik do unsigned char, a następnie wyciągamy wartość z tej komórki pamięci i wstawiamy ją do zmiennej val.

    *((char *)&i)=65;

    To jest najmniej oczywiste. Oszukujemy kompilator i próbujemy mu wmówić, że "i" jest zmienną typu char a nie int.
    1. bierzemy adres zmiennej i - &i - jest on typu "int *"
    2. konwertujemy go do typu "char *"
    3. robimy dereferencję, czyli odwołujemy się do komórki pamięci na którą pokazuje nasz "oszukany" wskaźnik
    4. do tej komórki wstawiamy 65

    Skutki tego oszustwa widać po uruchomieniu programu.
    d41d8cd98f00b204e9800998ecf8427e

Powered by phpBB modified by Przemo © 2003 phpBB Group. Then, after many years modified again, this time by Piotrek © 2014
Strona wygenerowana w 18,6ms. Zapytań do SQL: 17