Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2014, 01:24   #11
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

realloc не будет "раскидывать" по памяти.
Если впереди старого массива будет достаточно свободной памяти - блок просто расширится. Если нет - он просто перенесется в другое место, где есть достаточный кусок незанятой памяти, а старый блок освободится.
Son Of Pain вне форума Ответить с цитированием
Старый 20.04.2014, 16:37   #12
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию

до слова exit вводятся элементы массива

Код:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Nameval 
{
	char*name;
}c;
struct Nvtab
{
	int nval; //текущие количество элементов
	int max;// под сколько элементов выделена память
	Nameval*nameval; 
}nvtab;
enum{NVINIT=1,NVGROW=2};

int addname(Nameval newname)
{
	Nameval*nvp;
	if(nvtab.nameval==NULL)
	{
		nvtab.nameval=(Nameval*)malloc(NVINIT*sizeof(Nameval));
		if(nvtab.nameval==NULL)
			return -1;
		nvtab.max=NVINIT;
		nvtab.nval=0;
	}
	else if(nvtab.nval>=nvtab.max)
	{
		nvp=(Nameval*)realloc(nvtab.nameval,(NVGROW*nvtab.max)*sizeof(Nameval));
		if(nvp==NULL)
			return -1;
		nvtab.max*=NVGROW;
		nvtab.nameval=nvp;
	}
	nvtab.nameval[nvtab.nval]=newname;
	return nvtab.nval++;
}

void main()
{
	int f=0;
	while(strcmp((char*)&c.name,"exit")!=0)
	{
		scanf("%s",&c.name);
		if(strcmp((char*)&c.name,"exit")!=0)
		f=addname(c);
	}
	int n=0;
	for(;n<=f;n++)
	printf("%s\n",&nvtab.nameval[n]);

}
вообще это все неудобная байда.Чтобы вставить элемент в середину,нужно выделить весь блок данных после середины и сдвинуть его на один элемент вправо
Списки надо.При вставке элемента,его надо выделить и поменять пару значений указателей .Никаких супер-пупер выделений огромных кусков не происходит

Последний раз редактировалось alekopoko; 20.04.2014 в 17:57.
alekopoko вне форума Ответить с цитированием
Старый 21.04.2014, 08:26   #13
Pavlov_yu
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 65
По умолчанию

писал контрольную. для создания двухмерного массива и заполнения его данными создавал массив по заранее введеными его размерами. помоему динамический массив называется.
// создаем размер нового массива
int **array = new int* [M.y];
for(y1=0;y1<M.y;y1++)
array[y1]=new int [M.x];
array[M.y][M.x];

[M.y][M.x] размеры матрицы из конструктора
Pavlov_yu вне форума Ответить с цитированием
Старый 21.04.2014, 09:23   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,342
По умолчанию

Цитата:
Сообщение от Pavlov_yu Посмотреть сообщение
писал контрольную.
Если бы контрольная была по этой теме у вас была бы двойка. Во первых, сказано же - язык С а new это из другой оперы. Во вторых, сказано, что объем заранее неизвестен - где у вас изменение размера массива?
waleri вне форума Ответить с цитированием
Старый 21.04.2014, 10:23   #15
NomenEstOmen
Пользователь
 
Регистрация: 11.04.2014
Сообщений: 21
По умолчанию

Всегда интересовал вопрос, зачем нужны двумерные массивы (особенно, динамические)? Одномерный же быстрее обрабатывается. А писать m[i*n+j] вместо m[i][j] - не такая уж проблема...
NomenEstOmen вне форума Ответить с цитированием
Старый 21.04.2014, 10:25   #16
NomenEstOmen
Пользователь
 
Регистрация: 11.04.2014
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
realloc не будет "раскидывать" по памяти.
Если впереди старого массива будет достаточно свободной памяти - блок просто расширится. Если нет - он просто перенесется в другое место, где есть достаточный кусок незанятой памяти, а старый блок освободится.
Кстати, да. Но на перенос тоже будет время затрачено. И не факт что найдётся нужного размера блок памяти. А через указатели, можно хоть всю оперативку забить...
NomenEstOmen вне форума Ответить с цитированием
Старый 21.04.2014, 14:46   #17
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию

Цитата:
Всегда интересовал вопрос, зачем нужны двумерные массивы
ну допустим тебе надо представить данные в виде таблицы
вот тут и пригодится двумерный массив - char a[строки][столбцы]
ну еще пример : задачки с матрицами тоже решают с помощью двумерного массива
Цитата:
(особенно, динамические)?
мой пример выше.Я использовал динамическую память. malloc realloc
и благодаря этому массивы стали расширяемыеми данными .
А так то они статические у которых определенный фиксированный неизменяемый размер.
ну опять же повторюсь, если надо часто добавлять или удалять данные,то расширяемый массив не подходит.Деревья, списки лучше.
alekopoko вне форума Ответить с цитированием
Старый 21.04.2014, 20:59   #18
NomenEstOmen
Пользователь
 
Регистрация: 11.04.2014
Сообщений: 21
По умолчанию

Так твою задачу можно решить в одномерном массиве. А твой двумерный при выделении памяти в цикле будет раскидан по всей оперативке. И если у тебя массив 100 на 100, то ты, конечно, ничего не заметишь. Другое дело, когда 1000 на 1000 000, например.
NomenEstOmen вне форума Ответить с цитированием
Старый 22.04.2014, 19:06   #19
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию

Цитата:
Так твою задачу можно решить в одномерном массиве.
Я имел в виду это -

пример реализации двумерного массива
карточная игра
как представить карты?
есть два определения карты - масть и номинал(цифра)
эти данные идеально представляются в виде таблицы - где заголовки строк номиналы ,а столбцы - масти или наоборот
alekopoko вне форума Ответить с цитированием
Старый 25.04.2014, 12:33   #20
NomenEstOmen
Пользователь
 
Регистрация: 11.04.2014
Сообщений: 21
По умолчанию

Цитата:
Сообщение от alekopoko Посмотреть сообщение
Я имел в виду это -

пример реализации двумерного массива
карточная игра
как представить карты?
есть два определения карты - масть и номинал(цифра)
эти данные идеально представляются в виде таблицы - где заголовки строк номиналы ,а столбцы - масти или наоборот
ЭЭЭ
Код:
typedef struct
{
int FaceValue;
char Suit;
} Card;
Ну и дальше
Код:
Card *Cards;
Cards=(Card *)malloc(n*sizeof(Card));
И т.д.

Не?
NomenEstOmen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести число N. Вывести N строк с номером строки, двоеточием и набором чисел от 1 до N+1-k (где k-номер строки) ( в С ) Eduard12345 Помощь студентам 1 11.10.2013 07:25
заранее не известно количество аргументов SAMOUCHKA Общие вопросы C/C++ 7 18.05.2013 23:35
Найти сумму элементов матрицы и подсчитать число ее строк, в пределах каждой из которых элементы упорядочены по возрастанию:Ai1<Ai Renc Visual C++ 0 12.04.2013 13:59
Дан массив размерности, определить номера строк элементы которых образуют последовательность С++ Lera Помощь студентам 2 18.12.2009 17:17
Ввести натуральное число N . Вывести треугольник, содержащий N строк вида Arei15 Помощь студентам 2 31.10.2009 23:41