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
Post a Comment