Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Podobne dokumenty
4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Stałe i zmienne znakowe. Stała znakowa: znak

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Podstawy programowania w języku C++

Wskaźniki. Informatyka

Struktury. Przykład W8_1

Podstawy programowania komputerów

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Biblioteka standardowa - operacje wejścia/wyjścia

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Lab 9 Podstawy Programowania

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

DYNAMICZNE PRZYDZIELANIE PAMIECI

Stałe, tablice dynamiczne i wielowymiarowe

Programowanie w języku C++

Języki i metodyka programowania. Wskaźniki i tablice.

Funkcja, argumenty funkcji

Tablice, funkcje - wprowadzenie

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Uzupełnienie dot. przekazywania argumentów

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Struktury czyli rekordy w C/C++

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

Wskaźniki w C. Anna Gogolińska

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Funkcje zawarte w bibliotece < io.h >

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Języki programowania. Karolina Mikulska-Rumińska Pokój 573, tel Konsultacje wtorek 9-10.

Programowanie w językach wysokiego poziomu

Funkcje zawarte w bibliotece < io.h >

Ghost in the machine

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Plik jest reprezentowany przez strumień znaków (bajtów) o zmiennej długości. Koniec strumienia identyfikowany jest znacznikiem końca pliku EOF.

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Pliki. Informacje ogólne. Obsługa plików w języku C

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Programowanie Proceduralne

Tablice, funkcje, wskaźniki - wprowadzenie

Wskaźniki. Programowanie Proceduralne 1

tablica: dane_liczbowe

KURS C/C++ WYKŁAD 6. Wskaźniki

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

ZASADY PROGRAMOWANIA KOMPUTERÓW

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Programowanie Proceduralne

Podstawy programowania w języku C++

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 7- sem.iii. M. Czyżak

INFORMATYKA Studia Niestacjonarne Elektrotechnika

ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C klasy pamięci ISO/ANSI C. ISO/ANSI C klasy pamięci. ISO/ANSI C klasy pamięci

Wstęp do programowania 1

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Klasa iostream... 1 Klasy ofstream, ifstream Struktura FILE... 8

Pliki. Informacje ogólne. Obsługa plików w języku C

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Podstawy programowania skrót z wykładów:

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Języki i metodyka programowania. Wprowadzenie do języka C

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Podstawy Programowania. Zmienne dynamiczne, struktury, moduły programowe

ISO/ANSI C klasy pamięci ISO/ANSI C. ISO/ANSI C klasy pamięci. ISO/ANSI C klasy pamięci. Pamięć programu. ISO/ANSI C klasy pamięci

Zmienne, stałe i operatory

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

MATERIAŁY POMOCNICZE PODSTAWY PROGRAMOWANIA Na podstawie: Programowanie w C - Stworzone na Wikibooks, bibliotece wolny podręczników

Funkcja (podprogram) void

Wskaźniki. Pamięć dynamiczna

external Data Representation

Język ANSI C tablice wielowymiarowe

Programowanie Procedurale. Pliki w języku C++

Programowanie Proceduralne

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

7 Przygotował: mgr inż. Maciej Lasota

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Transkrypt:

Tablice w argumentach funkcji Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku Przykład: char str[] = abcdef ;... fun(str); // argument faktyczny to id tablicy adres pierwszego bajtu fun_1(str); // argument faktyczny to id tablicy adres pierwszego bajtu... void fun(char my_str[]) /* przekazanie argumentu przez referencje */ char symb; int pos = 2;... symb = my_str[pos]; // symb = c

char str[] = abcdef ;... fun(str); // argument faktyczny to id tablicy adres pierwszego bajtu fun_1(str); // argument faktyczny to id tablicy adres pierwszego bajtu... void fun_1(char *ptr_str) /* przekazanie argumentu po wskaźniku */ char symb; int pos = 2;... symb = *(ptr_str+pos); // symb = c

char str[] = abcdef ;... fun(&str[3]); fun_1(str+3);... void fun(char my_str[]) /* przekazanie argumentu przez referencje */ char symb = my_str[0]; // symb = d, my_str = def void fun_1(char *ptr_str) /* przekazanie argumentu po wskaźniku */ char symb = *(ptr_str); // symb = d, ptr_str = def

Przykład WW6_1

Tablice znakowe o dwóch indeksach Definicja: typ id_tablicy[liczba_stała_1][liczba_stała_2] id_tablicy to jest wskaźnik typu typ. Przykład: #define MAX_DIM_1 128 #define MAX_DIM_ 2 824 int main() char str[5][128]; double A[MAX_DIM_1][MAX_DIM_2]; Pierwsza definicja rezerwuje w pamięci 5x128 słów typu char (5x128x1 b), druga 128 x 824 słów typu double (128x824x8 b)

