Jak usunąć funkcje i zmienną w C?


(fedora24x) #1

Mam dwa prolemy, dziwne ale musze je rozwiązać.

 

1)Mama kod:

int cyfra = 123;

lub

int cyfra;
cyfra = 123;

I teraz chce użyć tej nazwy ponownie

int cyfra = 123;
char cyfra = "b";

ale zmienna już ma inny typ. Jak wiadomo kompilator wywala konflikt nazw. Jak moge usunąć zbedną zmienną z pamięci?

Tak?

delete cyfra;

2) Analogicznie jak usunąć funkcje z pamięci? Jak wogóle się da?


(kostek135) #2

Nie da się. Taka operacja dość znacznie utrudniła by analizę składniową przez kompilator. Poza tym w przypadku zmiennych lokalnych jest to wykluczone, by programista zarządzał stosem funkcji.


(tomms) #3

Pewną namiastką usuwania może być trzymanie zmiennych w osobnym zakresie:

 

int main()
{
    {
        int cyfra = 132;
    }
    {
        char cyfra = 'b';
    }
}

(nintyfan) #4

W C++ wprowadzono pseudotyp auto. Może jest też w standardzie C, i może on pomoże.


(Rolek0) #5

Nie pomoże.

auto w C++11 i późniejszych oznacza, że typ ma być wydedukowany przez kompilator, ale musi być to konkretny typ i nie może być potem zmieniany.

W C istnieje słowo auto ale oznacza ono po prostu zmienną lokalną (jest po pozostałość po języku B, w C nie ma konieczności pisania auto przy zmiennych lokalnych chociaż można to robić jak się bardzo chce, w C++ dla kompatybilności z C również można używać auto w tym znaczeniu).

 

Sam język czegoś takiego nie oferuje.

Systemy operacyjne zwykle udostępniają obsługę bibliotek ładowanych dynamicznie, ale jest to zależne od konkretnego systemu operacyjnego.



(fedora24x) #6

Jeżeli istnieją wskaźniki na funkcje to da sie taki obszar wyzerować na długości z sizeof?


(nintyfan) #7

To zależy od systemu operacyjnego. Pewnie da się pod każdym, lecz najpierw (być może) musiałbyś wywołáć jakąś funkcję do zmiany atrybutów regionu pamięci. Kod raczej powinien być nie zapisywalny, co umożliwia tryb chroniony lub PAE.


(Rolek0) #8

W C nie można zmierzyć długości funkcji, funkcja nie musi się znajdować w ciągłym obszarze pamięci i niektóre fragmenty kodu mogą być współdzielone przez kilka funkcji.

Z resztą, do czego Ci to? :wink:


(mikolaj_s) #9

Przemyśl ten kod:

int main()
{
  int x = 345;
  void* a = &x;
  cout << *((int*) a) << endl;
  char b = 'b';
  a = &b;
  cout << *((char*) a)<< endl;
  return 0;
}

Uzyskujesz bardzo podobny efekt. Podobnie da się zrobić ze wskaźnikami na funkcję.

Z drugiej strony robisz chyba jakiegoś potworka programistycznego skoro chcesz mieć coś takiego :wink: Może zastanów się co chcesz osiągnąć.


(fedora24x) #10
  1. Potrzebuje wywoływać funkcje przez jej wskaźnik lub skok do poczatku jej kodu.

  2. Potrzebuje z poziomu C sprawdzić ile komputer ma pamięci RAM.

  3. Potrzebuje zrobić funkcje alloc i free od zera w C.


(Rolek0) #11

http://lmgtfy.com/?q=C+wska%C5%BAnik+do+funkcji

Z poziomu C nie da się. Musisz zapytać system operacyjny, a jak sam piszesz system operacyjny to musisz przeczytać w dokumentacji do swojej platformy jak to sprawdzić.

Bierzesz duży blok pamięci i dzielisz wedle własnego uznania :wink:

Skąd wziąć duży blok pamięci? Prosisz o niego system operacyjny, a jak sam piszesz OS to masz do dyspozycji cały RAM :wink:


(enedil) #12

Myślę, że naprawdę nie potrzebujesz.


(nintyfan) #13

Biblioteka standardowa języka C w wielu przypadkach nie korzysta z wywołań jądra, tylko alokuje pamięć we wcześniej zaalokowanym bloku, więc zrobienie alloc i free jest jak najbardziej możliwe. Po prostu zadeklarujesz globalną tablicę i nią zarządzasz. Haiku jest na mit/x11, więc chyba możesz podglądnąć ich alokator.


(Ddiabelekk) #14

http://rypress.com/tutorials/objective-c/c-basics#void-pointers