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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2013, 23:06   #1
Arlleex
Новичок
Джуниор
 
Регистрация: 10.04.2013
Сообщений: 3
По умолчанию Преобразование char и const char в Си

Пишу программу для динамического создания структуры данных для продуктов (по заданию):
В структуре отображается:
1) Номер продукта;
2) Имя;
3) Калорийность.
Код:
// Задание 2
// рассчитать калорийность продуктов (вес продуктов и ингридиенты)

#include "stdafx.h"
#include "conio.h"
int _tmain(int argc, _TCHAR* argv[])
{
	typedef struct prod
	{int numb;
	char name[10];
	int kal;}Prod;
	int count=1;
	prod *a=new prod[count];
	a[0].numb=1;
	a[0].name="luk";
	a[0].kal=1;
	printf("%d) %s kal=%d", a[0].numb, a[0].name, a[0].kal);
	while(1);
	return 0;
}
Проблема в том, что когда компилирую, выдается следующее сообщение:
error C2440: =: невозможно преобразовать "const char [4]" в "char [10]"
Помогите пожалуйста. В чем проблема и как ее разрешить?
Arlleex вне форума Ответить с цитированием
Старый 10.04.2013, 23:26   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) char[4] - это "кусок памяти размером 4 байта". char[10] - "кусок памяти размером 10 байт". Как бедный компилятор должен присвоить одно другому? Хотите копировать - используйте memcpy().

2) Как альтернативу, можно в структуре хранить просто "указатель на начало блока памяти". Однако, если Вы его объявите как char*:
Код:
char* name;
, то присвоение будет истрактовано как "занести в указатель адрес начала строки "luk""... но возникнет одна проблема: строка "luk", по стандарту и по логике, изменениям не подлежит, как нельзя поменять значение нумерала 2 или символьного литерала 'c'. А вот указатель объявлен так, что с его помощью адресуемый им кусок памяти поменять можно. Непорядок - скажет компилятор и будет прав. Можно (и нужно) объявлять так:
Код:
const char* name; //Мамой клянусь, не буду я менять name, честно-честно
Abstraction вне форума Ответить с цитированием
Старый 10.04.2013, 23:37   #3
Arlleex
Новичок
Джуниор
 
Регистрация: 10.04.2013
Сообщений: 3
По умолчанию

Честно говоря, я с улыбкой прочитал Ваше сообщение
На самом деле просто и понятно
Спасибо большое, программа действительно встала на ноги и пошла дальше...

Последний раз редактировалось Arlleex; 10.04.2013 в 23:40.
Arlleex вне форума Ответить с цитированием
Старый 11.04.2013, 22:39   #4
Arlleex
Новичок
Джуниор
 
Регистрация: 10.04.2013
Сообщений: 3
По умолчанию

Код:
			++count;
			prod *temp=new prod[count];
			--count;
			for(i=0; i<count; ++i)
				temp[i+1]=a[i];
			++count;
			delete [] a;
			printf("Dobro pojalovat v sozdanie produta\n");
			printf("vvediote imya produkta");
			scanf_s("%s", &temp[0].name);
			printf("a teper kaloriynost\n");
			scanf_s("%d", &temp[0].kal);
			prod *a=new prod[count];
			for(i=0; i<count; ++i)
				a[i]=temp[i];
			delete [] temp;
Пытаюсь добавить элемент к динамическому массиву, посредством выделения нового куска памяти, на 1 больше чем старый массив, потом копирую в новый массив старый и добавляю значение к новому элементу. Потом собственно говоря, удаляю массив temp. Компилируется без проблем, но когда запускаю при выполнении куска кода между строчками
Код:
 printf("vvediote imya produkta");
			scanf_s("%s", &temp[0].name);
			printf("a teper kaloriynost\n");
вылетает ошибка windows прекратила свою работу...
Знаю где-то ошибка но где пока не очень понимаю. В чем проблема?
Arlleex вне форума Ответить с цитированием
Старый 12.04.2013, 12:02   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Знаю где-то ошибка но где пока не очень понимаю. В чем проблема?
Подозреваю, что в неверном использовании scanf_s(). Обратите внимание на примеры использования: после буфера необходимо передать его длину. А поскольку функции с эллипсисом не в состоянии проверить число аргументов "самостоятельно", то ошибка в передаваемых им аргументах автоматически становится ошибкой времени выполнения, а не компиляции.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как исправить ошибку invalid conversion from const char* to char Ника К Помощь студентам 5 01.06.2012 00:13
С++ Преобразование const Char в const GUID Decoy2k Общие вопросы C/C++ 9 07.02.2012 14:02
невозможно преобразовать 'const char' в 'char triest Помощь студентам 1 10.12.2011 13:41
'unsigned char [512]' в 'const char *' frommars Visual C++ 8 02.07.2011 13:37
преобразование типов char-const char student101 Помощь студентам 8 01.12.2010 20:45