Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
#1

Почему массив изначально нулями не инициализируется? - C++

19.09.2013, 21:49. Просмотров 542. Ответов 14
Метки нет (Все метки)

Всем доброго вечера. Имеется проблема такая проблема: есть массив, в котором количество элементов должно менять при выполнении условия. Я делаю так:
C++
1
2
3
4
5
6
7
8
n=1;
double *a = new double [n];
scanf ("%i",b);
if (b==1)
{
n++;
double *a = new double [n];
//потом что то с ним делаю
Возможен ли такой вариант, чтобы элементы из предыдущего массива оставались (их потом мне нужно будет в файл записывать)?
И еще вопрос: почему массив изначально нулями не инициализируется?
Какие есть еще пути решения?
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 21:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему массив изначально нулями не инициализируется? (C++):

Почему массив инициализируется с 7-ю элементами?.. - C++
Друзья! Требуется помощь:) Задача: вводим денежную сумму в формате $123,321,442 , выбираем из нее цифорки и записываем в переменную...

Почему массив всегда инициализирован нулями? - C++
Не могу понять, почему у меня массив всегда инициализирован нулями в методе check_ending. Есть у меня класс Player в заголовочном...

Почему не инициализируется вектор размером 10? - C++
Хотел создать вектор размером 10, но visual studio выдаёт ошибку и при этом размер вектора равен 0, хотя я явно указал, что должно быть 10:...

Не инициализируется массив - C++
Мужики помогите, ошибка какая-то. Работаю в visual studio 2008 express SP2 Вот кусок кода: #define JE 122 ... float...

Не инициализируется динамический одномерный массив - C++
#include "stdafx.h" int _tmain(int argc, _TCHAR* argv) { int n = 10; float *a = new float; return 0; } После объявления...

Чем по умолчанию инициализируется символьный массив? - C++
если '/0' конец массива, то что представляют собой остальные??

14
Genn55
368 / 215 / 41
Регистрация: 26.12.2012
Сообщений: 708
19.09.2013, 22:01 #2
1. Элементы в массиве остаются пока не будет удален массив или его элементы.
2.Динамический массив нельзя инициализировать по определению.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
19.09.2013, 22:07 #3
Цитата Сообщение от motr Посмотреть сообщение
Всем доброго вечера. Имеется проблема такая проблема: есть массив, в котором количество элементов должно менять при выполнении условия. Я делаю так:
ты не путай динамический массив, к которому относится vector и динамическое выделение памяти
если ты сам хочешь сделать динамический массив то или используй Сишные malloc(выделение) free(освобождение) realoc(перераспределение увеличить\уменьшить)
если хочешь делать через new delete
то при перераспределении памяти шаги такие
1 выделить новый массив нужного размера
2 переписать все значения из первого массива в выделенный
3 удалить первый массив
4 указатель на первый массив присвоить значения чтобы он указывал на новый
1
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
19.09.2013, 22:12  [ТС] #4
Спасибо за разъяснение!
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2013, 22:13 #5
Цитата Сообщение от ValeryS Посмотреть сообщение
если ты сам хочешь сделать динамический массив то или используй Сишные malloc(выделение) free(освобождение) realoc(перераспределение увеличить\уменьшить)
если хочешь делать через new delete
то при перераспределении памяти шаги такие
1 выделить новый массив нужного размера
2 переписать все значения из первого массива в выделенный
3 удалить первый массив
4 указатель на первый массив присвоить значения чтобы он указывал на новый
Не слушайте эту лабуду и используйте vector.
C++
1
2
3
4
5
6
7
8
n=1;
std::vector<double> a(n); // и инициализируется нулями
scanf ("%i", &b);
if (b==1)
{
    a.resize(a.size() + 1);
    // и дальше с ним что-то делаете
}
Извиняюсь, если обидел мазохистов.
0
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
19.09.2013, 23:02  [ТС] #6
OhMyGodSoLong, у меня еще проблема возникла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <vector>
 
int main()
{
    //double a;
    int n;
    int i; 
    n=10;
    //double *a = new double [n];
    int b=0;
    
    std::vector<double> a(n); // и инициализируется нулями
 
if (b==1)
{
    a.resize(n + 1);
 
    // и дальше с ним что-то делаете
    for(i=0;i<a.size();i++)
    
    printf ("%d",a[i]; )
 
  return 0;}
 
 
scanf("%i",b);
}
Хочу все это на экран вывести. В чем косяк?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.09.2013, 00:03 #7
Наверное, в том, что точку с запятой надо ставить после скобки, а не до?..
0
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
20.09.2013, 11:41  [ТС] #8
OhMyGodSoLong, я пока исправлял случайно ошибся, не в этом проблема.

