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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2015, 21:26   #11
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

так ведь это С, а вы все предлагаете контент С++....Нет уж, спасибо конечно.
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Старый 10.02.2015, 21:39   #12
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от nwhta Посмотреть сообщение
так ведь это С, а вы все предлагаете контент С++....Нет уж, спасибо конечно.
Вы себе представляете принципы организации памяти в ЭВМ??? Причем тут С или С++.
Все переменные созданные внутри функций перестают существовать за пределами функций. Это и в С и в С++ базовые понятия.

Вот рабочий и оптимизированный вариант.

Код:
#include <stdio.h>
#include <string.h>

int checkLen(char *pptr)
{
	char *p = pptr;
	int cnt = 0;
	while (*p++ != '\0')cnt++;
	printf("cnt is: %d", cnt);
	return cnt;
}
char * init_f()
{
	char* ptr = new char[30];
	printf("Enter your string\n");
	gets(ptr);
	return ptr;
}

void main()
{
	char *ptr;
	int n;
	ptr = init_f();
	n = checkLen(ptr);
}
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 10.02.2015 в 21:44.
WorldMaster вне форума Ответить с цитированием
Старый 10.02.2015, 21:53   #13
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Вы себе представляете принципы организации памяти в ЭВМ??? Причем тут С или С++.
Все переменные созданные внутри функций перестают существовать за пределами функций. Это и в С и в С++ базовые понятия.

Вот рабочий и оптимизированный вариант.

Код:
#include <stdio.h>
#include <string.h>

int checkLen(char *pptr)
{
	char *p = pptr;
	int cnt = 0;
	while (*p++ != '\0')cnt++;
	printf("cnt is: %d", cnt);
	return cnt;
}
char * init_f()
{
	char* ptr = new char[30];
	printf("Enter your string\n");
	gets(ptr);
	return ptr;
}

void main()
{
	char *ptr;
	int n;
	ptr = init_f();
	n = checkLen(ptr);
}
это конечно я слышал и знаю, просто насколько я знаю можно передать сам указатель на начало того массива и тогда функция будет видеть массив разве не так?
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Старый 10.02.2015, 21:55   #14
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

да как вам объяснить что массива не существует после выхода из функции. Память освобождается. Указатель правильно будет указывать на начало массива. Только данные там могут быть любые какие угодно.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 10.02.2015, 21:57   #15
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
да как вам объяснить что массива не существует после выхода из функции. Память освобождается. Указатель правильно будет указывать на начало массива. Только данные там могут быть любые какие угодно.
хорошо, тогда можете мне показать передачу массива в функцию?
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Старый 10.02.2015, 22:03   #16
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от nwhta Посмотреть сообщение
хорошо, тогда можете мне показать передачу массива в функцию?
Ну если так принципиально то так:

Код:
void init_f(char * ptr)
{
	printf("Enter your string\n");
	gets(ptr);
}

void main()
{
	char str[30];
	char *ptr;
	int n;
	ptr = init_f();

	init_f(str);
	n = checkLen(ptr);
}
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 10.02.2015, 22:36   #17
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Ну если так принципиально то так:

Код:
void init_f(char * ptr)
{
	printf("Enter your string\n");
	gets(ptr);
}

void main()
{
	char str[30];
	char *ptr;
	int n;
	ptr = init_f();

	init_f(str);
	n = checkLen(ptr);
}
тогда что же в функции checkLen я передал не так?
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Старый 10.02.2015, 22:49   #18
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Проблема вот в этой функции:

Код:
char * init_f()
{
	char str[30]; // этот массив существует ТОЛЬКО внутри функции
	printf("Enter your string\n");
	gets(str);
	return str; // после этой команды данные освобождаются
}
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 10.02.2015, 23:00   #19
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Проблема вот в этой функции:

Код:
char * init_f()
{
	char str[30]; // этот массив существует ТОЛЬКО внутри функции
	printf("Enter your string\n");
	gets(str);
	return str; // после этой команды данные освобождаются
}
то есть вы хотите сказать что return во всем виноват и что для работы с массивом и его передачей подойдёт скорее метод нежели функция?
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Старый 10.02.2015, 23:07   #20
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от nwhta Посмотреть сообщение
то есть вы хотите сказать что return во всем виноват и что для работы с массивом и его передачей подойдёт скорее метод нежели функция?
Смотря что вам нужно по условию задачи.
Я вам показал два варианта вашей функции. return тут не виноват. Суть именно в принципах выделения памяти. Для разных участков она выделяется из разных сегментов памяти.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача по массивам мар5094 Паскаль, Turbo Pascal, PascalABC.NET 2 18.12.2010 16:04
Задача по массивам) Flo Помощь студентам 1 30.11.2010 22:09
по массивам lilia2121 Помощь студентам 3 15.04.2010 13:05
Требуется помощь по двумерным массивам в C++ builder 2006. Vergil Помощь студентам 21 12.11.2009 18:29