Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Как выяснить размер числового массива?

Ответить
Настройки темы
C/C++ - Как выяснить размер числового массива?

Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


Изменения
Автор: mrcnn
Дата: 14-12-2008
Тип int

Ограничения:
1. Не используя глобальных переменных.
2. Вернуть из функции размер нельзя, т.к возвращается указатель на массив

Память под массив выделена динамически внутри функции.
Как выяснить размер массива за пределами функции?

И еще один вопрос: как грамотно добавить еще один элемент в конец массива, сохранив все предыдущие. Я копирую, возможно ли это сделать эффективнее?

Код: Выделить весь код
int* sum(int* n1,int sz1,int* n2,int sz2)
{
	int* result;
	int cnt_of_result;
	int sz_of_result = max(sz1,sz2);
	int tmp,vu,i,mn,cmp;

	result = new int[sz_of_result];
	cnt_of_result = 0;
	vu = 0;
	mn=min(sz1,sz2);
	cmp=compare(n1,sz1,n2,sz2);

	for (i=0;i < sz_of_result;i++)
	{
		if (i < mn)		
			tmp = n1[i]+n2[i]+vu;		
		else
		{
			if (cmp==1)			
				tmp = n1[i]+vu;
			else if (cmp==2)		
				tmp = n2[i]+vu;
		}		
		if(tmp>=1000)
			{
				tmp-=1000;
				vu = 1;
			}
			else
				vu = 0;		
		result[cnt_of_result]=tmp;
		cnt_of_result++;
	}	

	if (vu != 0)
	{
		
		int* cp;
		cp = new int[sz_of_result+1];
		for (i=0;i<sz_of_result;i++)
			cp[i]=result[i];			
		cp[cnt_of_result]=vu;		
		print(cp,sz_of_result+1);
		return(cp);
	}

	print(result,sz_of_result);
	return (result);
}

Отправлено: 13:10, 14-12-2008

 

Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


точно так же как и внутри функции:
Код: Выделить весь код
int sz_of_result = max(sz1,sz2);
:-)
Это называется "ошибка проектирования" - похоже, нужно переписывать не отдельную функцию, а всю программу.

Отправлено: 15:14, 14-12-2008 | #2



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

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


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


max(sz1,sz2) это не функция, а макрос, кстати.

Вспомнил, как находить размер.
arr_sz=sizeof(x)/sizeof(x[0]);
Хотя похоже с динамическими массивами это не работает.
Вопрос по прежнему остался.
Как определить размер динамического массива и не вылететь за его пределы?

Размер массива будет известен только после обработки данных функцией, до этого узнать его нельзя. Изначально даже самой функции вообще неизвестно, сколько элементов будет в массиве, и в целях экономии ресурсов, чтобы не копировать постоянно один массив в другой с увеличением размера, я устанавливаю минимально возможный (имею право, так как по условию задачи числа положительные). Если были бы отрицательные, то только копирование одного массива в другой. Так же как внутри функции устанавливается размер, вне этой функции использовать нельзя. Запускать два раза обработку, чтобы узнать размер и получить указатель нельзя. Нет никаких ошибок в проектировании.

-------
Ehhh.. what's up, doc?..


Последний раз редактировалось mrcnn, 14-12-2008 в 16:04.


Отправлено: 15:37, 14-12-2008 | #3


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


mrcnn, если ошибок в проектировании нет, то и вопросов возникать возникать не должно о представлении данных внутри программы

А вы даже не знаете, где в вашей программе размер массива

Отправлено: 17:40, 14-12-2008 | #4


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


Busla, Умный, да?

- Взвод идет грузить люминий!
- Не люминий, а алюминий, товарищ прапорщик! .
- Взвод идет грузить люминий! А самый умный идет грузить чугуний!


Пофиг. Буду передавать через глобальную переменную. Мне не жалко.
Класс я организовывать не буду и не хочу.

-------
Ehhh.. what's up, doc?..


Отправлено: 18:59, 14-12-2008 | #5


Аватара для Alan85

Старожил


Сообщения: 463
Благодарности: 91

Профиль | Отправить PM | Цитировать


Предлагаю использовать нулевую ячейку массива для хранения длины . Как string в старом паскале
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:28, 14-12-2008 | #6


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата mrcnn:
Класс я организовывать не буду и не хочу. »
не обязательно переходить на объектную парадигму: можно возвращать не массив, а структуру с массивом, его размером, и коэффициентом заполнения. А вообще, в C++ разумнее не изобретать велосипед с динамическими массивами, а использовать готовые контейнеры стандартной библиотеки, в частности векторы.

