/**
 * @file main.cpp
 * Projet sem03-td-Cpp1à3
 * @author l'équipe pédagogique 
 * @version 1 14/12/05
 * @brief TD n°3 - Exercices 1 à 3
 * Structures de données et algorithmes - DUT1 Paris 5
 */
 
#include <iostream>

/* EXERCICE 1 */

int* ad_locale() {
	int locale = 0;
	std::cout << "&locale = " << &locale << std::endl;
	return &locale; // warning: address of local variable `locale' returned
}

int* ad_locale2() {
	int locale = 0, *p = &locale;
	return p; // no warning !!!
}

int& ref_locale() {
	int locale = 0;
	return locale; // warning: reference to local variable `locale' returned
}

int& ref_locale2() {
	int locale = 0, &r = locale;
	return r; // no warning
}

int* ad_param(int param) {
	return &param; // no warning !!!
}

int& ref_param(int param) {
	return param; // no warning !!!
}

int test1() {
	int* p1 = ad_locale();
	*p1 = 10;
	int& r1 = ref_locale();
	r1 = 11;
	int* p2 = ad_param(12);
	*p2 = 13;
	int& r2 = ref_param(14);
	r2 = 15;
	return 0;	
}

/* EXERCICE 2 */

void piege(int *p) {
	std::cout << *p << std::endl;
	delete p;
}

int test2() {
	int a;
	piege(&a);
	int* p = new int;
	*p = 21;
	piege(p);
	std::cout << *p << std::endl;
	return 0;
}

void egoiste() {
	int* p = new int[10000];
	*p = 12;
}

int test3() {
	for ( ; ; )
		egoiste();
	return 0;
}

/* EXERCICE 3 */

int* ad_table(int* t, int size, int i) {
	if (0 > i || i >= size) {
		std::cerr << "error : bad index" << std::endl;
		exit(1);
	}
	return &t[i];
}

int& ref_table(int* t, int size, int i) {
	if (0 > i || i >= size) {
		std::cerr << "error : bad index" << std::endl;
		exit(1);
	}
	return t[i];
}

int main() {
	
	const int SIZE = 4;
	int tab[SIZE];
	
	int* tmp;
	tmp = ad_table(tab, SIZE, 0);
	*tmp = 12;
	
	*ad_table(tab, SIZE, 1) = 13;
	
	int& r = ref_table(tab, SIZE, 2);
	r = 14;
	
	ref_table(tab, SIZE, 3) = 15;
	
	for (int i = 0; i < SIZE; ++i)
		std::cout << "tab[" << i << "] = " << tab[i] << std::endl;

	return 0;
}
