Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

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

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Динамический массив в С++: как поменять длину массива по ходу выполнения программы?
Имя
Сообщение << Старые топики   Новые топики >>
Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 00:30:18.200000   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
Есть такая проблема:

есть файл, в котором построчно записаны числа float (1 число - 1 строка). Количество чисел неизвестно. Как сделать так, т.е. какие операции надо объявить, чтоб программа читала всё следующее число и заносила его в массив, как то:
FILE *op;//файл с неизвестным количеством чисел float float d; int i=0; ... while (!feof(op)) { fscanf(op, "%f",&amp;d); ....//операции, которые надо произвести, чтобы длина массива float array[] увеличилась на единицу array[i]=d; i++; }
То есть, как сначала объявить такой массив, который будет менять свою длину, а затем, как увеличить его длину на единицу и благополучно присвоить значение элементу массива.
Post #: 1
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 01:08:01.980000   
vvviperrr

Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
как это кол во элементов неизвестно
fseek(f, 0, SEEK_END);
int count = ftell(f)/sizeof(float);
fseek(f, 0, SEEK_SET);

Ну а дальше понятно. пс. в с++ нет функции realloc как в сях.
Post #: 2
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 05:24:09.560000   
voody

Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
В Си есть функции malloc, calloc и realloc для выделения памяти (а тебе ее как раз нужно выделить под массив). В Си ++ есть оператор new (работает схоже с malloc'ом и calloc'ом). Что на счет перераспределения памяти в Си ++ - не помню сейчас, почитай документацию, должен что-то найти.
Post #: 3
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 16:45:01.693333   
Archivarius

Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000
Контейнеры использовать можно вместо массивов.
Например с вектором примерно так будет: #include &lt;vector&gt; ................... ................... vector &lt;float&gt; vect; FILE *op; float d; ... while (!feof(op)) { fscanf(op, "%f",&d); vect.push_back(d); }; //посмотреть что получилось for(int a=0;a&lt;vect.size();a++) cout&lt;&lt;vect[a]&lt;&lt;endl;
Post #: 4
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 18:06:38.146666   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
quote:

ORIGINAL: Archivarius

Контейнеры использовать можно вместо массивов.
Например с вектором примерно так будет: #include &lt;vector&gt; ................... ................... vector &lt;float&gt; vect; FILE *op; float d; ... while (!feof(op)) { fscanf(op, "%f",&amp;d); vect.push_back(d); }; //посмотреть что получилось for(int a=0;a&lt;vect.size();a++) cout&lt;&lt;vect[a]&lt;&lt;endl;


Да, этот способ удобней, но не думаю что препод оценит такой код, тем более что контейнеры мы не проходили.

Тут другую мысль высказали на другом форуме (другой форум - другие мысли :)) : использовать вспомогательный динамический массив, т.е. сначала записать одно число в массив array, скопировать в другой массив (temp), затем удалить массив array; потом заново создать но уже на 1 элемент больше, из массива temp скопировать в array; удалить массив temp, затем заново создать но 1 элемент больше и так пока не кончится файл. Я написал код, но он почему-то не работает:

#include &lt;assert.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; 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&lt;i; j++) { &nbsp;&nbsp; temp[j]=array[j]; } delete []array; array = new float [i]; assert(array!=0); for (j=0; j&lt;i; j++) { &nbsp;&nbsp; array[j]=temp[j]; } delete []temp; temp = new float [i]; assert(temp!=0); } for(int j=0; j&lt;i; j++) { printf("%f5.2 \n",array[j]); } delete []array; delete []temp; getch(); return 0; }
Кто знает, в чём дело?
Post #: 5
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 19:33:42.646666   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333
лучше используй один массив и realloc(), только увеличивай не на 1 элемент (много раз память дергать придеца) а например на 128, и веди учет сколько реально туда скопировано чисел. ну а как все прочитаешь можешь сделать реаллок с подсчитанным размером, чтобы пустого места там не оставалось.


Post #: 6
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 20:37:14.750000   
vvviperrr

Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
я помойму что то в этой жизни не понимаю. можно же подсчитать кол во элементов в файле, зачем моск ипать с размерностью дин массива. или мой комент просто не заметили… всякое бывает
Post #: 7
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 22:27:15.790000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
посмотри исходники std::vector, там всё более-менее прозрачно. если не хочешь заморачиваться (или достаточно работы со статическим файлом хорошего размера) - сначала посчитай количество необходимой памяти, затем выдели и занеси данные. будет два прохода, зато одно выделение
Post #: 8
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 22:52:04.880000   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333

