Показать полную графическую версию : Как правильно работать с массивами
Я новичек изучаю C++
У меня такой вопрос: как сначала вычеслить размер массива а потом его создать с вычесленным размером?
int tmp = 2;
const int tmp2 = tmp;
int tmp3[tmp2];
Вроде все логично но компилятор ругается :cry:
Что делаю не правильно?
BlackEric
01-02-2008, 19:56
Здесь:
http://www.cplusplus.com/doc/tutorial/arrays.html
или здесь:
http://www.augustcouncil.com/~tgibson/tutorial/arr.html
На что компилятор и какой ругается???
Может, инициализации константы через переменную ему не нравится?
Busla,
Может, здесь все хорошо const int tmp2 = tmp;
А вот здесь он ругается что ожидает константу(tmp2) int tmp3[tmp2];
int tmp = 2; // это бы я убрал...
const int tmp2 = tmp; // А здесь вместо tmp присвоил размер = 2;
int tmp3[tmp2]; »
Почему так? Ведь тут несколько раз переприсвоение. Я бы сделал так
const int tmp2 = 2;
int tmp3[tmp2] = {0}; // Инициалиация нулями,
Тоесть вообще бы убрал объявление:
int tmp = 2;
Массивы должны всегда быть инициализированны... Поправьте, если ошибся?!
Дело в том что я незнаю размера своего массива.
Я должен вычеслить его размер, а потом про инициализировать массив с вычесленным размером и я не могу понять как это зделать.
1. Вычеслить размер могу. Заношу размер в tmp;
2. Размер массива должен быть константой, могу обьявляю const int tmp2 = tmp;
3. Обьявляю массив int tmp3[tmp2]; //и здесь компилятор ругается говорит что ожидает константное выражение tmp2 не пойму разве это не так? Я ж выше обьявил его константой.
BlackEric
04-02-2008, 12:23
oRaVeNo, компилятор какой????
Вы смотрели примеры объявления массивов в гугле?
И сообщение об ошибке в оригинале приведите...
Drongo, oRaVeNo, инициализирован - значит содержит значения.
Размерность массива должны быть известна на момент компиляции.
Нужно либо выделять память под массив динамически и работать с указателями. Либо, коли речь идёт о C++, пользоваться стандартными библиотеками - там хватает средств для работы с множествами.
Drongo, oRaVeNo, инициализирован - значит содержит значения. »
Так у парня небыл он даже инициализирован, а по поводу, размера, то я согласен, наверное плохо выразил свою мысль...
Глянь, можен пригодится, я такие варианты тебе набросал... Зачем его (размер) вычислять если у вас он в переменной tmp - тоесть - 2. Просто для вычисления будущих размеров используйте эту переменную - tmp. Только уберите строку
const int tmp2 = tmp;
int tmp3[tmp2]; // а здесь смените вместо tmp2 на tmp; int tmp3[tmp];
#include <iostream.h>
#include <conio.h>
void main()
{
int counter = 1;
int const size = 10; // Я бы объявил размер массива так...
int array[size] = {0}; // А так бы задал размерность массива...
for(int i = 0; i < size; i++)
cout<<" Element [ "<<i<<" ] = "<<array[i]<<endl;
cout<<endl<<endl;
// Динамический массив------------------------------------------------------
/*const*/ int size1; // Попробуйте убрать const
int *Array;
cout<<" Enter Size Array: ";
cin>>size1;
Array = new int[size1]; // Выделение через new
for(int i = 0; i < size1; i++){
Array[i] = counter++; // Инициализация массива, какими-то значениями...
cout<<" Element [ "<<i<<" ] = "<<Array[i]<<endl;
}
cout<<endl<<endl;
// Ещё один вариан выделения через new---------------------------------------
const int size2 = 10;
int *Array1 = new int[size2];
for(int i = 0; i < size2; i++){
Array1[i] = counter++; // Инициализация массива, какими-то значениями...
cout<<" Element [ "<<i<<" ] = "<<Array1[i]<<endl;
}
cout<<endl<<endl;
// Ваш случай---------------------------------------------------------------
//int tmp = 10;
// Ваш размер массива хранится в переменной tmp2, если вам нужен размер, используйте эту переменную - tmp2;
const int tmp2 = 10; // Изменяем tmp на tmp2, теперь размер массива константный...
int tmp3[tmp2] = {0}; // Попробуйте без инициализации = {0};
for(int i = 0; i < tmp2; i++)
cout<<" Element [ "<<i<<" ] = "<<tmp3[i]<<endl;
getch();
}
//---------------------------------------------------------------------------
Большое спасибо всем разобрался.
Оказывается нужно динамически выделять память.
Я так понял что компилятор не высчитывает размер, а ему он нужен сразу вот в чем моя ошибка.
perfomanse
03-07-2010, 13:03
Подскажите пожалуйста как из массива e[6]={0.7,1,1.2,1.6,2.1,2.2} с помощью функции rand() выбрать случайно только одно значение?
пробовала вот так:
E1=rand()%e[6]; а оно пишет: Illegal use of floating point.
что делать, подскажите!!!!!!! Очень срочно надо!!!
E1=rand()%e[6]; а оно пишет: Illegal use of floating point. »Диапазон задан не верно, не массив с идексом задаёт диапазон, а индекс.
#include <iostream.h>
#include <ctime>
#include <conio.h>
void main()
{
float e[6] = {0.7, 1, 1.2, 1.6, 2.1, 2.2};
srand(time(0));
int E1 = rand() % 6;
cout<<"Random e["<<E1<<"] = "<<e[E1]<<endl<<endl;
for(int i = 0; i < 6; i++)
cout<<"array["<<i<<"] = "<<e[i]<<endl;
getch();
}
//---------------------------------------------------------------------------
El Scorpio
06-07-2010, 06:41
1. Вычеслить размер могу. Заношу размер в tmp;
2. Размер массива должен быть константой, могу обьявляю const int tmp2 = tmp; »
Значения констант должны быть определены до запуска программы. Почему? Да потому что это константы :)
Если же надо сначала ввести (в запущенной программе) значение tmp,*а потом создать массив, нужно использовать динамические массивы, которые создаются совсем иначе.
В большинстве сред разработки уже есть классы-шаблоны для безопасной работы с динамическими массивами. Например vector из библиотеки STL или DynamicArray из Borland C++ Builder
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.