[ RzR | INDEX | SEARCH | ME | TOOLS | WEB DESIGN | VISUAL | ARTICLES | MUSIC | E-M@IL ]

PROGRAMATION EN C / C++

Voila quelques notes en vracs pour les debutants en language C

JEUX D'INSTRUCTION

/**
 * Exemple d'instructions C/C++
 **/
// commentaire sur une ligne 

int main() { 		//fonction principale
	int a = 4; 
	int b = 2;

	if ( a < 0 ) { // condition
		a=5; 
	} else {	// contre condition
		b=3;
	}
	
	
	while ( a != b ) { // boucle
		b=b+1;
	}
	
	for (int i=0;i<5;i++) { // boucle indexée
		b=b+a;
	}
	
	switch (b) { // branchement multiple 
		case 0 : a = -1; break;
		case 1 : a = 0 ; break;
		default : a = b; break;
	}
	
	do { 
		a=b+2;
	} while ( a < b ); // si condition re-boucle

	return a; // retour de valeur
}

TYPES

int, char, float, double

Le reste est plus exotique et dépands plus du compilateur/OS :
bytes, unsigned char, signed bytes, long, short ... & boolean (C++)

OPERATEURS

affectation
=
Operateurs Aritmetiques :
+,-,*,/,% : addition, soustraction, multiplication, division, modulo (reste div)
Incrementation: i++ (eq. i'=i+1; return i; )
--i (eq i'=i-1; return i'; )
+= : addition + affectation (idem -= , *= ; /= , %= ; <<= )
Operateurs Logiques :
|| : OU logique
&& : ET logique
&= : ET bit à bit+affectation
|=: OU bit à bit+affectation
^= : OU exclusif bit à bit+affectation
<<= : décalage à gauche puis affectation (resp >>= )
.
" regroupement d'expressssions
.
?: condition ternere

Addresse / Contenus

int a : variable a , son adresse est : &a int* a : a est une ad dont le contenu est de type int int *a : le contenu de l'adresse a est de type int (identique) int *a; &(*a) = a; --- char a; &a; => l'add reservee pour a *(&a) = a;

Tableaux :

La notion de tableau est subtile il n'existe pas de 'type' tableau donc on a recours
 int tab[10]; /*
reservation en mem de 10 case pour contenir des int (10 octets)
la 1ere case est a l'ad 'tab' */

 tab[2] : /*
le valeur du contenu de la (0eme ,1eme ) 2eme case (soit 3cases)
le contenu de ( l'ad du 1er ele + 2 cases )
cette ad en obtenue par &(tab[2]) */


equivaut à :
char tab[10];	// 10 case reserve a partir de l'ad tab
*tab ; 		// le char qui est a l'ad tab
*(tab+3) ;	 // le char contenu a l'ad (tab+3)
(tab+6) ; 	// adresse = Ad(tab) + 6 * taille d'une case
tab[6];		// le char a la 6eme case <=> *(tab+6)
&tab[0] = tab = &*tab;

[] et * => contenus
& 	=> l'ad d'un contenu

----

void f (char d[]) ;	<=>	void f (char *d);
 dans les deux cas d est l'ad du 1er element (peut etre \0 )

----

char *t[];
t[] ; un tableau de case de meme type debutnat a l'ad t;
* t[] ; la valeur d'une case est prise comme adresse d'un contenu
char *t[] : de type char

t : 	l'ad du tableau (d'adresse de char)
(*t)	: l'ad du  0eme element du tab;
*(*t)	: le contenu de ( ^^^ ) 

t [] [] [] [] []   [ t[5] ]    [ *(t+6) ]   []    []
   \
    \
     \ [ *(*(t+0)) ]  [c] [h] [a] [i] [n] [e]     [  *((t[0])+6) ]        [\0]

Pour eviter cette notation lourde on simplifie par si on veux acceder a 'a'
char *t[];
char* x;

x = t[0]; // l'ad

printf("%c", *(x+4) );

Parametres de fonctions :

