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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 192, средняя оценка - 4.94
t3rmin41
0 / 0 / 0
Регистрация: 27.10.2008
Сообщений: 3
#1

Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - C++

27.10.2008, 16:50. Просмотров 23473. Ответов 6
Метки нет (Все метки)

Есть такая проблема:

есть файл, в котором построчно записаны числа float (1 число - 1 строка). Количество чисел неизвестно. Как сделать так, т.е. какие операции надо объявить, чтоб программа читала всё следующее число и заносила его в массив, как то:
C++
1
2
3
4
5
6
7
8
9
10
11
FILE *op;//файл с неизвестным количеством чисел float
float d;
int i=0;
...
while (!feof(op))
{
fscanf(op, "%f",&d);
....//операции, которые надо произвести, чтобы длина массива float array[] увеличилась на единицу
array=d;
i++;
}
То есть, как сначала объявить такой массив, который будет менять свою длину, а затем, как увеличить его длину на единицу и благополучно присвоить значение элементу массива.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2008, 16:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамический массив в С++: как поменять длину массива по ходу выполнения программы? (C++):

Как отсортирвоать контейнер, если его тип определяется по ходу выполнения программы? (динамическая идентификация типов) - C++
собсно #include <windows.h> #include <stdio.h> #include <vector> #include <list> #include <algorithm> #include <cxxabi.h> ...

Динамический массив, много циклов и простые числа. Как ускорить работу программы ? - C++
Всем привет. Задание следующее: Кто нибудь вводит с клавиатуры число n и k, должен создастся массив из чисел от 1 до n, далее каждый...

Как объявить динамический массив, чтобы он был виден во всех процедурах программы? - C++
Доброго времени суток! Суть проблемы: в Visual Studio создана форма с кнопкой, при нажатии на которую, из файла считываются необходимые...

Двумерный массив (поменять статический массив на динамический) - C++
Нужно поменять статический массив на динамический с выделением памяти #include <iostream> #include <iomanip> #include <cstdlib> ...

Динамический массив структур. Почему данные доступны после выполнения операции delete [] - C++
Всем привет! Выполнил вот такое задание. После того как вывелись данные трех структур, очищаю выделенную область памяти оператором delete...

Безопасно ли использовать memcpy при выделении памяти по ходу выполнения програмы - C++
Безопасно ли использовать memcpy при выделении памяти по ходу выполнения програмы. Например: namespace { static int fieldCnt...

6
Sergei
1440 / 707 / 41
Регистрация: 22.04.2008
Сообщений: 1,610
27.10.2008, 16:55 #2
Можно заносить в динамический массив по одному элементу, то есть чтобы массив увеличивался в размере на один элемент, а можно сделать чтобы он увеличивался в 2 раза
0
t3rmin41
0 / 0 / 0
Регистрация: 27.10.2008
Сообщений: 3
27.10.2008, 17:04  [ТС] #3
Цитата Сообщение от Sergei Посмотреть сообщение
Можно заносить в динамический массив по одному элементу, то есть чтобы массив увеличивался в размере на один элемент,

Ну и как это сделать? Одно дело - динамически распределить место когда заранее известен размер массива (банально с помощью new) а вот как в цикле сделать чтоб массив по ходу программы увеличивался? Какие операции/функции применять?
0
Sergei
1440 / 707 / 41
Регистрация: 22.04.2008
Сообщений: 1,610
27.10.2008, 17:05 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Например для добавления одного элемента в дин. массив надо написать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//создаем доролнительный массив 
float *temp;
temp = new float [n];// на кол-во элементов в массиве с данными
//далее копируем все данные из массива op в массив temp
for(int i=0;i<n;i++)
{
   temp[i] = op[i];
}
//удаляем массив ор и создаем заново но на один элемент больше
delete [] op;
op = new float[n+1];
//и копируем данные обратно
for(int i=0;i<n;i++)
{
    op[i]=temp[i];
}
 op[n] = // добавляем элемент в конец
если что-то непонятно то спрашивай
3
Xentar
Of Wolf and Man
993 / 188 / 4
Регистрация: 09.07.2008
Сообщений: 1,778
27.10.2008, 18:27 #5
Как сказал Sergei, либо используешь промежуточный массив для увиличения длинны.
Либо как вариант используй двусвязный список - тоже удобная штука, только соответственно памяти будет занимать больше на 2 указателя на элемент списка.
ЗЫЖ
и ДА, я практолог
0
t3rmin41
0 / 0 / 0
Регистрация: 27.10.2008
Сообщений: 3
27.10.2008, 18:37  [ТС] #6
Да, идея со вторым массивом неплохая, я даже код написал, но он почему-то не работает:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <assert.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
 
main()
{
FILE *op;//файл с неизвестным количеством чисел float
float d;
int i=0;
int n=1;
char buf[10];
 
 
op=fopen("data-float.dat","rt");
 
float *temp;
float *array;
temp = new float [n];
assert(temp!=0);
 
array = new float [n];
assert(array!=0);
 
while (!feof(op))
{
fscanf(op, "%s",buf);
d=atof(buf);
array[i]=d;
i++;
for (int j=0; j<i; j++)
{
  temp[j]=array[j];
}
 
delete []array;
array = new float [i];
assert(array!=0);
for (j=0; j<i; j++)
{
  array[j]=temp[j];
}
delete []temp;
temp = new float [i];
assert(temp!=0);
 
 
 
}
 
for(int j=0; j<i; j++)
{
printf("%f5.2 \n",array[j]);
}
 
 
 
delete []array;
delete []temp;
 
getch();
return 0;
}
Кто знает, в чём дело?
0
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
27.10.2008, 19:26 #7
Незнаю подойдет ли, но есть такая замечательная штука, векторы называются
Читать хелп например здеся
http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html#VECTOR
0
27.10.2008, 19:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2008, 19:26
Привет! Вот еще темы с ответами:

Как создать динамический массив типа string? Как создать класс такого массива? - C++
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите, пожалуйста, очень нужна помощь!

Как "подкрасить" некоторые элементы массива на выводе во время выполнения программы - C++
как &quot;подкрасить&quot; некоторые элементы массива на выводе во время выполнения программы в общем, необходимо, если такое возможно, чтобы,...

Вынести из программы функцию(динамический массив) - C++
Код рабочий.Не могу вынести правильно из кода функцию транспортировки матрицы.Задание: Напишите функцию транспонирования матрицы с...

Динамический массив. Ошибка при выполнении программы - C++
Программа должна предоставить заполнение массива пользователю, а дальше вывести массив на экран. (Массив динамический) При компиляции...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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