Operacje na pamięci PDF Drukuj Email
Wpisał doctor   
Poniedziałek, 12. Marzec 2007 02:49
Operacje na pamięci

W pamięci RAM, tzw pamięci danych przechowywane są zmienne wymagane podczas pracy programy.
Sam program jest ładowany do pamięci, tyle że jest to pamięć programu.

Poniżej przedstawię przydatne funkcje, ułatwiające pracę z pamięcią.

funkcja memset - przydatna gdy chcemy zapełnić pamięć tymi samymi elementami, np. zerami.
void *memset(void *bufor, char znak, rozmiar bufora)

Przykład
Kładziemy na formę 1 Button oraz 2 Labele.
Zdarzenie OnClick przycisku uzupełniamy

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char bufor[] = "www.doctor.programuj.com";
Label1->Caption = bufor;
memset(bufor, '0', 5);
Label2->Caption = bufor;

Jak widać, funkcja memset zastąpi pięc pierwszych znaków naszego bufora zerami, czyli zacznie czyścić bufor.
W aplikacjach konsolowych wymaga włączenia bibliotek
#include <string.h>
#include <stdio.h>
#include <mem.h>


funkcja memcpy kopiuje blok n-bajtów ze Ľródła do miejsca docelowego.
void *memcpy(void *przeznaczenie, const void *zrodlo,int n)
{viewonly="registered}
 Przykład

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char zrodlo[] = "******************************";
char przeznaczenie[] = "abcdefghijlkmnopqrstuvwxyz0123456709";
char *ptr;

Label1->Caption = przeznaczenie;

ptr = (char *) memcpy(przeznaczenie, zrodlo, strlen(zrodlo));

if (ptr)
Label2->Caption = przeznaczenie;
else
ShowMessage("błąd memcpy\n");
}

W aplikacjach konsolowych wymaga dołączenia mem.h, string.h.

funkcja memcmp porównuje dwa bloki pamięci na długości pierwszych n-bajtów.
int memcmp(const void *blok1, const void *blok2, int n)
Funkcja zwraca wartość równą zero jeśli porównywane bloki są równe. W innym przypadku zwraca wartość różną od zera.



1 przypadek: bloki nie są takie same.

char *blok1 = "ABCDE123";
char *blok2 = "ABCDe237";
int status = memcmp(blok1, blok2, 5);
//The strings to position 5 are:
if (status)
Label1->Caption = "Nie takie same";
if(status == 0)
Label1->Caption = "Takie same";

Zwracam uwagę, że porównywane jest tylko 5 pierwszych znaków z każdego bloku.

2 przypadek: porównywane bloki są takie same.

char *blok1 = "ABCDE123";
char *blok2 = "ABCDE237";
int status = memcmp(blok1, blok2, 5);
//The strings to position 5 are:
if (status)
Label1->Caption = "Nie takie same";
if(status == 0)
Label1->Caption = "Takie same"; 

Wymagane biblioteki mem.h, string.h.

Rezerwacja bloku pamięci o długości n-bajtów - funkcja malloc.
void *malloc(int n)
Jeśli operacja alokacji pamięci przebiegnie poprawnie, funkcja zwraca wskaĽnik do bloku pamięci. Jeżeli nie ma wystarczająco dużo miejsca w pamięci n aalokację bloku, to funkcja malloc zwraca NULL.

char *wskaznik;// wskaznik do bloku pamieci
if ((wskaznik = (char *) malloc(50)) == NULL)// rezerwacja 10 bajtów pamięci
Label1->Caption = "Nie udało się zarezerwować pamięci";
else
{
Label1->Caption = "Zarezerwowałem pamięć";
strcpy(wskaznik, "Kopiuję przykładowe dane do pamięci");
Label2->Caption = wskaznik;
}

Wymagane biblioteki alloc.h, stdlib.h.

Pozostałe funkcje do przydziału pamięci:
void *realloc(void *block, int n) - zmienia rozmiar przydzielonej poprzednio pamięci na n-bajtów.
void *calloc(int n, int rozmiar_zmiennej) - do dynamicznego przydziału pamięci. Rezerwacja n-jednostek pamięci.

Przykład
char *wskaznik = NULL;
wskaznik = (char *) calloc(10, sizeof(char));
// alokacja 10 jednostek typu char
strcpy(wskaznik, "doctor");
Label1->Caption = wskaznik;
free(wskaznik);
{/viewonly}

Zwalnianie przydzielonej pamięci - skoro umiemy ją alokować, to musimy umieć ją i zwalniać.
Służy do tego funkcja free.
void free(void *block)

Zwalnianie pamięci w powyższym przykładzie:

 free(wskaznik);

Komentarze
Dodaj nowy Szukaj
+/-
Napisz komentarz
Nick:
E-mail:
 
Strona www:
Tytuł:
UBBCode:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Proszę wpisać kod antyspamowy widoczny na obrazku.

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

Ostatnia aktualizacja: Piątek, 10. Lipiec 2009 13:58
 
 

Losowy obraz

b7.jpg

Gościmy

Naszą witrynę przegląda teraz 30 gości 




| | | |