Отправлено: 20:30, 14-12-2008 | #7


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


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

Я мог бы вообще не писать эту программу, а найти и скачать готовый класс, но я не хочу. И Я БУДУ всегда изобретать новый велосипед и разбираться с деталями, лежащим в основе велосипеда. Без всяких vector, list и т.д STL. Нужно изобретать велосипеды, чтобы не сидеть в говне. Чтобы не покупать велосипеды в магазине за 20 тысяч рублей. Чтобы экономить. Чтобы он был более функциональным, удобным и красивым. И понятным для меня лично. Нужно изобретать велосипеды.

-------
Ehhh.. what's up, doc?..


Отправлено: 09:13, 15-12-2008 | #8

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата mrcnn:
Я недостаточно знаю структуры и классы, поэтому будут постоянно ошибки. У меня больше времени уйдет на разбор языка и на борьбу с ошибками, чем на написание программы и на разработку алгоритма. А программу сдать надо завтра и времени переписывать готовое нет.. »
А зря! месяц помучаешься, потом за уши не оттянешь!
Ну если очень не хочется, есть ещё способ:
Код: Выделить весь код
int* calculate(int* arg1, int size1, int* rag2, int size2, int* return_size=0)
{
  ...
   if (return_size) *return_size = size3;
   return ...
}

Отправлено: 10:14, 15-12-2008 | #9


Аватара для Devils0411

Ветеран


Сообщения: 902
Благодарности: 51

Профиль | Отправить PM | Цитировать


Извините за оффтоп. Время поджимает. Есть задача.
Задается размер массива в ручную (например 7), нужно найти к-ый минимум (например нужно найти 3 минимум) и вывестина экран изначальный массив и этот минимум. Как мне обьяснил препод (и если я его правильно понял), то выглядить это должно примерно так:
Программа запрашивает у пользователя в вести размер массива (ввод размера массива в ручную например 7)
Далее программа запрашивает, указать какой минимум он хочет найти: (например 3)
После этого программа просит ввести массив в ручную (6 2 7 1 8 5 9)
И в конце программа должна вывести на экран сам массив и к-ый минимум.
Как мне обьяснил препод, программа должна найти первый минимум по отношению ко всему массиву в данном случае это 1, затем второй минимум - 2, потом 3 минимум - 5.
Как я понял, то это должно выглядить так: программа находит первый минимум - 1, потом найти следующий минимум и сравнивать его с массивом, но не учитывать первый минимум.

P.S. В С++ я не селен, понимаю, но реализовать не могу. Помогите пожайлуста. В понедельник сдавать!
Код: Выделить весь код
#include <iostream.h>  
#include <stdlib.h>  
#include <time.h>  
#include <conio.h>  
main()  
{  
int n, i, k, m;  
cout<<"Vvedite kolichestvo chisel v massive"<<endl;  
cin>>n;  
int A[10];  
cout<<"Vvedite, kakoj po schetu minimum nado najti"<<endl;
 cin>>m;  
int min, c; 
for (i=0; i<n; i++)  	
{  	
            cout << "Vvod massiva: ";
	cin >> A[i];  	
            if (A[i]<min) min=A[i];  	
            }  
cout<<endl;  
c=1;  
min = A[0];  
for (i=0; i<n; i++)
  	{
  	if (A[i]>min) { min = A[i]; c++;};
    	if (c==m)
  		{
  		cout<<"Iskomoe znachenie "<< min;
  		break;
  		};
  	};
 if (c<m) cout<<"Trebuemoe znachenie otsutstvuet";
 getch();
 }
Вот код программы, которую мне помогли написать. То что она не правильная - известно. Может наведет на мысль.

Отправлено: 09:51, 19-12-2008 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Как выяснить размер числового массива?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Как присвоить элементы массива в "перетасованном" виде другому массиву? evg64 AutoIt 3 27-09-2009 14:09
Как передать в javascript данные массива, полученного из кода на php vagner_HATE Вебмастеру 1 18-06-2009 13:51
Как просмотреть винт, вытащенный из Raid массива? evash Непонятные проблемы с Железом 11 06-02-2009 09:50
Мой комп шпионят (скрины, keylog). Как выяснить? GEugene Защита компьютерных систем 8 02-12-2007 06:08
Сетевые диски как часть единого массива данных Urutseg Сетевые технологии 9 22-03-2006 17:08




 
Переход