done=(strlen(buffer)==0);
if(!done)
{
index=ataf(buffer); //перетворення рядка на число
cout<<"введiть значення типу float";
cin.getline(buffer,buflen);
/*введення значення в буфер*/
ref(index)=ataf(buffer);
}}
return 0;
}
double & ref (int index)
{if(index<0)index=0;
return array[index];}
Void showarray(void)
{cont<<"\n array:\n";
for(int i=0;i<SIZE;i++)
cout<<"["<<i<<"]"<<array[i]<<'\n';
}
Специфікатор INLINE
Специфікатор використовується для того, щоб компілятор розміщував код функції безпосередньо в місце її виклику. При цьому зростає швидкодія програми, але збільшується об'єктний код. Наприклад:
void notinline(void){}
inline void isinline(void){}
Main()
{printf("starting notinline\n");
for(long i=1;i<5000000;i++)notinline();
printf("starting isinline\n");
for(i=1;i<5000000;i++)isinline();}
З isinline функцiя виконується у кілька разів швидше.
Операції NEW і DELETE
Операція new служить для виділення пам'яті. Синтаксично допускається три способи її використання:
1) new type_name
Наприклад:
float*r=new float;
За такого оголошення r буде покажчиком на значення типу float, причому вказувати він буде на початок уже виділеної області пам'яті розміром float, на відміну від оголошення float*r;, де пам'ять не виділяється.
2) new(type_name)
Наприклад:
float*r=new(float);
Цей випадок аналогічний попередньому.
3) new type_name[expression]
Наприклад:
float*r=new float[20];
Операція Delete служить для звільнення пам'яті в купі. Відповідно до операції new, синтаксично допускаються такі способи її використання:
1) delete var_name;
Наприклад:
float*r=new float[20];
delete r;
2) delete[expr]var_name
Наприклад:
float*r=new float[20];
delete[20]r;
Зазначимо, що дія в першому та другому випадках аналогічна. Виділивши пам'ять, наприклад
float*r=new float[20];
можемо звільнити її будь-яким з таких способів:
delete[200]r; delete[20]r; delete[10]r; delete[2]r; delete[]r; delete r;
Покажчик на void
Покажчику на тип void можна присвоїти значення покажчика на будь-який базовий тип. Наприклад:
void*void_ptr;
int*int_ptr=0x256;
void_ptr=int_ptr;
int_ptr=void_ptr;//невiрно
Параметри типу void* найчастіше використовуються при написанні програмних компонент, поведінка яких не залежить від конкретних типів значень. Напишемо функцію, що міняє місцями дві змінні будь-яких типів *:
void swap(void*&item1,void*&item2)
{void*temp=item1;
item1=item2;
item2=temp;}
Main()
{int*i=new int,*j=new int;
*i=5;
*j=20;
swap(i,j);
print("*i=%d*j=%d\n",*i,*j);
float*y=new float;*x=new float;
*x=5.0;
*y=20.0;
swap(x,y);
printf("*x=%f*j=%f\n",*i,*j);}
У деяких версіях компілятора С++ (напр., Borland 3.11) ця функція не працює. Тоді необхідно явно вказувати перетворення типу до void*:
swap((void*)i,(void*)j);