Exercise 3-27 (const and volatile arrays)

Chapter_3     Exercise_3-26 Exercise_3-28







Exercise 3-27     TCP1, p. 229


Exercise 3-27. Create a const array of double and a volatile array of double. Index through each array and use const_cast to cast each element to non-const and non-volatile, respectively, and assign a value to each element.




CONTENTS:     const.c     Const.cpp




const.c         download


#include <stdio.h> // for printf(), putchar()

#define SIZE 10

void print(double* array, int size);
void set(double* array, int size);

int main()
{
int i;
const double carr[SIZE]; // uninitialized
volatile double varr[SIZE]; // arrays
print((double*)carr, SIZE); // cast avoids const warning
print((double*)varr, SIZE); // cast avoids volatile warning
double* dp = (double*)carr;
for (i = 0; i < SIZE; i++) {dp[i] = i;}
dp = (double*)varr;
for (i = 0; i < SIZE; i++) {dp[i] = i*i;}
print((double*)carr, SIZE);
print((double*)varr, SIZE);

const double carray[SIZE] = {0,1}; // initialized
volatile double varray[SIZE] = {0,1}; // arrays
print((double*)carray, SIZE);
print((double*)varray, SIZE);

set((double*)carray, SIZE);
set((double*)varray, SIZE);
print((double*)carray, SIZE);
print((double*)varray, SIZE);

return 0;
}

void print(double* array, int size)
{
int i;

for (i = 0; i < size; i++)
{printf("%g, ", array[i]);}
putchar('\n');
}
void set(double* array, int size)
{
int i;

for (i = 0; i < size; i++)
{array[i] = i;}
}
/*
gcc const.c -o const
./const
6.79039e-313, 0, 0, 0, 4.94066e-324, 2.15251e-314, 0, 0, 0, 0, // garbage
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // garbage
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 1, 4, 9, 16, 25, 36, 49, 64, 81,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
*/











Const.cpp         download


#include <iostream>
using std::cout;
using std::endl;

#define SIZE 10

void print(double* array, int size);
void set(double* array, int size);

int main()
{
// const double carr[SIZE]; // compile error: uninitialized const array
const double carr[SIZE] = {}; // empty initializer (all zero)
volatile double varr[SIZE]; // uninitialized volatile array
print(const_cast<double*>(carr), SIZE); // cast avoids const error
print(const_cast<double*>(varr), SIZE/2); // cast avoids volatile error
// double* dp = const_cast<double*>carr; // compile error: missing parentheses
double* dp = const_cast<double*>(carr); // OK, cast op uses func call syntax:
// cast_operator<data_type pointer or reference>(operand)
for (int i = 0; i < SIZE; i++) {dp[i] = i;}
dp = const_cast<double*>(varr);
for (int i = 0; i < SIZE; i++) {dp[i] = i*i;}
print(const_cast<double*>(carr), SIZE);
print(const_cast<double*>(varr), SIZE);

const double carray[SIZE] = {0,1}; // initialized
volatile double varray[SIZE] = {0,1}; // arrays
print(const_cast<double*>(carray), SIZE);
print(const_cast<double*>(varray), SIZE);

set(const_cast<double*>(carray), SIZE);
set(const_cast<double*>(varray), SIZE);
print(const_cast<double*>(carray), SIZE);
print(const_cast<double*>(varray), SIZE);

return 0;
}

void print(double* array, int size)
{
for (int i = 0; i < size; i++)
{cout << array[i] << ", ";}
cout << endl;
}
void set(double* array, int size)
{
for (int i = 0; i < size; i++)
{array[i] = i;}
}
/*
g++ Const.cpp -o Const
./Const
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6.91459e-310, 6.95299e-310, 6.91459e-310, 2.96439e-323, 3.39519e-313, // garbage
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 1, 4, 9, 16, 25, 36, 49, 64, 81,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
*/





Note:  See also ch3-ConstCast in Section ch3-Operators.









Chapter_3     Exercise_3-26 BACK_TO_TOP Exercise_3-28



Comments

Popular posts from this blog

Contents