Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какие есть динамические массивы в Си? 
:(
    Опции темы
Anton Vatchenko
Дата 4.12.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Привык писать на С++ под винду, а тут не знаю как...


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 4.12.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Anton Vatchenko, точно также:
#include <vector>
std::vector
#include <map>
std::map
#include <list>
std::list
#include <set>
std::set

да и malloc/calloc/realloc/free тоже имеются

Это сообщение отредактировал(а) bsa - 4.12.2007, 15:31
PM   Вверх
Fazil6
Дата 4.12.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(bsa @  4.12.2007,  15:31 Найти цитируемый пост)
#include <vector>
std::vector
#include <map>
std::map
#include <list>
std::list
#include <set>
std::set


в Си  smile ?
PM MAIL   Вверх
Lazin
Дата 4.12.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



в си есть realloc и указатели))
PM MAIL Skype GTalk   Вверх
Anton Vatchenko
Дата 4.12.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Нет, а по принципу vector и прочие?


--------------------
user posted image
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Anton Vatchenko @  4.12.2007,  15:55 Найти цитируемый пост)
Нет, а по принципу vector и прочие?

нету
PM MAIL   Вверх
zkv
Дата 4.12.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Anton Vatchenko @  4.12.2007,  15:55 Найти цитируемый пост)
Нет, а по принципу vector и прочие? 

дык определись, с или с++?
Просто в с по определению не может быть контейнеров типа vector

Это сообщение отредактировал(а) zkv - 4.12.2007, 16:00
PM MAIL   Вверх
Anton Vatchenko
Дата 4.12.2007, 16:04 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Так вот поэтому я и спрашиваю про Си, но работал с vector, а 90% ответов тут дали люди невнимательные... Мне нужны динамические массивы, посему маллок не подойдет, вектор - в с++.


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 4.12.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Anton Vatchenko, malloc - это выделение памяти. именно он тебе и нужен (ну может с calloc проще будет, хотя это по сути одно и тоже).

я только вот не понял, а причем тут Unix?

Это сообщение отредактировал(а) bsa - 4.12.2007, 16:20
PM   Вверх
Anton Vatchenko
Дата 4.12.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Маллок умеет динамические массивы делать (то есть, где все время меняется количество элементов)? Это что-то новое... То есть он сможет мне помочь работать с массивами то из 10, то из 1000 элементов, где на каждом шаге (раз 20 в секунду) это самое количество элементов меняется...

Это сообщение отредактировал(а) Anton Vatchenko - 4.12.2007, 16:24


--------------------
user posted image
PM MAIL   Вверх
zkv
Дата 4.12.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Anton Vatchenko @  4.12.2007,  16:23 Найти цитируемый пост)
Маллок умеет динамические массивы делать (то есть, где все время меняется количество элементов)? Это что-то новое... То есть он сможет мне помочь работать с массивами то из 10, то из 1000 элементов, где на каждом шаге (раз 20 в секунду) это самое количество элементов меняется...

перечислили доступный инструментарий уже:
Цитата(bsa @  4.12.2007,  15:31 Найти цитируемый пост)
malloc/calloc/realloc/free

PM MAIL   Вверх
bsa
Дата 4.12.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Anton Vatchenko, ты вообще знаешь, как vector работает?
Когда делаешь resize(10): Если capacity()>=10, то память не выделяется, в противном случае выделяется с помощью realloc 2*max(capacity(), 10) * sizeof(value_type), capacity принимает значение количества выделенных элементов. Но пользователю предоставляется только new_size... 
PM   Вверх
Anton Vatchenko
Дата 4.12.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



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


--------------------
user posted image
PM MAIL   Вверх
Lazin
Дата 4.12.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Anton Vatchenko @  4.12.2007,  16:04 Найти цитируемый пост)
Мне нужны динамические массивы

так используй realloc 

Код

//создаем динамический:-) массив
char* arr = (char*)realloc(NULL, 128);
//изменяем размер
arr = (char*)realloc(arr, 1024);


Добавлено через 5 минут и 11 секунд
когда realloc делаешь содержимое массива сохраняется, да-же если указатель изменился...
PM MAIL Skype GTalk   Вверх
bsa
Дата 4.12.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Anton Vatchenko, извиняй. На C++ уже сделали оптимизацию, а на Си, возможно, нет. Хотя, может быть, что те же malloc и realloc немного оптимизированы. Но не так, как vector.
С другой стороны, если тебе нужно часто менять количество элементов, но случайный доступ к ним не нужен, то имеет смысл использовать дву/односвязные списки - там не придется каждый раз выделять кучу памяти под все объекты.
PM   Вверх
zkv
Дата 4.12.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Anton Vatchenko @  4.12.2007,  16:33 Найти цитируемый пост)
Ведь не зря в С++ есть вектора, хэшмапы и прочее... Вот я хотел бы и тут найти... 

два разных языка программирования - с и с++, почему если есть в с++, то должно быть в с? 
нету ничего и не может быть, так как нет средств в с для создания таких вещей как vector.
PM MAIL   Вверх
Anton Vatchenko
Дата 4.12.2007, 16:58 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Насколько я понимаю, реаллок заново выделяет память и переносит старые данные на новое место. Мне нужен принцип быстрой работы как в Векторе - я добавляю один элемент, но в памяти добавляется небольшой кусок, и связывается по ссылкам с соседними, а не копируется тупо весь массив...

То есть цикл:
Array array;
int i;
for(i = 0; i < 1000; i++) {
    if(needInsert(i))
        arrayAdd(&array, i);
}
работал быстро...


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 4.12.2007, 17:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Anton Vatchenko @ 4.12.2007,  16:58)
Мне нужен принцип быстрой работы как в Векторе - я добавляю один элемент, но в памяти добавляется небольшой кусок, и связывается по ссылкам с соседними, а не копируется тупо весь массив...

Ты видимо даже не знаешь, как работает vector и чем он отличается от list. Так вот, вектор в простейшем случае работает, как realloc (а точнее, так, как я описал на той странице), а вот list (двусвязный список) работает так, как ты написал.
Кстати, к элементам list ты не можешь обращаться по индексу. Только через "итераторы" (указатели).

Это сообщение отредактировал(а) bsa - 4.12.2007, 17:02
PM   Вверх
Anton Vatchenko
Дата 4.12.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



>> нету ничего и не может быть, так как нет средств в с для создания таких вещей как vector
Что значит не может быть? В Си никто не смог сделать компонент типа Вектор? Я на си писал такое, но хотел бы получить не корявый вариант... То есть функции типа:

listAdd(List *list, void *data);
listRemove(List *list, int position);
listInsert(List *list, void *data, int position);

И пусть меня никто не смешит, что это невозможно сделать, так как мы это делали еще в школе на информатике. Делали односторонние, двухсторонние списки, очереди, стеки, и т. д.


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 4.12.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Anton Vatchenko @ 4.12.2007,  17:06)
В Си никто не смог сделать компонент типа Вектор? Я на си писал такое, но хотел бы получить не корявый вариант... То есть функции типа:

listAdd(List *list, void *data);
listRemove(List *list, int position);
listInsert(List *list, void *data, int position);

И пусть меня никто не смешит, что это невозможно сделать, так как мы это делали еще в школе на информатике. Делали односторонние, двухсторонние списки, очереди, стеки, и т. д.

vector != list

Нельзя на Си сделать такой компонент. Просто потому, что в Си нет шаблонов! А для каждого из стандартных типов будет недостаточно.
PM   Вверх
Anton Vatchenko
Дата 4.12.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Да я ж не про шаблоны спрашивал, а про обычные динамические массивы, списки...

Это сообщение отредактировал(а) Anton Vatchenko - 4.12.2007, 17:32


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 4.12.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Anton Vatchenko, хорошо. тогда скажи, как ты представляешь стандарный список, который будет работать со struct mystruct?
PM   Вверх
Anton Vatchenko
Дата 4.12.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Этот список должен работать с ней, как с void*, как это часто и делается, если нет шаблонов...


--------------------
user posted image
PM MAIL   Вверх
orthrus
Дата 4.12.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

Репутация: нет
Всего: 16



Может быть тебе подойдет функционал библиотеки glib? Списки, очереди, динамическии массивы (garray что то вроде вектора) и еще куча всякой всячины там есть.


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
Anton Vatchenko
Дата 4.12.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



glib очень массивная библиотека...


--------------------
user posted image
PM MAIL   Вверх
JackYF
Дата 4.12.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Anton Vatchenko @  4.12.2007,  18:14 Найти цитируемый пост)
glib очень массивная библиотека... 

это не аргумент от неё отказываться. а ядро вообще весит до фига... давайте без него, да? smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Random13
Дата 4.12.2007, 23:35 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



На С++ есть тэмплейтовские вектора и т.д. на С нужно писать все самому, думаю на С++ они так и имплементированы посредством маллока и реаллока.
А что за потребность писать на С, а не на С++ - работаешь с проектом уже написанный на С ?
PM MAIL   Вверх
onsql
Дата 4.12.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: нет
Всего: 3



Цитата(Anton Vatchenko @ 4.12.2007,  18:14)
glib очень массивная библиотека...

А вот такое подойдёт- sglib ?
Прямо почти что темплейты на си  smile 
PM MAIL   Вверх
Anton Vatchenko
Дата 5.12.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Отвечу на все вопросы... Работаю на Си, потому как на линуксе на слабом компьютере, люблю Си больше С++... И поэтому подключение любых дополнительных библиотек приведет к "ужасным" последствиям.. Я думал, что есть функции типа printf и прочих, которые уже содержатся в ядре, если не ошибаюсь...

Может тогда кто-то подскажет где найти один си-файл, чтобы подключить к своему проекту, где хорошо реализован динамический массив... Достаточны функции типа add, remove, insert, next, prev, first...


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 5.12.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1227 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.