Добавлено через 3 часа 0 минут
попытался сделать через malloc.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main ()
{
int i, n,b;
n=10;
 
double *a = (double*) malloc (sizeof(double)*n);
 
for (i=0;i<n;i++){ a[i]=5;}
scanf ("%i",&b);
if (b==1)
{
    n++;
    a[9]==2;
for (i=0;i<n;i++)
{
    printf ("a[i]= %d\n",a[i]);
}
}
getch();
 
}
почему он не заполняет все элементы 5ками, а 9й - 2кой?
0
Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 480
Записей в блоге: 1
20.09.2013, 12:02 #9
motr, вот Ваш измененный код из первого сообщения
Если о сохранении данных заботиться не нужно, тогда так:
C++
1
2
3
4
5
6
7
8
n=1;
double *a = new double [n];
scanf ("%i",b);
if (b==1)
{
   n++;   
   a = new double [n]; //убрал повторное объяление типа, т.к. в этом случае создается новая переменая, область //видимости к-рой заканчивается с концом фигуных скобок if
}
Если же заботиться о сохранении данных, тогда так
C++
1
2
3
4
5
6
7
8
9
10
11
n=1;
double *a = new double [n];
scanf ("%i",b);
if (b==1)
{
   n++; 
   double *a2=a;  
   a = new double [n]; 
   for(int i=0;i<n-1;i++) a[i]=a2[i];
   delete []a2;
}
Добавлено через 9 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Не слушайте эту лабуду и используйте vector.
C++
1
2
3
4
5
6
7
8
n=1;
std::vector<double> a(n); // и инициализируется нулями
scanf ("%i", &b);
if (b==1)
{
    a.resize(a.size() + 1);
    // и дальше с ним что-то делаете
}
Извиняюсь, если обидел мазохистов.
motr, если Вам задали лабу в универе и она на использование массивов, то вариант с типом vector у Вас скорей всего не примут. Смотрите приведенный мной вариант.
0
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
20.09.2013, 12:40  [ТС] #10
Algoritmer, попробовал, как Вы написали:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main ()
{
int i, n,b;
 
n=10;
double *a = new double [n];
 
for (i=0;i<=n;i++){ a[i]=0; printf ("%d\n",a[i]);}
scanf ("%i",&b);
if (b==1)
{
   n++; 
   double *a2=a;  
   a = new double [n]; 
   i=5;
   a2[i]=9;
   a[i+1]==6;
  
   for(i=0;i<n;i++){ a[i]=a2[i]; printf ("%d\n",a[i]);}
   
}
getch();
}
не могу понять, почему у меня на выходе 2 нулевых массива.
0
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 12:48 #11
Цитата Сообщение от motr Посмотреть сообщение
for (i=0;i<=n;i++)
тут небольшая ошибка. элементы в массиве a нумеруются от 0 до n-1. a[n] находится за массивом и записывать в этот адрес нельзя потому что будут затёрты чужие данные
правильно будет так:
C++
1
for (i=0;i<n;i++)
0
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
20.09.2013, 13:02  [ТС] #12
_, но на выходе массив a[n] все равно остается нулевым кроме последнего добавленного элемента. а по идее в 5й ячейке должно быть число.
0
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 13:19 #13
motr, я не знаю в чем дело. программа немного запутана. и вот эта строчка:
C++
1
2
double *a2=a;  
a = new double [n];
что здесь происходит и не получится ли что после new два массива будут указывать на одну память?
0
Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 480
Записей в блоге: 1
20.09.2013, 15:47 #14
motr, а что должно получиться?
Прокомментирую Ваш код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main ()
{
int i, n,b;
 
n=10;
double *a = new double [n];
 
for (i=0;i<=n;i++){ a[i]=0; printf ("%d\n",a[i]);} //заполняется массив нулями и выводится на экран
scanf ("%i",&b);
if (b==1) 
{
   n++; 
   double *a2=a;  //запоминаешь указатель на исходный массив
   a = new double [n]; //создаешь новый
   i=5;
   a2[i]=9; //записываешь "9" в 5-ю позицию (a2[0] считаем нулевой позицией) исходного массива (кстати попробуй поменять "9" на "9.0"
   a[i+1]==6; зачем-то сравниваешь 6-ю позицию новосозданного массива, к-рый у тебя ещё не проинициализирован, с "6" (разумеется результат сравнения "false") и более того, результат сравнения ты никак дальше не используешь
  
   for(i=0;i<n;i++){ a[i]=a2[i]; printf ("%d\n",a[i]);} //здесь копирование массива и вывод на экран, но в цикле должна быть проверка i<[B]n-1[/B] вместо i<[B]n[/B], так как a2 на единицу короче
   
}
getch();
}
По идее, если строка 19 не вызовет исключение "выход за пределы памяти", (смотри комментарий к ней), она должна вывести: 0 0 0 0 0 9 0 0 0 0 0