quote:

ORIGINAL: vvviperrr
я помойму что то в этой жизни не понимаю. можно же подсчитать кол во элементов в файле, зачем моск ипать с размерностью дин массива. или мой комент просто не заметили… всякое бывает




>>есть файл, в котором построчно записаны числа float (1 число - 1 строка). Количество чисел неизвестно.
строками они, понимаешь, не посчитать сколько чисел. да и суть именно в том чтобы некое подобие динамического массива изобразить а не количество строк посчитать т.к >>Да, этот способ удобней, но не думаю что препод оценит такой код
Post #: 9
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 22:59:52.586666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: gewicht

строками они, понимаешь, не посчитать сколько чисел


это ещё почему? количество строк в файле так сложно посчитать?

quote:

ORIGINAL: gewicht
да и суть именно в том чтобы некое подобие динамического массива изобразить а не количество строк посчитать


классическое решение - перевыделение памяти по степеням двойки. сразу выделяешь 0*<размер типа> байт, не хватило - выделяешь 1*<размер типа> байт, не хватило - 2*<размер типа> байт…и так далее. операции с памятью на каждое расширение массива - слишком дорого и бессмысленно

как реализовать такой подход - это уже дело вкуса. можно объектно-базированно - делаешь класс с интерфейсом а-ля std::vector и вперёд. можно процедурно, вынося логику выделения прямо в код процедуры
Post #: 10
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 23:08:21.353333   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333

quote:

ORIGINAL: Denaturat
это ещё почему? количество строк в файле так сложно посчитать?


читай пост в два прохода, половину ответов сразу найдешь.
да, а имел ввиду я что размер файла на размер типа тогда делить нельзя.


quote:

ORIGINAL: Denaturat
классическое решение - перевыделение памяти по степеням двойки. сразу выделяешь 0*&lt;размер типа&gt; байт, не хватило - выделяешь 1*&lt;размер типа&gt; байт, не хватило - 2*&lt;размер типа&gt; байт…и так далее. операции с памятью на каждое расширение массива - слишком дорого и бессмысленно


как реализовать такой подход - это уже дело вкуса. можно объектно-базированно - делаешь класс с интерфейсом а-ля std::vector и вперёд. можно процедурно, вынося логику выделения прямо в код процедуры



на столько же классическое, на сколько и выделение памяти кусками адекватного размера.
>> сразу выделяешь 0*<размер типа> байт, не хватило
вот ето да, зачет, всегда буду сперва 0 байт выделять а потом смотреть хватит их или нет

да и не зачем препода напрягать с шаблонами, наверняка тема лабы (или что ето там) - работа с памятью а не STL и т.д )))

Post #: 11
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 23:17:00.983333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: gewicht
читай пост в два прохода, половину ответов сразу найдешь.


в таком случае читай ответы по нескольку раз - может тогда дойдёт

quote:

ORIGINAL: gewicht
на столько же классическое, на сколько и выделение памяти кусками адекватного размера.


посмотри реализацию вектора (очереди) в любом высокоуровневом языке программирования по выбору. найди там выделение "кусками адекватного размера". что? нету? ну надо же, какая досада…

quote:

ORIGINAL: gewicht
&gt;&gt; сразу выделяешь 0*&lt;размер типа&gt; байт, не хватило
вот ето да, зачет, всегда буду сперва 0 байт выделять а потом смотреть хватит их или нет


ешь больше йодированной соли, умник. а как полегчает - подумай: когда ты создаёшь пустой вектор - сколько он должен резервировать памяти?

quote:

ORIGINAL: gewicht
да и не зачем препода напрягать с шаблонами, наверняка тема лабы (или что ето там) - работа с памятью а не STL и т.д )))


ты где шаблоны увидел, чудо?
Post #: 12
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 23:18:01.546666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: gewicht
да, а имел ввиду я что размер файла на размер типа тогда делить нельзя.


о ужас! и что же нам теперь делать?
Post #: 13
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 23:30:12.630000   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333

quote:

