Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / What is the construction ‘(char *)’ called and what does it do? / 12 сообщений из 12, страница 1 из 1
10.03.2003, 15:24
    #32116959
Александр Гладченко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
Помогите ответить на тестовый вопрос (я на С с 89 года ничего не писал и книжек нет под рукой):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
LINE	Contains	                          Question
 50 	char * p;	
 200 	p=test();	
 201 - 300 	 /* we want to use ‘p’ here*/ 	
 2000 	char * test()                      What might go between the parentheses 
                                                    in this particular situation?  
 2001 	{	
 2002 	   char buf[ 8 ];	
 2003 - 2050   /* unspecified, buf defined here */ 	
 2051 	  return (char *) buf;             What is the construction ‘(char *)’ called
                                                    and what does it do?  What do the 
                                                    constructions of that name do in general?
 2052 	}


1. Is this a reasonable function?

Мне кажется, что вполне резонно использовать такие функции, почему бы нет...

2. Will it work at all?

Кажись работать не будет, т.к.при выходе из функции buf[8] очистится...

3. Is it good practice, and why?

Если я правильно понял, то использование указателей является хорошей практикой...

4. How, exactly, could one get a second ‘char *’ to use back from this function? Be specific in terms of the exact syntax needed. Another way to state this question is how can this function be modified to return a ‘char *’ from the function, and an additional ‘char *’ value in one function call. Please make sure that your answer will work even if the size of the char * desired is not known in the outside calling function. Avoid C++ syntax. Include statements in called and calling functions. Use good programming practice. Although alternatives are acceptable, for this question, please include an answer which maintains the original return type.

Интересно, если вот так: (char *) test() - это будет работать....
...
Рейтинг: 0 / 0
10.03.2003, 16:23
    #32116975
Ingvarwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
Я бы ответил вот так:

— Строка 2000
Код: plaintext
char * test()
между скобками может быть void.
— СТрока 2051
Код: plaintext
return (char *) buf;
используется приведение к типу (type cast) в данном случае тип char [] приводится к типу char *.

И ответы на вопросы:
1. Подобные функции вполне можно использовать. Только если используется функция для выделения памяти (как test()), то должна также использоваться функция для очистки памяти.

2. Точно, работать не будет, так как память, выделенная под buf очистится при выходе из функции.

3. Если речь идет об использовании указателей вообще, то конечно это хорошая практика. Но в данном конкретном случае использование подобной функции — плохая практика.

4. На мой взгляд речь идет о том как получить два указателя на char одним вызовом функции. Поскольку вернуть два значения из функции нельзя, то можно добавить параметр:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
char *test(char *ptr)
{
  char *ptrRet;      /* Это то, что должно возвращаться */ 

   /* Здесь выделить память под оба указателя при помощи malloc */ 
   /* Как это сделать я уже и сам не помню...  */ 

  return ptrRet;
}


Вроде бы так...
...
Рейтинг: 0 / 0
11.03.2003, 09:53
    #32117133
What is the construction ‘(char *)’ called and what does it do?
>4. На мой взгляд речь идет о том как получить два указателя на char одним вызовом функции. Поскольку вернуть два значения из функции нельзя, то можно добавить параметр:
char *test(char *ptr)
{
char *ptrRet; /* Это то, что должно возвращаться */

/* Здесь выделить память под оба указателя при помощи malloc */
/* Как это сделать я уже и сам не помню... */

return ptrRet;
}
Вроде бы так...



Что-то я не вижу каким образом у вас возвращается из функции второй char*.
Вы передаете в функцию char*, но не возвращаете. Вернуть из функции вы можете измененный массив на который указывает ptr.
Помоему надо так.

char *test(char **ptr)
{
char *ptrRet; /* Это то, что должно возвращаться */

/* Здесь выделить память под оба указателя при помощи malloc */
/* Как это сделать я уже и сам не помню... */
*ptr=(char*)malloc(1000);
ptrRet=(char*)malloc(1000);

return ptrRet;
}

Ну и вызов
void main()
{
char *p1,*p2;
p1=test(&p2);
}
...
Рейтинг: 0 / 0
11.03.2003, 11:27
    #32117204
YuriAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
Добавлю еще , что функция используеться перед объявлением.
Поэтому надо бы еще прототип добавить !
...
Рейтинг: 0 / 0
11.03.2003, 11:34
    #32117209
YuriAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
Еще , в С++ взамен malloc используеться new , который выделяет память по типу.

взамен

char *ptrRet; /* Это то, что должно возвращаться */
/* Здесь выделить память под оба указателя при помощи malloc */
/* Как это сделать я уже и сам не помню... */
*ptr=(char*)malloc(1000);
ptrRet=(char*)malloc(1000);

можно писать


char *ptrRet = new char[1000];
...
Рейтинг: 0 / 0
11.03.2003, 11:37
    #32117211
YuriAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
Еще - Нельзя забыть об освобождении зарезервированной памяти
командами
malloc - free
new - delete
соответсвенно.
...
Рейтинг: 0 / 0
11.03.2003, 12:10
    #32117237
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
Это почему вдруг функция не может возвращать несколько значений, а так:

typedef struct
{
int val1;
int val2;
} my_struct;


my_struct f(void)
{
return( my_struct(1,2) );
}
...
Рейтинг: 0 / 0
11.03.2003, 12:35
    #32117253
Ingvarwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
Функция не может вернуть больше одного значения — в том смысле, что нельзя написать
Код: plaintext
 return  5 ,  10 ,  15 ; 
чтобы вернуть из функции три целых числа — как тогда написать присвоение результата этой функции трем переменным?
А в коде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 typedef struct 
{ 
    int val1; 
    int val2; 
} my_struct; 


my_struct f(void) 
{ 
    return( my_struct( 1 , 2 ) ); 
}
будет возвращено одно значение — объект-структура. Хотя конечно этот объект будет содержать два значения int.
...
Рейтинг: 0 / 0
11.03.2003, 13:39
    #32117344
YuriAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
Было бы правильнее , зарезервировать память до вызова функции и заполнить заданную область.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void f(char*);

char buf[ 8 ];
f(buf);
// 
void f(char*a_pBuf)
{
  strcpy(a_pBuf, "Test" );
}


2funikovyuri
функция всегда возвращает одно и только одно значение !
...
Рейтинг: 0 / 0
11.03.2003, 16:15
    #32117554
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
2Ingvarwolf: какие мы умные - рассказали мне про функции :-)

P.S. я имел ввиду что данная задаяа решается и все
...
Рейтинг: 0 / 0
11.03.2003, 16:51
    #32117608
YuriAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
2funikovyuri

То что пишеться, не обязательно для тебя.
Повторное чтение укрепляет знания.
:-) не держи зло на меня :-)
...
Рейтинг: 0 / 0
12.03.2003, 09:21
    #32117945
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
What is the construction ‘(char *)’ called and what does it do?
2YuriAM: заметано :-)

P.S> нервы
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / What is the construction ‘(char *)’ called and what does it do? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]