On passe en param dans les fonctions 
- des variables de longueur 1 ou 2 octets ( int, char ) si on veux passer plusieur vars, - soit un tableau de long n - il faut juste l'@ de ce tab - et la longeur - ou evetuellement la valeur du dernier element du tab ( ex %s => \0 ) On peux passer un tableau de tableau de pionteur de tableau de char mais il faut faire au plus simple !!!

E/S Formatees :


scanf nécessite:
	- @ où stocker la valeur
	- Type de cette val (-> taille ie %f=4octets ; %s...\0)
---

Mais on ne s'interesse pas aux @ mais aux valeurs,
(cad contenus de l'@ du type specifie dans le scanf )

printf nescessite
	- Type a reprenter %d %f %u %c %s
	- Valeur dans le type specifier
SAUF: %s => adresse de la chaine se terminant par \0

---
int a;         /* => %d */
scanf("%d", &a); /* on retrouve le type int%d et notre ad */

printf("%d", a ); /* notre typage suit la valeur (a) */
On ne parle plus d'adresse puisque on connais le contenu de l'@
soit la valeur de la variable a

---
int *a; 
a est une ad dont son contenu est de type int;

scanf("%d",a); 
/* a est bien une ad , le type (%d) est le meme que son contenu */

printf("%d",*a); 
/* printf opere sur une valeur , variable 
ici le contenu *a de l'ad a */

printf("%d",5); <=> printf("5");

Compilation


pour generer un executable (comprenssible par l' OS)
- il faut

.c / .cc => .o => .exe
         -c
* Pre-prossesing :
- Analyse lexicale / syntaxique (grammaire)
- interprete les #

* Compilation :
- traduire le source en lang evolue (C,pascal) 
  => langage simpliste (assembleur)

gcc -c f.c -o f.o
 => f.o

* Linker :
- Acrocher chaque objets

gcc -o runme utilise.o principal.o -lm (lib maths)
gcc -o runme utilise.o principal.o -lg++ (lib c++)

* Execution du fichier binaire :
% runme 

Automatisation de toutes ces etapes avec un fichier makefile

CROSSCOMPILATION ..

Deux solutions :

gcc  -D _UNIX  file.c 


ou sinon dans la makefile
CC = gcc
DEFINES = -D_UNIX -D_`uname -s`

.c.o:
	$(CC) -c $(DEFINES) $(CFLAGS) $<.c ...


mais je te conseille d'utiliser la variable "_Linux" (tel quel)
comme ca tu peux otomatiser avec la commande uname -s

MISC

recopie de tableaux :
t[m][n];
v[m*m];

for(i ..m ) 
 for(i ..m ) 
   v[i*n+j] =   t[i][j];

CARACTERES SPECIAUX & SEQUENCES D'ECHAPEMENT

	\a 	alarme
	\b 	retour arrière (backspace)
	\f	saut de page (lineFeed)
	\n	rupture de ligne (newline)
	\r	retour chariot (cariage return)
	\t	tabulation horizontale
	\v	tabulation verticale
	\'	simple quote
	\"	double quote
	\\	backslash
	\?	point d'interrogation
	\0	fin de chaine

MACROPROCESSEUR

Fonction
#define min2(a,b) {  if (a > b) return a; return b; }

Symbole

#define RzR // definit le symbole 
#undef RzR  // annule le symbole, macro...

#ifdef RzR  // si s deja defini
[...]
#else	    // non definit
[...]
#endif

#ifndef [...] #else [...] #endif    // idem mais inverse :-)



#if [...]
#elif [...]
#endif 

#error [...] // genere une erreur

#line Numero ["NomFichier"] 
// pour modifier le numéro de la ligne courante 
// et le nom de fichier courant traité par le préprocesseur

#pragma : ?




http://rzr.online.fr/prog.htm - 1999 - Last modified: Thu Jan 31 14:44:43 MET 2002
Philippe_COVAL(a)Yahoo.COM - http://rzr.online.fr

[ RzR | INDEX | SEARCH | ME | TOOLS | WEB DESIGN | VISUAL | ARTICLES | MUSIC | E-M@IL ]