ORIGINAL: Denaturat
посмотри реализацию вектора (очереди) в любом высокоуровневом языке программирования по выбору. найди там выделение "кусками адекватного размера". что? нету? ну надо же, какая досада…



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

quote:

ORIGINAL: Denaturat
ешь больше йодированной соли, умник. а как полегчает - подумай: когда ты создаёшь пустой вектор - сколько он должен резервировать памяти?


вектор ? ты имеешь ввиду std::vector? понятия не имею, я те честно говорю я в плюсах тупой и не одного класса на ++ не написал :-D
а когда ты писал: …перевыделение памяти по степеням двойки. сразу выделяешь 0*<размер типа> байт… - я думал ты про malloc().

quote:

ORIGINAL: Denaturat

ты где шаблоны увидел, чудо?


ну ты еще к орфографии докопайся, я говорю: препода не надо напрягать а сделать что просят (я предположил что хотят malloc() realloc() и пр), без предложеных здесь шаблонов и классов.
Post #: 14
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 17:09:02.816666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: gewicht
из того, что так сделано в "любом высокоуровневом языке" следует то что по другому делать нельзя ? вот я так делаю, можете с меня пример брать.


можно, почему нет. можно и лампочку в рот засунуть. вопрос только в том - зачем?

quote:

ORIGINAL: gewicht
вектор ? ты имеешь ввиду std::vector? понятия не имею, я те честно говорю я в плюсах тупой и не одного класса на ++ не написал :-D
а когда ты писал: …перевыделение памяти по степеням двойки. сразу выделяешь 0*&lt;размер типа&gt; байт… - я думал ты про malloc().


я имею в виду структуру данных "вектор". динамический массив, если тебе так понятней. чем выделять память - несущественно, задача от этого не меняется. если тебе так мил чистый C и ты не хочешь смотреть std::vector, посмотри аналогичную структуру данных из GTK+

quote:

ORIGINAL: gewicht
ну ты еще к орфографии докопайся, я говорю: препода не надо напрягать а сделать что просят (я предположил что хотят malloc() realloc() и пр), без предложеных здесь шаблонов и классов.


найди у меня хоть одну придирку не по существу вопроса. ещё раз - в приведённом мной алгоритме нет ни классов ни шаблонов, его вполне можно реализовать процедурно

насчёт "препода не надо напрягать" это вообще цирк. что важнее - среднее понимание или высшее образование? для тебя явно второе; что ты тогда тут делаешь? не теряй времени, продолжай "не напрягать преподов". и не лезь учить других тому, в чём ни хрена не понимаешь
Post #: 15
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 17:18:58.553333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
А вообще, когда просят помочь с лабой - неплохо бы указывать изучаемый язык (си или си++), чтобы избежать всех недоразумений с шаблонами и пр.
Post #: 16
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 17:53:47.800000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: _SaZ_

А вообще, когда просят помочь с лабой - неплохо бы указывать изучаемый язык (си или си++), чтобы избежать всех недоразумений с шаблонами и пр.


топик называется "динамический массив в C++", это раз. а два (в третий раз, по-моему) - никто не предлагал классов и тем более шаблонов. то, что кто-то видит их в любой фразе ещё не значит что они там действительно есть
Post #: 17
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 18:11:22.010000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Да, виноват, не дочитал топик… Только вот не говори, что std::vector - это не шаблонный класс. А выше как раз его и предлагали.

P.S. обладая некоторым даром телепатии могу сказать, что топиккастер изучает Си, а не Си++, просто не знает в чём разница между этими языками - вот и пишет так, как "круче" смотрится.
Post #: 18
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 18:14:24.120000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: _SaZ_

Да, виноват, не дочитал топик… Только вот не говори, что std::vector - это не шаблонный класс. А выше как раз его и предлагали.


ну, это не ко мне претензия :) я предлагал только посмотреть на его реализацию

quote:

ORIGINAL: _SaZ_
P.S. обладая некоторым даром телепатии могу сказать, что топиккастер изучает Си, а не Си++, просто не знает в чём разница между этими языками - вот и пишет так, как "круче" смотрится.


какая версия libastral.so?
Post #: 19
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 18:50:53.430000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
1.01a
Post #: 20
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 18:55:44.496666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: _SaZ_

1.01a


это устаревший релиз, переходи на nightly build - там много вкусного добавили ;)
Post #: 21
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 21:50:52.930000   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333
quote:

ORIGINAL: Denaturat
я имею в виду структуру данных "вектор". динамический массив, если тебе так понятней. чем выделять память - несущественно, задача от этого не меняется. если тебе так мил чистый C и ты не хочешь смотреть std::vector, посмотри аналогичную структуру данных из GTK+


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

quote:

ORIGINAL: Denaturat

найди у меня хоть одну придирку не по существу вопроса. ещё раз - в приведённом мной алгоритме нет ни классов ни шаблонов, его вполне можно реализовать процедурно



да все можно реализовать процедурно, кто ж спорит. я говорю как проще и нагляднее а ты как идеологически (с твоей стороны) правильно.

quote:

ORIGINAL: Denaturat

насчёт "препода не надо напрягать" это вообще цирк. что важнее - среднее понимание или высшее образование? для тебя явно второе; что ты тогда тут делаешь? не теряй времени, продолжай "не напрягать преподов". и не лезь учить других тому, в чём ни хрена не понимаешь




важнее умение а не понимание и образование.

если ты изучаешь в данный момент работу с памятью, решение выполненое с исп. СТЛ, классов и пр не нужно (выражение "необходимое и достаточное" знаешь ?). если тебе ето не понятно - то я даже не знаю. хотя может ты просто отделить идеологию от практического задания не можешь.


Post #: 22
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 22:01:53.673333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: gewicht
про С ты прав, да, и я не знаю структуры данных такой которая "вектор" и "динамический массив" знаю только указатель на память.
и не забывай учить быдлонарод как надо программить, а я может гавна на вентилятор буду подбрасывать время от времени.


читай это:
http://www.ozon.ru/context/detail/id/128290/?partner=steps3D
http://www.ozon.ru/context/detail/id/114200/

если таки смотреть и на C++, то ещё это:
http://www.ozon.ru/context/detail/id/1435484/

без знания теории структур данных в программировании делать нечего

quote:

ORIGINAL: gewicht
да все можно реализовать процедурно, кто ж спорит. я говорю как проще и нагляднее а ты как идеологически (с твоей стороны) правильно.


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

quote:

ORIGINAL: gewicht
важнее умение а не понимание и образование.


умение без понимания бывает только при рытье траншей и разгрузке вагонов: бери больше, кидай дальше. мы же вроде бы на программистском форуме, или я адресом ошибся? тогда прошу меня извинить

quote:

ORIGINAL: gewicht
если ты изучаешь в данный момент работу с памятью, решение выполненое с исп. СТЛ, классов и пр не нужно (выражение "необходимое и достаточное" знаешь ?). если тебе ето не понятно - то я даже не знаю. хотя может ты просто отделить идеологию от практического задания не можешь.


что ты понимаешь под словом "изучаешь"? "изучать" - это найти первое попавшееся решение, каким бы дурным и корявым оно ни было? или всё-таки разобраться в вопросе и сделать как положено?
Post #: 23
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 22:24:04.336666   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333

quote:

ORIGINAL: Denaturat
когда даёшь советы, лучше сначала говорить как правильно. и только потом - как проще, а как наглядней. в любом случае прежде чем отвечать на вопрос неплохо бы ознакомиться с темой, дабы быть уверенным что ты в ней компетентен. спрашивающий ведь тебе доверяет, считает тебя специалистом - а ты его чему учишь? стыдно должно быть



вариант с реаллоком неправилен ?

с темой (данной) я знаком достаточно для того чтобы хорошо решить поставленную (данную) задачу.

quote:

ORIGINAL: Denaturat
умение без понимания бывает только при рытье траншей и разгрузке вагонов: бери больше, кидай дальше. мы же вроде бы на программистском форуме, или я адресом ошибся? тогда прошу меня извинить


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


quote:

ORIGINAL: Denaturat
что ты понимаешь под словом "изучаешь"? "изучать" - это найти первое попавшееся решение, каким бы дурным и корявым оно ни было? или всё-таки разобраться в вопросе и сделать как положено?




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

quote:


как положено


на положено - х#й наложено, я отрицаю ваши профессионально-программерские понятия :-D
Post #: 24
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 22:35:44.090000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: gewicht
вариант с реаллоком неправилен ?


неэффективен. реализовывать динамические массивы таким образом имеет смысл только в очень частных случаях

quote:

ORIGINAL: gewicht
с темой (данной) я знаком достаточно для того чтобы хорошо решить поставленную (данную) задачу.


тема - реализация вектора (динамического массива). чуть выше ты писал, что о структурах данных понятия не имеешь; на каком основании ты вдруг кардинально поменял свою точку зрения на данный вопрос?

quote:

ORIGINAL: gewicht
умение это как финальная стадия, она же - цель, изучения\понимания, неважно как ты ето называешь. я например могу сказать что умею все, что мне приходилось делать т.е я разбирался в вопросе (незнакомом совершенно до етого) и после - выполнял задачу. про запас разбираться не получается, только через практику.


то, что ты что-то сделал, совсем не значит что ты это что-то сделал правильно. можно, например, гланды вырезать автогеном и через жопу - но можно и несколько иначе; то, что ты научился первому, не означает что ты хороший хирург - скорее наоборот

quote:

ORIGINAL: gewicht
в данном конкретном случае я имел ввиду тему задания из учебного плана етого мэна.
а вобще у меня свой способ "изучения", и я думаю от твоего он сильно отличается, и в чем он состоит я тебе рассказывать не буду.


по теме задания ты справился на троечку. при добром преподавателе. я бы отправил на пересдачу, а в случае упрямства - настаивал бы на отчислении. какой у тебя "способ изучения" мне всё равно, если толку от него мало

quote:

ORIGINAL: gewicht
на положено - х#й наложено, я отрицаю ваши профессионально-программерские понятия :-D


отрицаешь? так иди на курсы ассенизаторов, там вечно недобор, тебе будут очень рады
Post #: 25
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 22:56:53.350000   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333
quote:

ORIGINAL: Denaturat
неэффективен. реализовывать динамические массивы таким образом имеет смысл только в очень частных случаях


в данном случае не эффективен, или вобще ?


quote:

ORIGINAL: Denaturat
то, что ты что-то сделал, совсем не значит что ты это что-то сделал правильно. можно, например, гланды вырезать автогеном и через жопу - но можно и несколько иначе; то, что ты научился первому, не означает что ты хороший хирург - скорее наоборот



а кто определяет, правильно ето или нет ? что правильно например здесь использовать классы а не функции+структуры, или тот же маллок вместо СТЛного вектора ? случаем не сама ли задача ?

у меня особое чуство прекрасного, и все что я пишу мне сильно нравится :-DD хотя времени я трачу много чтобы добиться нужного мне вида.


quote:

ORIGINAL: Denaturat
по теме задания ты справился на троечку. при добром преподавателе. я бы отправил на пересдачу, а в случае упрямства - настаивал бы на отчислении. какой у тебя "способ изучения" мне всё равно, если толку от него мало


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


я бы уточнил задание у препода, надо ли ети шаблоны классы и пр. требования короче, ТЗ. знаешь что ето ? или ты чисто теоретик-программист ?

quote:

ORIGINAL: Denaturat
отрицаешь? так иди на курсы ассенизаторов, там вечно недобор, тебе будут очень рады





нет, я и дальше буду делать то, от чего профессиональные программеры волосы на жопе рвут :-)
Post #: 26
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 23:04:10.383333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: gewicht
в данном случае не эффективен, или вобще ?


в среднестатистическом

quote:

ORIGINAL: gewicht
а кто определяет, правильно ето или нет ? что правильно например здесь использовать классы а не функции+структуры, или тот же маллок вместо СТЛного вектора ? случаем не сама ли задача ?


ну, ты сам себе прекрасно ответил

quote:

ORIGINAL: gewicht
у меня особое чуство прекрасного, и все что я пишу мне сильно нравится :-DD хотя времени я трачу много чтобы добиться нужного мне вида.


это плохо. взрасти в себе иное чувство прекрасного, а это выбрось нафиг

quote:

ORIGINAL: gewicht
да, один препод сильно удивлялся что я не хочу решать одну задачу на чудесном языке программирования C#, который просто нахер там нужен небыл.


в данном контесте эта фраза - оффтопик. я не знаю, был ли он прав. впрочем, среди преподавателей тоже бывают некомпетентные люди, это есть, тут спорить не буду

quote:

ORIGINAL: gewicht
я бы уточнил задание у препода, надо ли ети шаблоны классы и пр. требования короче,


однако тут ты отвечаешь ничего не уточняя. и не предлагая уточнить. несколько лицемерно, не?

quote:

ORIGINAL: gewicht
ТЗ. знаешь что ето ? или ты чисто теоретик-программист ?


да я вообще второй раз за компьютером сижу :)

quote:

ORIGINAL: gewicht
нет, я и дальше буду делать то, от чего профессиональные программеры волосы на жопе рвут :-)


эммм…извини за нескромность, но на чьей жопе? если твоей - сочувствую, это должно быть неприятно
Post #: 27
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 23:20:26.950000   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333
quote:

ORIGINAL: Denaturat
в среднестатистическом


по статистике у всех людей по одному яйцу.


quote:

ORIGINAL: Denaturat
однако тут ты отвечаешь ничего не уточняя. и не предлагая уточнить. несколько лицемерно, не?


при личном контакте я бы все-таки уточнил. но сейчас исходных данных вполне достаточно, смотри:


&gt;&gt;…//операции, которые надо произвести, чтобы длина массива float array[] увеличилась на единицу


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

всего-то прочитать в массив флоаты из файла которые там в виде строк. все.

quote:

ORIGINAL: Denaturat

эммм…извини за нескромность, но на чьей жопе? если твоей - сочувствую, это должно быть неприятно




каждый программист точно знает как надо правильно писать, и если кто-то ето отрицает они прямо места себе не находят, фактически - волосы себе на жопе рвут.
Post #: 28
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 02:55:37.110000   
Archivarius

Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000

quote:

ORIGINAL: t3rmin41


Да, этот способ удобней, но не думаю что препод оценит такой код, тем более что контейнеры мы не проходили.
Тогда вот так:#include &lt;iostream&gt; using namespace std; int main() {   struct elem{float el; elem *nxt_el;};  elem *ce=new elem, *ce2;  FILE *op;  char buf[10];  unsigned int count=0;  op=fopen("C:\\arr.txt","rt");  while (!feof(op))  {   fscanf(op, "%s",buf);   ce-&gt;el=atof(buf);   ce2=ce;   ce=new elem;   ce-&gt;nxt_el=ce2;   count++;  };  fclose(op);  float *arr=new float[count]; //раз уж так приспичило чтобы массив был, преобразуем в массив :)  for (int a=0;a&lt;count;a++)   {  ce2=ce;  ce=ce-&gt;nxt_el;  arr[a]=ce-&gt;el;  delete ce2;  };  delete ce;    for (int a=0;a&lt;count;a++) cout&lt;&lt;arr[a]&lt;&lt;endl; //проверяем что получилось delete []arr;  return 0; }ИМХО это самый быстрый способ будет.

Post #: 29
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 11:30:47.776666   
gewicht

Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333
quote:

ORIGINAL: ArchivariusИМХО это самый быстрый способ будет.
 

да вы наркоман :-D зачем к каждому флоату прикреплять еще и указатель на следущий, и при каждом добавлении элемента дергать память ?

вот что я предлагал примерно:

int main() {   float *arr;   FILE *op;   int len, i;   char buf[16];   arr=(float*)malloc(128*sizeof(float));   len=128;   i=0;   op=fopen("C:\\1.txt", "rt");   while (!feof(op))   {   fscanf(op, "%s", buf);   arr[i]=atof(buf);   if (++i == len) arr=(float*)realloc(arr, (len+=128)*sizeof(float));   }   fclose(op);   arr=(float*)realloc(arr, i*sizeof(float));   for(int a=0; a&lt;i; a++) printf("%f\n", arr[a]);   return 0; }
замени len+=128 на len*=2 и получишь то что предлагал другой товарищ, не равными кусками расширять массив а по степеням двойки.

такой вот красивый кодес который можно сократить еще в полтора раза и сделать еще красивее, но боюсь будет не так понятно топик автору :-D


Post #: 30
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 12:26:03.423333   
Archivarius

Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000

quote:

ORIGINAL: gewicht
зачем к каждому флоату прикреплять еще и указатель на следущий, и при каждом добавлении элемента дергать память ?
Односвязный список потому что. 
Post #: 31
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 12:58:59.920000   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
нельзя делать безграничных прог

#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define MAXNUMS 5000 main() { FILE *fp; float n, *nums[MAXNUMS], *np; int i, len; if ((fp = fopen("file.txt", "rb")) == NULL) return 1; for (i = 0; i &lt; MAXNUMS && fscanf(fp, "%f", &n) == 1 && (np = (float *) malloc(sizeof(float))) != NULL; i++) *np = n, nums[i] = np; for (len = i, i = 0; i &lt; len; i++) printf("%g\n", *nums[i]), free(nums[i]); return 0; }
файл
0.1 0.2 0.3
вывод
0.1 0.2 0.3
если твою прогу можно вырубить очень длинным файлом, то она неправильная, даже если препод говорит что так надо

(убрал утечку памяти)
Post #: 32
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 13:13:17.643333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Что это?! Меня пугает такой код. Keys, плз, ставь комменты. Чтобы было понятно, что ты хочешь сделать?

Выше уже написали красиво и просто реализацию однонаправленного списка.
Post #: 33
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 15:17:50.596666   
Archivarius

Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000

Решил сейчас посмотреть ради интереса, сколько раз данные переместятся в другие участки памяти при вызове realloc, если постепенно увеличивать занимаемую память, допустим в промежутке от 1 до 100000.
Вот таким образом смотрел: #include &lt;iostream&gt; using namespace std; void mem(int offs) { cout&lt;&lt;"\n\n offset="&lt;&lt;offs&lt;&lt;endl; void *c, *a=malloc(1);  for (int b=2;b&lt;100000;b+=offs)  {   c=a;   a=realloc(a,b);   if (a!=c) cout&lt;&lt;b&lt;&lt;" ";  };  free(a); }; int main() {  mem(10);  mem(100);  mem(1000);  return 0; }И вот что увидел: При перераспределении с большим шагом, память больше раз перемещается. Т.е. при шаге в 1000 у меня память переместилась 13 раз, а при шаге 10 всего 2 раза.
Получается, что realloc лучше делать маленькими блоками чем большими.

Только вот не пойму, почему так? Может кто-нибудь обьяснить?

p.s. смотрел на MS Visual C++ 2005

Post #: 34
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 15:57:17.173333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Куча заточена под выделение маленьких блоков, т.к. наиболее часто выделения памяти происходят по чуть-чуть.
Post #: 35
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 18:51:42.740000   
Logree

Сообщений: 77
Оценки: 0
Присоединился: 2006-11-16 17:14:16.653333
Однонапрвленный список с системой FIFO те импровезированный Стек..
Post #: 36
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 20:40:45.843333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: Logree

Однонапрвленный список с системой FIFO те импровезированный Стек..


вообще-то стек это LIFO. FIFO это очередь
Post #: 37
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-30 13:12:17.833333   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
quote:

Keys, плз, ставь комменты. Чтобы было понятно, что ты хочешь сделать?

если есть необходимость я ставлю, но комменты это плохой стиль (они устаревают), когда прогу переделываешь потом приходится и комменты к ней переделывать (а кому это надо)

числа читаются, дублируются в память, эти блоки памяти прицепляются к массиву указателей (который уже участвует в задаче, можно контролировать его длину и это не будет влиять на чтение и сохранение данных)
Post #: 38
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-30 13:53:35.723333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Мне непонятно, откуда и зачем в твоей проге ограничения? Автор же сказал - количество чисел НЕИЗВЕСТНО. Вот свой #define мог бы и прокоментировать.

P.S. А кто тебе сказал, что комментарии в коде не нужны? Ты когда-нибудь участвовал в проектах, которые разрабатывают более одного человека?
Post #: 39
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-30 16:23:49.516666   
mishok

Сообщений: 239
Оценки: 0
Присоединился: 2007-07-03 23:42:21.170000
можно все засунуть в строку и потом разделить в массив… тогда массив будет такой длинны, сколько элментов… в VB есть функция split, в С++ должно быть аналогичное…
 
[left]Split(expression[, delimiter][, count][, compare])[/left][left]Данная функция по своему действию противоположна функции Join(). Она возвращает одномерный массив, содержащий определенное количество подстрок указанной строки.[/left]
Post #: 40
Страниц:  [1] 2
Все форумы >> [Компилируемые языки] >> Динамический массив в С++: как поменять длину массива по ходу выполнения программы?







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.