Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как правильно работать с массивами (http://forum.oszone.net/showthread.php?t=99660)

oRaVeNo 01-02-2008 16:46 730824

Как правильно работать с массивами
 
Я новичек изучаю C++
У меня такой вопрос: как сначала вычеслить размер массива а потом его создать с вычесленным размером?
int tmp = 2;
const int tmp2 = tmp;
int tmp3[tmp2];
Вроде все логично но компилятор ругается :cry:
Что делаю не правильно?

BlackEric 01-02-2008 19:56 730957

Здесь:
http://www.cplusplus.com/doc/tutorial/arrays.html
или здесь:
http://www.augustcouncil.com/~tgibson/tutorial/arr.html

На что компилятор и какой ругается???

Busla 01-02-2008 23:39 731103

Может, инициализации константы через переменную ему не нравится?

oRaVeNo 02-02-2008 20:41 731650

Busla,
Может, здесь все хорошо const int tmp2 = tmp;
А вот здесь он ругается что ожидает константу(tmp2) int tmp3[tmp2];

Drongo 03-02-2008 22:13 732226

Цитата:

Цитата oRaVeNo
PHP код:

int tmp 2;  // это бы я убрал...
const int tmp2 tmp// А здесь вместо [b]tmp[/b] присвоил размер = 2;
int tmp3[tmp2]; 

»

Почему так? Ведь тут несколько раз переприсвоение. Я бы сделал так
PHP код:

const int tmp2 2;
int tmp3[tmp2] = {0};  // Инициалиация нулями 

,
Тоесть вообще бы убрал объявление:
PHP код:

int tmp 2

Массивы должны всегда быть инициализированны... Поправьте, если ошибся?!

oRaVeNo 04-02-2008 00:09 732297

Дело в том что я незнаю размера своего массива.
Я должен вычеслить его размер, а потом про инициализировать массив с вычесленным размером и я не могу понять как это зделать.
1. Вычеслить размер могу. Заношу размер в tmp;
2. Размер массива должен быть константой, могу обьявляю const int tmp2 = tmp;
3. Обьявляю массив int tmp3[tmp2]; //и здесь компилятор ругается говорит что ожидает константное выражение tmp2 не пойму разве это не так? Я ж выше обьявил его константой.

BlackEric 04-02-2008 12:23 732500

oRaVeNo, компилятор какой????
Вы смотрели примеры объявления массивов в гугле?
И сообщение об ошибке в оригинале приведите...

Busla 04-02-2008 13:31 732541

Drongo, oRaVeNo, инициализирован - значит содержит значения.

Размерность массива должны быть известна на момент компиляции.
Нужно либо выделять память под массив динамически и работать с указателями. Либо, коли речь идёт о C++, пользоваться стандартными библиотеками - там хватает средств для работы с множествами.

Drongo 04-02-2008 17:12 732705

Цитата:

Цитата Busla
Drongo, oRaVeNo, инициализирован - значит содержит значения. »

Так у парня небыл он даже инициализирован, а по поводу, размера, то я согласен, наверное плохо выразил свою мысль...

Drongo 04-02-2008 18:16 732781

Глянь, можен пригодится, я такие варианты тебе набросал... Зачем его (размер) вычислять если у вас он в переменной 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();
}
//---------------------------------------------------------------------------


oRaVeNo 06-02-2008 00:56 733894

Большое спасибо всем разобрался.
Оказывается нужно динамически выделять память.
Я так понял что компилятор не высчитывает размер, а ему он нужен сразу вот в чем моя ошибка.

perfomanse 03-07-2010 13:03 1446483

Подскажите пожалуйста как из массива e[6]={0.7,1,1.2,1.6,2.1,2.2} с помощью функции rand() выбрать случайно только одно значение?
пробовала вот так:
E1=rand()%e[6]; а оно пишет: Illegal use of floating point.
что делать, подскажите!!!!!!! Очень срочно надо!!!

Drongo 03-07-2010 20:19 1446705

Цитата:

Цитата perfomanse
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 1447997

Цитата:

Цитата oRaVeNo
1. Вычеслить размер могу. Заношу размер в tmp;
2. Размер массива должен быть константой, могу обьявляю const int tmp2 = tmp; »

Значения констант должны быть определены до запуска программы. Почему? Да потому что это константы :)

Если же надо сначала ввести (в запущенной программе) значение tmp,*а потом создать массив, нужно использовать динамические массивы, которые создаются совсем иначе.
В большинстве сред разработки уже есть классы-шаблоны для безопасной работы с динамическими массивами. Например vector из библиотеки STL или DynamicArray из Borland C++ Builder


Время: 13:13.

Время: 13:13.
© OSzone.net 2001-