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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2010, 13:49   #1
kefir
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 13
По умолчанию C++ - массив как параметр функции

Здравствуйте.
На третий день изучения C++ столкнулся со следующим моментом:
Как я понял, массивы сами по себе являются указателями, так что при передаче его в качестве параметра какой-то функции, передаётся адрес. Но что делать, если мне нужно передать именно не адрес массива, а его значения? Скажем, мне внутри функции нужно как-то обработать массив (например, в массиве char'ов отсечь ненужные символы), вывести на экран, НО чтобы тот массив, что передавался в качестве параметра, оставался нетронутым. В голову идёт только одна мыль - копирование массива-параметра в локальный массив. Но можно ли обойтись без лишних переменных?

А вообще, вопрос этот встал из-за Delphi (на котором сидел до сего момента). Там, если я не ошибаюсь, массивы, переданные функциям в качестве параметров, не изменяются внутри функций. Утверждения вроде "потому что Delphi - это недоязык для чайников" не в счёт.)
kefir вне форума Ответить с цитированием
Старый 12.04.2010, 14:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Там, если я не ошибаюсь, массивы, переданные функциям в качестве параметров, не изменяются внутри функций.
Ошибаешся. Если передавать с параметром var то изменяются вполне.

А насчет Си - передавай как обычно - указателем и меняй их значения исходя из этого указателя.
Код:
int a[5];

void m(int* c){
	for(int i=0;i<5;i++){c[i]=i;}
}

int _tmain(int argc, _TCHAR* argv[])
{
	m(a);
	for(int i=0;i<5;i++){printf("%d\t",a[i]);}
	getchar();
	return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.04.2010, 14:43   #3
kefir
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 13
По умолчанию

Наверное, не совсем корректно задал свой вопрос.
Нужно, чтобы приведённый в примере массив a[5] НЕ менял своих значений.
kefir вне форума Ответить с цитированием
Старый 12.04.2010, 14:52   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Можно обернуть его в структуру, тогда передача будет происходить по значению, можно использовать стандартный контейнер std::vector, ну и безусловно можно копировать в локальный массив ф-ции
netrino вне форума Ответить с цитированием
Старый 12.04.2010, 15:04   #5
kefir
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 13
По умолчанию

Аха, теперь все вопросы отпали)
Stilet, netrino, благодарю.)
kefir вне форума Ответить с цитированием
Старый 12.04.2010, 15:07   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нужно, чтобы приведённый в примере массив a[5] НЕ менял своих значений.
Если не секрет зачем? Приведи пример задачи где бы нельзя было обойтись стандартными средствами аботы с массивами в функции?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.04.2010, 16:05   #7
kefir
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 13
По умолчанию

Я же в вопросе написал)
Ну, допустим, нам нужна функция printswap(char* c).
Она, соответственно, принимает массив символов, потом выводит входные данные наоборот (меняет первые символы с последними).
Функция никаких значений не возвращает, при вызове
printswap("QWERTY")
на экран будет выведено "YTREWQ", а ИСХОДНЫЙ массив останется нетронутым.
------
Конкретный пример - один и тот же массив символов, введённый пользователем, будет поочерёдно передаваться трём функциям: первая считает количество букв, вторая - количество слов, а третья - количество предложений.

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

Последний раз редактировалось Stilet; 12.04.2010 в 16:59.
kefir вне форума Ответить с цитированием
Старый 12.04.2010, 16:58   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не совсем удачный пример с printswap, потому как не представляю, как можно решить эту задачу без отдельного массива.
Легко и даже изяшно:
Код:
char s[255];

void swap(char* c){
	for(int i=strlen(c)-1;i>=0;i--){printf("%c",c[i]);}
}

int _tmain(int argc, _TCHAR* argv[])
{
	scanf("%s",s);
	swap(s);
	getchar();getchar();
	return 0;
}
А вот тебе на второй вопрос ответ:
Код:
// 1.cpp : Defines the entry point for the console application.
//
/*Конкретный пример - один и тот же массив символов, введённый пользователем, 
будет поочерёдно передаваться трём функциям: первая считает количество букв,
вторая - количество слов, а третья - количество предложений. */
#include "stdafx.h"
#include <string>
char s[255]="Hello world";

void swap(char* c){
	for(int i=strlen(c)-1;i>=0;i--){printf("%c",c[i]);}
}

int bukv(char* c){
	int k=0;
	for(int i=0;i<strlen(c);i++){
		k+=((c[i]>='A')&&(c[i]<='z'))?1:0;
	} 
	return k;
}

int slov(char* c){
	int k=0;
	for(int i=0;i<strlen(c);i++){
		k+=((c[i]<='A')||(c[i]>='z'))?1:0;
	} 
	return ++k;
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	swap(s);
	printf("\n%d\t%d\t",bukv(s),slov(s));
	system("pause");
	return 0;
}
Как видишь никто ничего тут не меняет в параметре.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.04.2010, 17:48   #9
kefir
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 13
По умолчанию

Да, я что-то сглупил..)
Но если что-нибудь надумаю (что вряд ли) - непременно напишу.)
Благодарю за помощь и разъяснения.)
kefir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать параметру записи, что в нем параметр это статический массив с данными? SkAndrew Общие вопросы Delphi 6 26.06.2009 02:02
Математика. Получить параметр функции зная результат Stilet Общие вопросы по программированию, компьютерный форум 2 06.03.2009 08:51
символьные данные сложной структуры и имя массива как параметр функции EkaterinaA Помощь студентам 3 22.02.2009 21:36
Динамически массив как параметр ф-ии SNUPY Помощь студентам 2 11.05.2008 01:16