Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Определить задан ли элемент массива с указанным индексом.

Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Member
hiphopdjedai is on a distinguished road
 
Сообщений: 19
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.01.2012
По умолчанию Определить задан ли элемент массива с указанным индексом. - 07.02.2012, 03:23

Как определить задан ли элемент массива с указанным индексом.
Допустим у нас есть массив int m[3]={1,2}; Очевидно, что элемент с индексом 2 мы не инициализировали. Как реализовать функцию проверяющую инициализирован ли элемент с индексом index?
Ответить с цитированием
  (#2 (permalink)) Старый
Специалист
Влад is on a distinguished road
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 19 раз(а) в 19 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 07.02.2012, 08:40

А существует ли способ отделить "инициализированный" элемент от "неинициализированного" ? Потому что с точки зрения компьютера, любое число, содержащееся в ячейке с индексом 2, является правильным.


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#3 (permalink)) Старый
Member
Сыроежка is on a distinguished road
 
Сообщений: 137
Сказал(а) спасибо: 0
Поблагодарили 17 раз(а) в 17 сообщениях
Регистрация: 16.11.2011
По умолчанию 07.02.2012, 10:32

Цитата:
Сообщение от hiphopdjedai Посмотреть сообщение
Как определить задан ли элемент массива с указанным индексом.
Допустим у нас есть массив int m[3]={1,2}; Очевидно, что элемент с индексом 2 мы не инициализировали. Как реализовать функцию проверяющую инициализирован ли элемент с индексом index?
Это можно сделать только на уровне соглашений в проекте. То есть вы выбираете некоторую константу, допустим 0, и считаете, что элемент маасива, имеющий это значение, является неинициализированным.
Тогда в этом случае если рассмотреть два массива

int a[4] = { 1, 2 };
int b[4] = { 1, 2, 0 };


то они будут эквивалентными с точки зрения инициализации своих элементов, так как 3-ий и 4-ый элементы обоих массивов равны 0.
Ответить с цитированием
Ads
  (#4 (permalink)) Старый
Member
hiphopdjedai is on a distinguished road
 
Сообщений: 19
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.01.2012
По умолчанию 07.02.2012, 22:06

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Это можно сделать только на уровне соглашений в проекте. То есть вы выбираете некоторую константу, допустим 0, и считаете, что элемент маасива, имеющий это значение, является неинициализированным.
Тогда в этом случае если рассмотреть два массива

int a[4] = { 1, 2 };
int b[4] = { 1, 2, 0 };


то они будут эквивалентными с точки зрения инициализации своих элементов, так как 3-ий и 4-ый элементы обоих массивов равны 0.
Ну не знаю если вывести содержимое массива на экран то пустые ячейки выводятся как большое отрицательное число. Ну знаете как если бы я просто инициализировал переменную: int x; и потом вывел не положив никакого элемента std::cout<<x; Поэтому не факт что там будут нули.
Ответить с цитированием
  (#5 (permalink)) Старый
D_K D_K вне форума
Member
D_K is on a distinguished road
 
Сообщений: 1,678
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 07.02.2012, 22:14

Цитата:
Сообщение от hiphopdjedai Посмотреть сообщение
Ну не знаю если вывести содержимое массива на экран то пустые ячейки выводятся как большое отрицательное число.
Если инициализирован хотя бы один элемент, то все остальные будут заполнены нулями.


импортирован с progz.ru
Ответить с цитированием
  (#6 (permalink)) Старый
Member
hiphopdjedai is on a distinguished road
 
Сообщений: 19
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.01.2012
По умолчанию 07.02.2012, 22:33

Цитата:
Сообщение от D_K Посмотреть сообщение
Если инициализирован хотя бы один элемент, то все остальные будут заполнены нулями.
cpp Код:
#include<iostream>
using namespace std;

int main()
{
    int mas[4];
    mas[0]=1;
    mas[1]=2;
    for(int i=0;i<4;i++) cout<<mas[i]<<endl;
    return 0;
}
а если я присваиваю так?
Ответить с цитированием
  (#7 (permalink)) Старый
Member
Сыроежка is on a distinguished road
 
Сообщений: 137
Сказал(а) спасибо: 0
Поблагодарили 17 раз(а) в 17 сообщениях
Регистрация: 16.11.2011
По умолчанию 07.02.2012, 22:45

Цитата:
Сообщение от hiphopdjedai Посмотреть сообщение
Ну не знаю если вывести содержимое массива на экран то пустые ячейки выводятся как большое отрицательное число. Ну знаете как если бы я просто инициализировал переменную: int x; и потом вывел не положив никакого элемента std::cout<<x; Поэтому не факт что там будут нули.
Вообще-то, строго говоря, инициализацией является присвоение значения при определении объекта. Поэтому в приведенном ниже фрагменте кода

int a[] = { 1, 2, 3};

массив a инициализируется.
А в этом фрагменте

int a[3];
a[0] = 1; a[1] = 2; a[2] = 3;


происходит присвоение значений элементам неинициализированного массива.

Я под инициализацией понимал значение этого слова в его строгом смысле. Хотя распространено и такое его употребление, когда речь идет о присваивании значений объекту уже после его определения.

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

int a[3] = { 1, 0, 0 };

и

int a[3] = { 1 };

Если вы просто объявите массив не со статическим распределением памяти, то он будет содержать мусор. То есть если вы объявите локальный массив

int a[3];

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

Поэтому вам просто нужно установить какое-то соглашение, при каком значении элемента массива этот элемент считается неинициализированным.

Просто порассуждайте логически. Вы говорили, что ваш массив содержал какие-то большие отрицательные числа. И это являлось следствием, как вы считаете. что массив не был проинициализирован. Но если эти числа могли содержаться в элементах массива, то почему программисту запрещено или не возможно присвоить эти значения элементам массива при его инициализации?
Ответить с цитированием
  (#8 (permalink)) Старый
Member
hiphopdjedai is on a distinguished road
 
Сообщений: 19
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.01.2012
По умолчанию 08.02.2012, 01:06

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Вообще-то, строго говоря, инициализацией является присвоение значения при определении объекта. Поэтому в приведенном ниже фрагменте кода

int a[] = { 1, 2, 3};

массив a инициализируется.
А в этом фрагменте

int a[3];
a[0] = 1; a[1] = 2; a[2] = 3;


происходит присвоение значений элементам неинициализированного массива.

Я под инициализацией понимал значение этого слова в его строгом смысле. Хотя распространено и такое его употребление, когда речь идет о присваивании значений объекту уже после его определения.

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

int a[3] = { 1, 0, 0 };

и

int a[3] = { 1 };

Если вы просто объявите массив не со статическим распределением памяти, то он будет содержать мусор. То есть если вы объявите локальный массив

int a[3];

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

Поэтому вам просто нужно установить какое-то соглашение, при каком значении элемента массива этот элемент считается неинициализированным.

Просто порассуждайте логически. Вы говорили, что ваш массив содержал какие-то большие отрицательные числа. И это являлось следствием, как вы считаете. что массив не был проинициализирован. Но если эти числа могли содержаться в элементах массива, то почему программисту запрещено или не возможно присвоить эти значения элементам массива при его инициализации?
Ладно спасибо. Я разобрался=)
Ответить с цитированием
  (#9 (permalink)) Старый
Специалист
Влад is on a distinguished road
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 19 раз(а) в 19 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 08.02.2012, 09:09

Цитата:
Сообщение от hiphopdjedai Посмотреть сообщение
Ну не знаю если вывести содержимое массива на экран то пустые ячейки выводятся как большое отрицательное число.
А хочешь, я угадаю, какое именно "большое отрицательное число" получилось?
-858993460
Нет?

Я бы не рекомендовал полагаться на такие "магические числа". Потому что это будет бесконечным источником багов.

(В скобках: мне приходилось в реальном проекте в коде видеть такое:
cpp Код:
if (x == 0xCDCDCDCD)
{
    // что-то делаем...
}
Разумеется, это "работало" ровно до тех пор, пока не пришла пора поставлять заказчику релиз..... :-) Ну и попробуйте найти этот баг примерно в 500 КLOC....)


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#10 (permalink)) Старый
AD AD вне форума
Member
AD is on a distinguished road
 
Сообщений: 557
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 3 сообщениях
Регистрация: 15.07.2009
По умолчанию 08.02.2012, 11:19

Цитата:
Сообщение от hiphopdjedai Посмотреть сообщение
Ладно спасибо. Я разобрался=)
Ну и просто подскажу, что лучше не полагаться на компилятор, IDE или еще что-то и инициализировать любые массивы нулями (потом будет проще).

Статические подобным образом:
cpp Код:
int my_array[101] = {};
Динамические подобным:
cpp Код:
int* my_array = new int[101];
memset(my_array, 0, 101);
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Маршрут на графе задан списком. Определить, является ли этот маршрут простой цепью. Jey_Dreamer Prolog 10 01.12.2011 16:51
Как найти наименьший элемент массива вит Вопросы начинающих программистов 1 08.06.2011 11:50
Определить следующий после L1 элемент списка L2 imported_Юлия_ Lisp 3 12.05.2011 00:33
Минимальный элемент массива imported_Andrey01 Visual C++ 8 20.04.2011 20:15
Как добавить и удалить элемент из динамического массива Kopcap10000 Visual C++ 3 07.04.2011 03:47
Программа записывающая каждое слово в отдельный элемент массива hopper255 Вопросы начинающих программистов 1 08.12.2010 10:26
Вычесть из положительных элементов массива элемент с номером k1 Anzhelika Вопросы начинающих программистов 2 23.06.2010 10:16
Определить максимальный и минимальный элемент матрицы пээмчик Lisp 2 24.04.2010 17:22
Нужно найти максимальный элемент массива F@nt@zy Вопросы начинающих программистов 4 08.12.2008 19:42
Написать функцию удаляющую элемент массива PMG Вопросы начинающих программистов 2 12.03.2006 13:03
Слово - элемент массива. Stalk200 Вопросы начинающих программистов 8 10.08.2004 19:32
TCheckBox - Как определить помечен ли данный элемент или нет Anonymous C++ Builder 4 03.11.2003 18:11



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Нardforum.ru - компьютерный форум и программирование, форум программистов