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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ виртуальные функции http://www.cyberforum.ru/cpp-beginners/thread958141.html
C++ подскажите пожалуста на словах код писать ненадо. как преопределить функцию virtual Print(). Создать абстрактный базовый класс Employer (служащий) с чисто виртуальной функцией Print(). Создайте три производных класса: President, Manager, Worker. Переопределите функцию Print() для вывода информации, соответствующей каждому типу служащего.
C++ Заменить рекурсию Доброго времени суток. Помогите избавиться от рекурсии #include "stdafx.h" #include <iostream> #include <vector> using namespace std; int n; vector<int> p(10); http://www.cyberforum.ru/cpp-beginners/thread958137.html
Строки. Вывести на экран самую короткую группу из 0 и 1 C++
Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу. Попроще только, без #include <algorithm> #include <iterator>, как в похожем вопросе здесь, такое еще не учили. Заранее спасибо)
Утечка памяти C++
В небольшой программе с использованием OpenCV происходит утечка памяти, с чем связана не понимаю, прошу помощи, спасибо! #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <iostream> #include <vector> #include <stdio.h> #include <stdlib.h> using namespace std;
C++ Вычислить сумму ряда http://www.cyberforum.ru/cpp-beginners/thread958125.html
Вычислить сумму ряда(приведен на изображении) с точностью ε. Сделать графическую интерпретацию результата.\ Как я понял вводятся 'x' и 'ε'. Но непонятно как считается эта сумма(какую формулу использовать) и как написать эту сумму ряда на С++.
C++ Создать свой класс, содержащий три закрытые переменные Программа на С++ СРОЧНО! Создать свой класс, содержащий три закрытые переменные типа int, char, double, одну открытую переменную и две функции, одна из которых имеет один параметр, вторая - три параметра. Буду благодарен за помощь в решении! подробнее

Показать сообщение отдельно
Algoritmer
 Аватар для Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 477
Записей в блоге: 1
20.09.2013, 15:47     Почему массив изначально нулями не инициализируется?
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"
 
Текущее время: 23:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru