Динамический массив в С++: как поменять длину массива по ходу выполнения программы?
Пользователи, просматривающие топик: 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",&d);
....//операции, которые надо произвести, чтобы длина массива float array[] увеличилась на единицу
array[i]=d;
i++;
}
То есть, как сначала объявить такой массив, который будет менять свою длину, а затем, как увеличить его длину на единицу и благополучно присвоить значение элементу массива.
|
|
|
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 как в сях.
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 05:24:09.560000
|
|
|
voody
Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
|
В Си есть функции malloc, calloc и realloc для выделения памяти (а тебе ее как раз нужно выделить под массив). В Си ++ есть оператор new (работает схоже с malloc'ом и calloc'ом). Что на счет перераспределения памяти в Си ++ - не помню сейчас, почитай документацию, должен что-то найти.
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 16:45:01.693333
|
|
|
Archivarius
Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000
|
Контейнеры использовать можно вместо массивов. Например с вектором примерно так будет: #include <vector>
...................
...................
vector <float> vect;
FILE *op;
float d;
...
while (!feof(op))
{
fscanf(op, "%f",&d);
vect.push_back(d);
};
//посмотреть что получилось
for(int a=0;a<vect.size();a++) cout<<vect[a]<<endl;
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 18:06:38.146666
|
|
|
t3rmin41
Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
|
quote:
ORIGINAL: Archivarius Контейнеры использовать можно вместо массивов. Например с вектором примерно так будет: #include <vector>
...................
...................
vector <float> vect;
FILE *op;
float d;
...
while (!feof(op))
{
fscanf(op, "%f",&d);
vect.push_back(d);
};
//посмотреть что получилось
for(int a=0;a<vect.size();a++) cout<<vect[a]<<endl; Да, этот способ удобней, но не думаю что препод оценит такой код, тем более что контейнеры мы не проходили. Тут другую мысль высказали на другом форуме (другой форум - другие мысли :)) : использовать вспомогательный динамический массив, т.е. сначала записать одно число в массив array, скопировать в другой массив (temp), затем удалить массив array; потом заново создать но уже на 1 элемент больше, из массива temp скопировать в array; удалить массив temp, затем заново создать но 1 элемент больше и так пока не кончится файл. Я написал код, но он почему-то не работает: #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;
} Кто знает, в чём дело?
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 19:33:42.646666
|
|
|
gewicht
Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333
|
лучше используй один массив и realloc(), только увеличивай не на 1 элемент (много раз память дергать придеца) а например на 128, и веди учет сколько реально туда скопировано чисел. ну а как все прочитаешь можешь сделать реаллок с подсчитанным размером, чтобы пустого места там не оставалось.
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 20:37:14.750000
|
|
|
vvviperrr
Сообщений: 301
Оценки: 0
Присоединился: 2007-03-20 21:33:16.790000
|
я помойму что то в этой жизни не понимаю. можно же подсчитать кол во элементов в файле, зачем моск ипать с размерностью дин массива. или мой комент просто не заметили… всякое бывает
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 22:27:15.790000
|
|
|
Denaturat
Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
|
посмотри исходники std::vector, там всё более-менее прозрачно. если не хочешь заморачиваться (или достаточно работы со статическим файлом хорошего размера) - сначала посчитай количество необходимой памяти, затем выдели и занеси данные. будет два прохода, зато одно выделение
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 22:52:04.880000
|
|
|
gewicht
Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333
|
quote:
ORIGINAL: vvviperrr я помойму что то в этой жизни не понимаю. можно же подсчитать кол во элементов в файле, зачем моск ипать с размерностью дин массива. или мой комент просто не заметили… всякое бывает
>>есть файл, в котором построчно записаны числа float (1 число - 1 строка). Количество чисел неизвестно. строками они, понимаешь, не посчитать сколько чисел. да и суть именно в том чтобы некое подобие динамического массива изобразить а не количество строк посчитать т.к >>Да, этот способ удобней, но не думаю что препод оценит такой код
|
|
|
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 и вперёд. можно процедурно, вынося логику выделения прямо в код процедуры
|
|
|
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*<размер типа> байт, не хватило - выделяешь 1*<размер типа> байт, не хватило - 2*<размер типа> байт…и так далее. операции с памятью на каждое расширение массива - слишком дорого и бессмысленно как реализовать такой подход - это уже дело вкуса. можно объектно-базированно - делаешь класс с интерфейсом а-ля std::vector и вперёд. можно процедурно, вынося логику выделения прямо в код процедуры на столько же классическое, на сколько и выделение памяти кусками адекватного размера. >> сразу выделяешь 0*<размер типа> байт, не хватило вот ето да, зачет, всегда буду сперва 0 байт выделять а потом смотреть хватит их или нет да и не зачем препода напрягать с шаблонами, наверняка тема лабы (или что ето там) - работа с памятью а не STL и т.д )))
|
|
|
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 >> сразу выделяешь 0*<размер типа> байт, не хватило вот ето да, зачет, всегда буду сперва 0 байт выделять а потом смотреть хватит их или нет ешь больше йодированной соли, умник. а как полегчает - подумай: когда ты создаёшь пустой вектор - сколько он должен резервировать памяти? quote:
ORIGINAL: gewicht да и не зачем препода напрягать с шаблонами, наверняка тема лабы (или что ето там) - работа с памятью а не STL и т.д ))) ты где шаблоны увидел, чудо?
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-27 23:18:01.546666
|
|
|
Denaturat
Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
|
quote:
ORIGINAL: gewicht да, а имел ввиду я что размер файла на размер типа тогда делить нельзя. о ужас! и что же нам теперь делать?
|
|
|
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() и пр), без предложеных здесь шаблонов и классов.
|
|
|
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*<размер типа> байт… - я думал ты про malloc(). я имею в виду структуру данных "вектор". динамический массив, если тебе так понятней. чем выделять память - несущественно, задача от этого не меняется. если тебе так мил чистый C и ты не хочешь смотреть std::vector, посмотри аналогичную структуру данных из GTK+ quote:
ORIGINAL: gewicht ну ты еще к орфографии докопайся, я говорю: препода не надо напрягать а сделать что просят (я предположил что хотят malloc() realloc() и пр), без предложеных здесь шаблонов и классов. найди у меня хоть одну придирку не по существу вопроса. ещё раз - в приведённом мной алгоритме нет ни классов ни шаблонов, его вполне можно реализовать процедурно насчёт "препода не надо напрягать" это вообще цирк. что важнее - среднее понимание или высшее образование? для тебя явно второе; что ты тогда тут делаешь? не теряй времени, продолжай "не напрягать преподов". и не лезь учить других тому, в чём ни хрена не понимаешь
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 17:18:58.553333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
А вообще, когда просят помочь с лабой - неплохо бы указывать изучаемый язык (си или си++), чтобы избежать всех недоразумений с шаблонами и пр.
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 17:53:47.800000
|
|
|
Denaturat
Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
|
quote:
ORIGINAL: _SaZ_ А вообще, когда просят помочь с лабой - неплохо бы указывать изучаемый язык (си или си++), чтобы избежать всех недоразумений с шаблонами и пр. топик называется "динамический массив в C++", это раз. а два (в третий раз, по-моему) - никто не предлагал классов и тем более шаблонов. то, что кто-то видит их в любой фразе ещё не значит что они там действительно есть
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 18:11:22.010000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Да, виноват, не дочитал топик… Только вот не говори, что std::vector - это не шаблонный класс. А выше как раз его и предлагали. P.S. обладая некоторым даром телепатии могу сказать, что топиккастер изучает Си, а не Си++, просто не знает в чём разница между этими языками - вот и пишет так, как "круче" смотрится.
|
|
|
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?
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 18:50:53.430000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
1.01a
|
|
|
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 - там много вкусного добавили ;)
|
|
|
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 насчёт "препода не надо напрягать" это вообще цирк. что важнее - среднее понимание или высшее образование? для тебя явно второе; что ты тогда тут делаешь? не теряй времени, продолжай "не напрягать преподов". и не лезь учить других тому, в чём ни хрена не понимаешь
важнее умение а не понимание и образование. если ты изучаешь в данный момент работу с памятью, решение выполненое с исп. СТЛ, классов и пр не нужно (выражение "необходимое и достаточное" знаешь ?). если тебе ето не понятно - то я даже не знаю. хотя может ты просто отделить идеологию от практического задания не можешь.
|
|
|
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 если ты изучаешь в данный момент работу с памятью, решение выполненое с исп. СТЛ, классов и пр не нужно (выражение "необходимое и достаточное" знаешь ?). если тебе ето не понятно - то я даже не знаю. хотя может ты просто отделить идеологию от практического задания не можешь. что ты понимаешь под словом "изучаешь"? "изучать" - это найти первое попавшееся решение, каким бы дурным и корявым оно ни было? или всё-таки разобраться в вопросе и сделать как положено?
|
|
|
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
|
|
|
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 отрицаешь? так иди на курсы ассенизаторов, там вечно недобор, тебе будут очень рады
|
|
|
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 отрицаешь? так иди на курсы ассенизаторов, там вечно недобор, тебе будут очень рады
нет, я и дальше буду делать то, от чего профессиональные программеры волосы на жопе рвут :-)
|
|
|
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 нет, я и дальше буду делать то, от чего профессиональные программеры волосы на жопе рвут :-) эммм…извини за нескромность, но на чьей жопе? если твоей - сочувствую, это должно быть неприятно
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-28 23:20:26.950000
|
|
|
gewicht
Сообщений: 24
Оценки: 0
Присоединился: 2008-10-12 14:09:55.133333
|
quote:
ORIGINAL: Denaturat в среднестатистическом по статистике у всех людей по одному яйцу. quote:
ORIGINAL: Denaturat однако тут ты отвечаешь ничего не уточняя. и не предлагая уточнить. несколько лицемерно, не? при личном контакте я бы все-таки уточнил. но сейчас исходных данных вполне достаточно, смотри: >>…//операции, которые надо произвести, чтобы длина массива float array[] увеличилась на единицу >>То есть, как сначала объявить такой массив, который будет менять свою длину, а затем, как увеличить его длину на единицу и благополучно присвоить значение элементу массива. всего-то прочитать в массив флоаты из файла которые там в виде строк. все. quote:
ORIGINAL: Denaturat эммм…извини за нескромность, но на чьей жопе? если твоей - сочувствую, это должно быть неприятно
каждый программист точно знает как надо правильно писать, и если кто-то ето отрицает они прямо места себе не находят, фактически - волосы себе на жопе рвут.
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 02:55:37.110000
|
|
|
Archivarius
Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000
|
quote:
ORIGINAL: t3rmin41 Да, этот способ удобней, но не думаю что препод оценит такой код, тем более что контейнеры мы не проходили. Тогда вот так:#include <iostream>
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->el=atof(buf);
ce2=ce;
ce=new elem;
ce->nxt_el=ce2;
count++;
};
fclose(op);
float *arr=new float[count]; //раз уж так приспичило чтобы массив был, преобразуем в массив :)
for (int a=0;a<count;a++)
{
ce2=ce;
ce=ce->nxt_el;
arr[a]=ce->el;
delete ce2;
};
delete ce;
for (int a=0;a<count;a++) cout<<arr[a]<<endl; //проверяем что получилось
delete []arr;
return 0;
} ИМХО это самый быстрый способ будет.
|
|
|
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<i; a++) printf("%f\n", arr[a]);
return 0;
}
замени len+=128 на len*=2 и получишь то что предлагал другой товарищ, не равными кусками расширять массив а по степеням двойки. такой вот красивый кодес который можно сократить еще в полтора раза и сделать еще красивее, но боюсь будет не так понятно топик автору :-D
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 12:26:03.423333
|
|
|
Archivarius
Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000
|
quote:
ORIGINAL: gewicht зачем к каждому флоату прикреплять еще и указатель на следущий, и при каждом добавлении элемента дергать память ? Односвязный список потому что.
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 12:58:59.920000
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
нельзя делать безграничных прог
#include <stdio.h>
#include <stdlib.h>
#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 < MAXNUMS
&& fscanf(fp, "%f", &n) == 1
&& (np = (float *) malloc(sizeof(float))) != NULL; i++)
*np = n, nums[i] = np;
for (len = i, i = 0; i < len; i++)
printf("%g\n", *nums[i]), free(nums[i]);
return 0;
}
файл
0.1
0.2
0.3
вывод
0.1
0.2
0.3
если твою прогу можно вырубить очень длинным файлом, то она неправильная, даже если препод говорит что так надо (убрал утечку памяти)
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 13:13:17.643333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Что это?! Меня пугает такой код. Keys, плз, ставь комменты. Чтобы было понятно, что ты хочешь сделать? Выше уже написали красиво и просто реализацию однонаправленного списка.
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 15:17:50.596666
|
|
|
Archivarius
Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000
|
Решил сейчас посмотреть ради интереса, сколько раз данные переместятся в другие участки памяти при вызове realloc, если постепенно увеличивать занимаемую память, допустим в промежутке от 1 до 100000. Вот таким образом смотрел: #include <iostream>
using namespace std;
void mem(int offs)
{
cout<<"\n\n offset="<<offs<<endl;
void *c, *a=malloc(1);
for (int b=2;b<100000;b+=offs)
{
c=a;
a=realloc(a,b);
if (a!=c) cout<<b<<" ";
};
free(a);
};
int main()
{
mem(10);
mem(100);
mem(1000);
return 0;
} И вот что увидел: При перераспределении с большим шагом, память больше раз перемещается. Т.е. при шаге в 1000 у меня память переместилась 13 раз, а при шаге 10 всего 2 раза. Получается, что realloc лучше делать маленькими блоками чем большими. Только вот не пойму, почему так? Может кто-нибудь обьяснить? p.s. смотрел на MS Visual C++ 2005
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 15:57:17.173333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Куча заточена под выделение маленьких блоков, т.к. наиболее часто выделения памяти происходят по чуть-чуть.
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 18:51:42.740000
|
|
|
Logree
Сообщений: 77
Оценки: 0
Присоединился: 2006-11-16 17:14:16.653333
|
Однонапрвленный список с системой FIFO те импровезированный Стек..
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-29 20:40:45.843333
|
|
|
Denaturat
Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
|
quote:
ORIGINAL: Logree Однонапрвленный список с системой FIFO те импровезированный Стек.. вообще-то стек это LIFO. FIFO это очередь
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-30 13:12:17.833333
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
quote:
Keys, плз, ставь комменты. Чтобы было понятно, что ты хочешь сделать? если есть необходимость я ставлю, но комменты это плохой стиль (они устаревают), когда прогу переделываешь потом приходится и комменты к ней переделывать (а кому это надо) числа читаются, дублируются в память, эти блоки памяти прицепляются к массиву указателей (который уже участвует в задаче, можно контролировать его длину и это не будет влиять на чтение и сохранение данных)
|
|
|
RE: Динамический массив в С++: как поменять длину массива по ходу выполнения программы? - 2008-10-30 13:53:35.723333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Мне непонятно, откуда и зачем в твоей проге ограничения? Автор же сказал - количество чисел НЕИЗВЕСТНО. Вот свой #define мог бы и прокоментировать. P.S. А кто тебе сказал, что комментарии в коде не нужны? Ты когда-нибудь участвовал в проектах, которые разрабатывают более одного человека?
|
|
|
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]
|
|
|
|
|