Dostęp do elementów tablicy: char str[3][4]; char symb = 'a'; int i, j; for(i=0; i<3; i++) for(j=0; j<4; j++, symb++) str[i][j] = symb; str[ ][ ] j = 0 j = 1 j = 2 j = 3 i = 0 a b c d i = 1 e f g h i = 2 i j k l

Dostęp do elementów tablicy: Elementy tablicy dwuwymiarowej są zarezerwowane w pamięci ciągłe, wiersz po wierszu: int a[2][3]; 0 1 2 3 4 5 Pozycje w pamięci a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] wiersz 1 wiersz 2 Kolejność rozmieszenia elementów tablicy dwuwymiarowej w pamięci 0 a[0][0] 1 a[0][1] 2 a[0][2] 3 a[1][0] 4 a[1][1] 5 a[1][2] Przykład W6_2

Inicjalizacja tablicy dwuwymiarowej int ii[2][3] = 0, 1, 2, 3, 4, 5; char str[3][4] = a, b, c, d, e, f, g, k ; char str[3][4] = 97, 98, 99, 100, 101, 102, 103, 104 ; Wykł. W4 pliki.

Funkcja fgets: char *fgets( char *str, int n, FILE *stream ); char *str wskaźnik na ciąg znaków (bufor) int n maksymalna ilość symbolów w buforze FILE *stream wskaźnik do struktury typu FILE (identyfikuje plik, z którego pobieramy dane. Zwraca: wskaźnik na bufor str przy zakończeni normalnym; NULL przy czytaniu pliku spotkaliśmy EOF lub przy czytaniu wystąpił błąd. Czyta znaki z bieżącej pozycji pliku do pierwszego spotkania symbolu '\n' (razem z symbolem '\n ) lub do końca pliku lub dopóki nie przeczyta n-1 znaków (koniec bufora) - co się pierwsze zdarzy. Wynik jest zapisany w str i jest dopisany symbol '\0'. Znak '\n', jeśli był przeczytany, jest dołączany do wiersza tekstowego.

Przykład: #include <stdio.h> int main( void ) FILE *stream; char line[100]; if((stream = fopen("crt_fgets.txt", "r" ))!= 0 ) if( fgets( line, sizeof(line), stream ) == NULL) printf( "fgets error\n" ); else printf( "%s", line); fclose( stream ); return 0;

Przykład używania tablicy dwuwymiarowej - W6_3 W przykładzie poprzednim: char str[no_lines][no_symb_in_line]; nie zależnie od rozmiaru problemu alokujemy w pamięci NO_LINES*NO_SYMB_IN_LINE*sizeof(char) bajtów. Przy tym faktycznie używamy dla wierszu o indeksie i (faktyczny_ilość_znaków_w_wiersze+1)*sizeof(char) bajtów. (funkcja fgets(...) dopisuje symbole specjalne \n i \0 po każdym wywołaniu (W6_3 debuger).

Uwaga! Statyczna alokacja pamięci często jest bardzo nieskuteczna. 1. Dla każdego wiersza jest zarezerwowano NO_SYMB_IN_LINE symboli typu char, a maksymalna ilość symboli w wierszu dla tego przykładu 9. Więc pamięć, która jest potrzebna dla alokacji najdłuższego wiersza (9+2)*sizeof(char) bajtów. 2. Zarezerwowano pamięć dla NO_LINES wierszy, a faktycznie użyto 3 wierszy. Problem polega na tym, że przy statycznej alokacji z góry nie wiadomo, ile pamięci będzie potrzebne dla podanego problemu. I dla tego wychodzi, że dla dużych zagadnień zarezerwowanej pamięci będzie za mało, a dla małych za dużo.

Dynamiczna alokacja pamięci Pamięć pozostaje wydzieloną i zwolnioną w trakcie wykonania kodu programy. Nadaje możliwość skutecznie używać resursy pamięci. #include <malloc.h> void *malloc( size_t size ); Alokuje w pamięci blok o rozmiarze size_t size bajtów. Zwraca wskaźnik do początku tego bloku lub NULL przy błędnym zakończeniu (nie wystarczyło pamięci). void *calloc( size_t num, size_t size ); Alokuje w pamięci miejsce dla tablicy z num elementów, każdy z których ma długość size. Każdy element będzie ustawiony na zero. Zwraca wskaźnik na początek tablicy lub NULL przy błędnym zakończeniu (nie wystarczyło pamięci).

Dynamiczna alokacja pamięci void *realloc( void *memblock, size_t size ); Zmienia rozmiar bloku, zaalokówanego w pamięci. Argument memblock jest wskaźnikiem do początku bloku. Jeśli memblock = NULL, realloc alokuje blok pamięci o rozmiarze size. Jeśli memblock nie NULL, to musi być wskaźnikiem, zwróconym przez poprzednie wywołanie malloc, calloc, realloc. Zwraca wskaźnik typu void na ponownie alokowany blok, przy czym blok może być przesunięty w pamięci po realokacji.

Dynamiczna alokacja pamięci void *realloc( void *memblock, size_t size ); Gdy pamięci nie wystarcza dla rozszerzenia bloku do potrzebnego rozmiary, pierwotny blok pozostaje bez zmian, a realloc zwraca NULL. Gdy size = 0, realloc zwalnia pamięć, przy czym wskaźnik memblock nie zmienia swojej wartości.

Dynamiczna alokacja pamięci void free( void *memblock ); Zwalnia blok pamięci memblok, który był wydzielony malloc, calloc, realloc. Jeśli wskaźnik nie jest zainicjowany (!= 0x0000000) albo pamięć pozostała popisana, albo wskaźnik był zmieniony tak, że nie wskazuje do początku bloku, wywołanie free(...) powodóje page falt. size_t _msize(void * memblock); Zwraca rozmiar bloku pamięci memblock, alokowanego dynamicznie. Wartość wskaźnika memblock powinna być dokładnie taką, jaką zwrócili funkcji malloc, calloc, realloc. Jeśli w funkcje _msize podstawić wartość wskaźnika do bufora, alokowanego statycznie, dostaniemy page fault.

Dynamiczna alokacja pamięci double a[100], *b = NULL; size_t buffsize; Przykład if((b = (double *)malloc(100*sizeof(double))) == NULL) //bład przy alokowaniu pamięci.. buffsize = sizeof(a); //800 rozmiar tablicy w B, alokowanej statycznie buffsize = sizeof(b); //4 rozmiar słowa (wskaźnika) platforma ia32 //8 rozmiar słowa (wskaźnika) platforma x64 buffsize = _msize((void *)a); // page fault: a nie jest alokowane // dynamicznie buffsize = _msize((void *)b); // 800 rozmiar tablicy w B, alokowanej //dynamicznie

#define MAX_SYMB 256 Dynamiczna alokacja pamięci int main( void ) char *string; string = (char *)malloc(max_symb*sizeof(char)); if( string == NULL ) printf( brak pamięci\n" ); else printf( pamięć pozostała wydzielona dla bloku string\n" ); free( string ); printf( pamięć zwolniona\n" );

Dynamiczna alokacja pamięci // This program uses calloc to allocate space for // 40 long integers. It initializes each element to zero. #include <stdio.h> #include <malloc.h> int main( void ) long *buffer; buffer = (long *)calloc( 40, sizeof( long ) ); if( buffer!= NULL ) printf( "Allocated 40 long integers\n" ); else printf( "Can't allocate memory\n" );... free( buffer );

Dynamiczna alokacja pamięci Fragmentowanie heap 1 alokowanie 2 alokowanie 3 alokowanie s1 Dostępny obszar heap 1 alokowanie 3 alokowanie s2 s1 Dostępny obszar heap Dostępny obszar heap Rozmiar największego bufora, który można zaalokować dynamicznie, wynosi maxs1, s2, a nie s1 + s2.

Dynamiczna alokacja pamięci Fragmentowanie heap 1 alokowanie 2 alokowanie s1 Dostępny obszar heap Realokujemy bufor 2 1 alokowanie Dane do realokowania 2 alokowanie s2 Dane po realokowaniu Dostępny obszar heap OK, pamięć pozostała nie fragmentowana

Dynamiczna alokacja pamięci Fragmentowanie heap 1 alokowanie 2 alokowanie 3 s1 Dostępny obszar heap Realokujemy bufor 2 1 alokowanie 2 Dane po realokowaniu s2 3 s1 Dostępny obszar heap Pamięć fragmentowana, jednak rozmiar dostępnej części heap pozostał taki samy

Dynamiczna alokacja pamięci Fragmentowanie heap 1 alokowanie 2 alokowanie 3 s1 Dostępny rozmiar heap Realokujemy bufor 2 Dane do realokowania 1 alokowanie s2 3 2 alokowanie Dane po realokowaniu Dostępne obszary heap s3 Pamięć pozostała fragmentowana. Rozmiar największego bufora, który można zaalokować dynamicznie, wynosi maxs2, s3, a nie s2 + s3.

Defragmentowanie heap heap 1 alokowanie 2 alokowanie Zapisujemy bufory do pliku i zwalniamy pamięć heap plik na dysku nrec rec_descriptor 1 alokowanie 2 alokowanie (przykład W4_2) Ilość rekordów deskryptor rekordów Alokujemy pamięć dla każdego poszczególnego rekordu i odczytujemy dane z pliku 1 alokowanie 2 alokowanie heap: brak fragmentowania

W C istnieje dwie możliwości reprezentacji tablic dwuwymiarowych: pierwsza to przez definicje tablicy dwuwymiarowej: int a[10][34]; //alokacja statyczna druga to przez tablice wskaźników: int *ptr_a[10]; //statyczna alokacja tablicy wskaźników for(i=0; i<10; i++) //alokacja pamięci dla każdego wiersza każdy wiersz może mieć swoją //dlugość ptr_a[i] = (int *)malloc(dlugosc_w_bajtach[i]); if(!ptr_a[i])...

Zwolnienie pamięci: for(i=0; i<10; i++) //Uwaga! Zwolnienie może być wykonane tylko jeden raz! if(ptr_a[i]!= NULL) free(ptr_a[i]); ptr_a[i] = NULL; Ta metoda ma fiksowaną ilość wierszy (tablicy wskaźników), przecież długość każdego wiersza może być dowolną.

Wskaźnik do tablicy wskaźników (wskaźnik do wskaźnika) może być dowolna ilość wierszy i dowolna długość każdego wiersza. char **str = NULL; //alokujemy pamięć dla tablicy wskaźników: str = (char **)malloc(ilość_wierszy*sizeof(char *)); if(!str)...//obsługa błędnej sytuacji //alokujemy pamięć dla elementów każdego wiersza for(i=0; i<ilość_wierszy; i++) str[i] = (char *)malloc(długość_wiersza_i*sizeof(char)); if(!str[i])...//obsługa błędnej sytuacji

Zwolnienie pamięci (wskaźnik do wskaźnika): //sprawdzamy, czy str jeszcze nie zwolnione if(str) for(i=0; i<ilość_wierszy; i++) // sprawdzamy, czy str[i] jeszcze nie zwolnione if(str[i]) free(str[i]); //zwalniamy str[i] str[i] = NULL; //zapobiegamy zwolnieniu wielokrotnemu free(str); //zwalniamy str wskaźnik na tablice wskaźników str = NULL; // zapobiegamy zwolnieniu wielokrotnemu

str to jest wskaźnik do wskaźnika wskazuje do tablicy wskaźników 0x012ff54 str str[0] str[1] str[2] 0x012ff54 0x012ff58 0x012ff5c Elementy tablicy o indeksie 0 str[0][0]=a str[0][1]=b str[0][2]=c str[0][3]=d Elementy tablicy o indeksie 1 str[1][0]=e str[1][1]=f str[1][2]=g str[1][3]=h Elementy tablicy o indeksie 2 str[2][0]=i str[2][1]=j str[2][2]=k str2][3]=l Tablica wskaźników str[ ] str[ ][ ] j = 0 j = 1 j = 2 j = 3 i = 0 a b c d i = 1 e f g h i = 2 i j k l

Pamięć komputera jest liniową: str str[0] str[1] str[2] str[0][0]... str[1][0]... str[2][0]... Wskaźnik do wskaźnika Tablica wskaźników Elementy tablicy o dwóch indeksach Przy dynamicznej alokacji pamięć pomiędzy wierszami może być nie ciągłą Przykład W7_1 Przykład W7_2 czytanie z pliku. Przykład Lab_5 Wiersze tablicy. Inne obiekty

Funkcje roboty z tekstami: (#include <stdlib.h>) char *_itoa( int value, char *str, int radix ); Przetwarza cyfry liczby całkowitej value w ciąg znaków (do 33 symbolów), zakończony \0, i zapisuje w str ; radix = [2,36] podstawa potęgi (radix = 10 liczbę dziesiętne, radix = 2 liczbę binarne). Zwraca wskaźnik na str. Nie identyfikuje zakończenia błędnego. int atoi( const char *str ); Przetwarza ciąg znaków str (zakończony \0 ), które mogą być potraktowane jako cyfry, w liczbę typu integer. Czytanie str będzie zakończone przy pierwszym spotkaniu znaku, który nie może być potraktowany jako cyfra. Zwraca liczbę typu int wynik przetwarzania. Analogicznie funkcje char *_ecvt( double value, int count, int *dec, int *sign ); char *_fcvt( double value, int count, int *dec, int *sign ); Przetwarzają liczbę zmiennoprzecinkowe value w ciąg znaków.

double atof( const char *str ); Przetwarza ciąg znaków w liczbę typu double. Szczegóły są podane w MSDN. Przykład: #include <stdlib.h> #include <stdio.h> int main( void ) int decimal, sign; char *buffer; int precision = 10; double source = 3.1415926535; Output: source: 3.1415926535 buffer: '3141592654' decimal: 1 sign: 00 buffer = _ecvt( source, precision, &decimal, &sign ); // C4996 printf( "source: %2.10f buffer: '%s' decimal: %d sign: %d\n", source, buffer, decimal, sign );