Добавлено через 4 минуты
Цитата Сообщение от _ Посмотреть сообщение
motr, я не знаю в чем дело. программа немного запутана. и вот эта строчка:
C++
1
2
double *a2=a;  
a = new double [n];
что здесь происходит и не получится ли что после new два массива будут указывать на одну память?
нет. Не получиться. new записывает в "а" новый указатель, а в "а2" остается указатель на старый. Можете проверить

Добавлено через 4 минуты
проблема скорей всего в том, что я написал в строке 16: замени "9" на "9.0"

Добавлено через 38 минут
Вот что говорит компилятор:
"format '%d' expects argument of type 'int', but argument 2 has type 'double' "
Это по поводу твоей строки "printf ("%d\n",a[i]);"
Читай спецификаторы формата вот здесь: http://www.realcoding.net/article/view/1633
Нужно %f вместо %d

Добавлено через 13 минут
Вот этот код:
#include <iostream>
using namespace std;

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
   int i, n,b;
    n=10;
    double *a = new double [n];
    for (i=0;i<=n;i++){ a[i]=0; printf ("%f\n",a[i]);} //заполняется массив нулями и выводится на экран
    scanf ("%i",&b);
    if (b==1) 
{
   n++; 
   double *a2=a;  //запоминаешь указатель на исходный массив
   a = new double [n]; //создаешь новый   
   i=5;
   a2[i]=9; //записываешь "9" в 5-ю позицию (a2[0] считаем нулевой позицией) исходного массива (кстати попробуй поменять "9" на "9.0"
  // a[i+1]==6; зачем-то сравниваешь 6-ю позицию новосозданного массива, к-рый у тебя ещё не проинициализирован, с "6" (разумеется результат сравнения "false") и более того, результат сравнения ты никак дальше не используешь
  
   for(i=0;i<n-1;i++){ a[i]=a2[i]; printf ("%f\n",a[i]);} //здесь копирование массива и вывод на экран, но в цикле должна быть проверка i<[B]n-1[/B] вместо i<[B]n[/B], так как a2 на единицу короче
   
}
//getch();
    scanf ("%i",&b);
    return 0;
}
При запуске в он-лайн компиляторе: https://compilr.com
Выводит следующее:

Running:
------------------------------
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
1
0.000000
0.000000
0.000000
0.000000
0.000000
9.000000
0.000000
0.000000
0.000000
0.000000

Как видите, 9-ка есть!!!

Добавлено через 40 минут
И ещё, в сообщении "11" правильно замечено: в строке 8 должно быть "i<n", а не "i<=n"
2
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
20.09.2013, 20:09 #15
Цитата Сообщение от _ Посмотреть сообщение
double *a2
a = new double [n];
нет не будут
ибо a2 и a
это два разных имени
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2013, 20:09
Привет! Вот еще темы с ответами:

Почему находится произведение между двумя нулями? - C++
Не могу понять почему произведение между двумя нулями находится, даже если нет нулей. Что нужно изменить в коде? Дан массив из N...

Заполнить массив A и массив B нулями - C++
кто соображает попробуйте сделать я просто дуб в этом . 1.Создать 2 массива A и B из элементов типа char по 10 элементов Заполнить...

Почему возможно задать массив с размером -1 (почему такое вообще компилируется)? - C++
Всем привет. Долгое время не писал на плюсах, решил пройтись по основам, вспомнить. По непонятным для меня причинам этот код...

Заполнить массив нулями до определенной длины - C++
Всем доброго времени суток. Не получается дополнить массив типа wchar_t нулями до определенной длины Допустим переменная buff содержит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
20.09.2013, 20:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru