1 jeszcze dygresja o macierzach...#include
2 jeszcze dygresja o macierzach...int main () { int i,k,l; int mat[3][5][7]; for(i=0;i<3;++i) for(k=0;k<5;++k) for(l=0;l<7;++l) mat[i][k][l]=10000*i *k + 100*l + 7; printf("\n wskazniki mat=%p *mat=%p **mat=%p ***mat=%p ***mat=%d\n", mat,*mat,**mat,***mat, ***mat); printf("\n\n"); printf(" *(*(*(mat+1)+2)+3) = %d\n", *(*(*(mat+1)+2)+3) ); exit(0); } /* koniec main */ przykład intuicyjny ; dwa układy N bajtów, o pierwszym nie wiemy nic, a drugim wiemy dodatkowo że np. układ odpowiadający znakowi ‘a’ stanowi 50 % bajtów; czyli wiemy coś dodatkowo...
3 jeszcze dygresja o macierzach.../* to wynik programu */ wskazniki mat=737f0a54 *mat=737f0a54 **mat=737f0a54 ***mat= ***mat=7 *(*(*(mat+1)+2)+3) = 12307 przykład intuicyjny ; dwa układy N bajtów, o pierwszym nie wiemy nic, a drugim wiemy dodatkowo że np. układ odpowiadający znakowi ‘a’ stanowi 50 % bajtów; czyli wiemy coś dodatkowo...
4 Rekurencja prawostronnafloat silnia (int n) /* to nie jest rekurencja prawostronna */ { if(n==0 || n==1) return (1.); else return(n * silnia(n-1) ); }
5 Rekurencja prawostronnawywołanie rekurencyjne jest rekurencją prawostronną, gdy jest ostatnią instrukcją wykonywaną w funkcji, a zwracana wartość nie jest częścią wyrażenia; kompilator potrafi to wykorzystać
6 Rekurencja prawostronnafloat silnia(int n, float a) { if(n<0) return(0.); if(n==0) return (1.); if(n==1) return(a); else return( silnia(n-1, n*a) ); }/* koniec funkcji silnia */ silnia(n,a) jest równa a, gdy n=1 jest równa silnia(n-1,na) gdy n>1
7 Rekurencja prawostronnaJak zapisać przez rekurencję prawostronną sumowanie H(n)=1 +1/2 + 1/3 + 1/ /n ? H(n,a) = a+1, gdy n=1 H(n-1, a+1/n) gdy n>1
8 Little Endian oraz Big EndianW zależności od tego, jaki komputer jest używany, porządek bajtów może być różny od tego porządku zależy interpretacja zmiennych (stałych) wielobajtowych. Np. dla 4-bajtowej zmiennej long int bajt3 bajt2 bajt1 bajt0 uporządkowanie w pamięci może być następujące: bajt0 Adres+0 bajt1 Adres+1 bajt2 Adres+2 bajt3 Adres+3
9 Little Endian oraz Big EndianKomputery z takim porządkiem bajtów (najmniej znaczący bajt ma najniższy adres) są określane jako „Little Endian machines”. Należą do nich w szczególności wszystkie komputery z procesorami Intela (oraz AMD). Z kolei komputery IBM RISC były/są maszynami „Big Endian”; także maszyny tzw. „mainframe” (również komputery Apple Inc.) : bajt3 Adres+0 bajt2 Adres+1 bajt1 Adres+2 bajt0 Adres+3 (bajt najbardziej znaczący ma najniższy adres)
10 Little Endian oraz Big EndianUżywa się jeszcze określenia „Network byte order”. To to samo co „Big Endian”. Niekiedy można się spotkać z określeniem „Host byte order”. Zwykle oznacza to „Little Endian”.
11 Little Endian oraz Big EndianAdobe Photoshop - Big Endian BMP - Little Endian GIF - Little Endian IMG (GEM Raster Image) – Big Endian JPEG - Big Endian MacPaint - Big Endian PCX - Little Endian Quicktime Movies (Mac) - Little Endian Microsoft RTF - Little Endian
12 Little Endian oraz Big EndianTGA (Targa) - Little Endian WPG (WordPerfect Graphics Metafile) - Big Endian (używany na PC!) TIFF - Little Endian i Big Endian, znacznik kodowania w zbiorze) SGI (Silicon Graphics) - Big Endian
13 używanie komend UNIXa z wnętrza programu napisanego w C#include
14 używanie komend UNIXa z wnętrza programu napisanego w Cexecl(char *path, char *arg0,...,char *argn, 0); path wskazuje na nazwę zbioru zawierającego komendę arg0 wskazuje na string który jest taki sam jak path (lub przynajmniej jego ostatni człon) Ostatni parametr musi być zero. main() { printf(”Zbiory: \n''); execl (”/bin/ls'', ”ls'', ”-l'', 0); } /* koniec funkcji main */
15 używanie komend UNIXa z wnętrza programu napisanego w Cint execv (const char *filename, char *const argv[]) Funkcja ta wykonuje plik o nazwie filename jako nowy proces (wykona fork); argument argv jest macierzą wskaźników; będzie ona argumentem argv w funkcji main tego nowego procesu. Ostatni element macierzy argv musi być wskaźnikiem zerowym (patrz execl). Pierwszy element macierzy argv musi być nazwą wykonywanego pliku ”bez kartoteki”.
16 używanie komend UNIXa z wnętrza programu napisanego w Cint execve (const char *filename, char *const argv[], char *const env[]) pozwala dodatkowo przesłać informację o otoczeniu procesu
17 używanie komend UNIXa z wnętrza programu napisanego w Cint execle (const char *filename, const char *arg0, char *const env[], ...) int execvp (const char *filename, char *const argv[]) int execlp (const char *filename, const char *arg0, ...)