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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2009, 15:53   #1
CooL_bobrui
 
Регистрация: 02.11.2009
Сообщений: 7
По умолчанию Структуры+функции, Проблема с преобразованием.

Код:
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>

struct player //Тип данных "MP3 плееры"
{
	char pname[20]; 
	int volume; 
	int  radio;		
	int time;
	int lon;
};

int functmenu (void)
{
		int menu=0;

	printf("\n1)Определить количество MP3плееров\n");
	printf("2)Ввести названия плееров\n");
	printf("3)Ввести объемы памяти плееров\n");
	printf("4)Ввести время разрядки плееров\n");
	printf("5)Определить продолжительности звучания плееров (из расчета 60мб\\в час)\n");
	printf("6)Вывести данные о плеерах\n");
	printf("7)Выход\n");
	scanf("%d",&menu);
	getchar();
	system("cls");

	
	return menu;

}
int funct1 (void)
{
	int num = 0;

	printf("\nВведите количество MP3плееров (>0)\n");
	scanf("%d",&num);	
	getchar();
	system("cls");
	
	return num;		

}
char funct2(int num,int i)
{
	printf("Введите название каждого плеера , по отдельности (%d осталось)\n",num-i);
	char name[20],leng=0;

	scanf("%s",&name);
	leng=strlen(name)+1;
	
	name[leng]=(char)'\0';
	getchar();
	system("cls");
	return name;		

}

int funct6 (player players,int i)
{
	player *st = &players;

	printf("\tНомер \t Наименование\n");
	printf("%d\t %s\n",i,st->pname);
	
	
	
	getchar();
	return 0;
}


	

	

int _tmain(int argc, _TCHAR* argv[])
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	int menu=0,num=0,i=0;
	player *players=NULL;
	
	while (menu!=7)
	{
		menu=functmenu();
		if (menu==1)
		{
			num=funct1();
			players=new player [num];
			
		}
		if (menu==2)
		{
			player *st=NULL;
						
			for (i=0;i<num;i++)
			{
				st=&players[i];
				strcpy(st->pname,funct2(num,i));
			}

			
			

		}
		if (menu==6)
		{
						
			for (i=0;i<num;i++)
			{
				funct6(players[i], i);
			}

			getchar();
			system("cls");
			

		}	

	}
	
	
		
	
	return 0;
}
в мейне ошибка:
strcpy(st->pname,funct2(num,i));

в funct2 ошибка:
return name; - ошибка

Видимо надо как-то преобразовать , но что-то не выходит (.

Просьба не кричать , что я ох***ший студент , которому надо сделать лабу. Надо только помочь с преобразованием ( .
CooL_bobrui вне форума Ответить с цитированием
Старый 25.11.2009, 16:13   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Первое, и не принципиальное в данном случае: funct2 должен возвращать char, а возвращает char*.
Второе: она возвращает указатель на локальную переменную, которая (переменная) после выхода из функции будет уничтожена. Соответственно теперь полученный указатель ссылается вообще непонятно куда.
Почему бы просто не создать функцию-член в player?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 25.11.2009, 16:16   #3
CooL_bobrui
 
Регистрация: 02.11.2009
Сообщений: 7
По умолчанию

Поподробнее ?
Про второе: мне нужно функцией вернуть вводимую строку в поле структуры, а после пусть уничтожается. Разве не так ?

Кстати есть условие : без глобальных переменных.

Последний раз редактировалось CooL_bobrui; 25.11.2009 в 16:20.
CooL_bobrui вне форума Ответить с цитированием
Старый 25.11.2009, 16:19   #4
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

что бы исчезла ошибка попробуй:
Код:
char* funct2(int num,int i)
m0nax вне форума Ответить с цитированием
Старый 25.11.2009, 16:23   #5
CooL_bobrui
 
Регистрация: 02.11.2009
Сообщений: 7
По умолчанию

Спасибо , m0nax. Вышло -_-
CooL_bobrui вне форума Ответить с цитированием
Старый 25.11.2009, 16:39   #6
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
По умолчанию

m0nax, выходит его ошибка была в том что функция возвращает char (просто один символ) а нужно char* (это динамическая строка, или указатель на строку, или как это правильно обозвать?)
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.
forsaken66 вне форума Ответить с цитированием
Старый 25.11.2009, 17:17   #7
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

forsaken66 видимо да
правда я не говорил что будет работать правильно т.к не разбирался что там куда идет потом
m0nax вне форума Ответить с цитированием
Старый 25.11.2009, 17:58   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
мне нужно функцией вернуть вводимую строку в поле структуры, а после пусть уничтожается.
К сожалению, с компилятором за рюмочкой чая об этом договориться не удастся - он в любом случае должен освобождать память, выделенную под локальную переменную после завершения работы функции. А поскольку адрес этой переменной используется уже вне функции, то предсказать, что по этому адресу находится может только дипломированный IT-медиум...
Лучше, как я уже говорил, создайте функцию-член в структуре:
Код:
struct player //Тип данных "MP3 плееры"
{
	void ReadName(int num,int i);
	char pname[20]; 
	int volume; 
	int  radio;		
	int time;
	int lon;
};
void player::ReadName(int num,int i)
   {
	printf("Введите название каждого плеера , по отдельности (%d осталось)\n",num-i);
	unsigned leng=0;

	scanf("%s",pname);   //Вроде бы это и есть указатель на первый символ
	leng=strlen(name)+1;
	
	name[leng]=(char)'\0';
	getchar();
	system("cls");   //Что это такое - не знаю, вам виднее
   }
А вообще - хорошо бы использовать стандартные строки...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с преобразованием строки в число в С++ Lorden Помощь студентам 21 03.04.2009 14:05
символьные данные сложной структуры и имя массива как параметр функции EkaterinaA Помощь студентам 3 22.02.2009 21:36