Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > Visual C++ / С/C++

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 21.12.2009, 21:53   #1
Пользователь
 
Пол:Мужской
Регистрация: 20.10.2006
Сообщений: 42
Репутация: 2
По умолчанию Ошибка при компиляции

Всем доброго времени суток! В программировании почти не понимаю, подскажите плиз суть ишибки(С++, codeblocks v8)

||In function `int main()':|
|39|error: invalid conversion from `char' to `char*'|
|39|error: initializing argument 1 of `int prov(char*)'|
|46|error: invalid conversion from `char' to `const char*'|
|46|error: initializing argument 1 of `int atoi(const char*)'|
|46|error: incompatible types in assignment of `int' to `char[20]'|
||=== Build finished: 5 errors, 0 warnings ===|

Код:
#include <iostream>
#include <windows.h>
using namespace std;
struct res
{
    int voz;
    char pol[10];
    char obr[10];
    char otv[3];
};
struct Zap
{
    res a;
    Zap *next;
};
char* Rus(const char* text);
void DelAll(Zap **U);
void Add(Zap **U);
void print(Zap *U);
void stat(Zap **U);
int prov(char name[]);
void s1(Zap *U);
void s2(Zap *U);
void s3(Zap *U);
int main()
{
    Zap *beg=0;//указатель на начало списка
    char v[20];
    char v1=1;
	while (v1)//цикл для меню
	{
        cout << Rus("Возможные действия:\n");
	    cout << Rus("1-Добавление анкеты\n");
	    cout << Rus("2-Печать всех анкет\n");
	    cout << Rus("3-Вывод статистических данных\n");
	    cout << Rus("0-Выход\n");
	    cout << Rus("Выберите действие: ");
	    cin >> v1;
        if(prov(v1)!=0)
            {
                cout << Rus("Действие не корреткно.\n");
                cout << "---------------------------" << endl;
                continue;
            }
        else
           v=atoi(v1);
	    cout << "-------------------------------" << endl;
	    cin.ignore(1, 'n');

	    switch (v1)//меню
	    {
	        case 1:Add(&beg);break;
	        case 2:print(beg);break;
	        case 3:stat(&beg);break;
	        case 0:continue;break;
	        default: continue;
	    }
    }
    DelAll(&beg);
	return 0;
}
void Add(Zap **U)
{
    Zap *p=new Zap;
    int ob=0;
    int ot=0;
    int po=0;
    do
        {
            cout << Rus("Введите возраст респондента ");
            cin >> p->a.voz;

        }

        while((p->a.voz<0)||(p->a.voz>99));
    do
        {
            cout << Rus("Введите пол респондента(1-м,2-ж) ");
            cin >> po;
        }
        while((po!=1)&&(po!=2));
    if(po==1)
        strcpy(p->a.pol,Rus("мужской"));
    if(po==2)
        strcpy(p->a.pol,Rus("женский"));
    do
        {
           cout << Rus("Введите образование респондента(1-начальное,2-среднее или 3-высшее) ");
           cin >> ob;
        }
        while((ob!=1)&&(ob!=2)&&(ob!=3));
    if(ob==1)
        strcpy(p->a.obr,Rus("начальное"));
    if(ob==2)
        strcpy(p->a.obr,Rus("среднее"));
    if(ob==3)
        strcpy(p->a.obr,Rus("высшее"));
    do
        {
            cout << Rus("Введите ответ респондента на вопрос анкеты(1-д,2-н) ");
            cin >> ot;
        }
        while((ot!=1)&&(ot!=2));
    if(ot==1)
        strcpy(p->a.otv,Rus("да"));
    if(ot==2)
        strcpy(p->a.otv,Rus("нет"));
    if (*U==0)
    {
        *U=p;
        p->next=0;
    }
    else
    {
        p->next=*U;
        *U=p;
    }
    cout << Rus("Анкета внесена в список.\n");
    cout << "------------------------" << endl;

}
void print(Zap *U)
{
    if(U==0)
        cout << Rus("Нет анкет в базе.");
    else
        {
            Zap *p=U;
            while (p)
            {
                cout << Rus("Возраст ") << p->a.voz << endl;
                cout << Rus("Пол ") << p->a.pol << endl;
                cout << Rus("Образование ") << p->a.obr << endl;
                cout << Rus("Ответ на вопрос анкеты ") << p->a.otv << endl;
                cout << endl;
                p=p->next;
            }
        }
    cout << "-------------------------------" << endl;

}

void stat(Zap **U)
{
    int v=1;
    while (v)//цикл для меню
	{
        cout << Rus("Возможные данные:\n");
	    cout << Rus("1-Сколько мужчин старше 40 лет, имеющих высшее образование, ответили Да на вопрос анкеты\n");
	    cout << Rus("2-Сколько женщин моложе 30 лет, имеющих среднее образование, ответили Да на вопрос анкеты\n");
	    cout << Rus("3-Сколько мужчин моложе 25 лет, имеющих начальное образование, ответили Да на вопрос анкеты\n");
	    cout << Rus("0-Выход\n");
	    cout << Rus("Выберите действие: ");
	    cin >> v;
	    cout << "-------------------------------" << endl;
	    switch (v)//меню
	    {
	        case 1:s1(*U);break;
	        case 2:s2(*U);break;
	        case 3:s3(*U);break;
	        case 0:continue;break;
	        default:continue;
	    }
    }
}
void s1(Zap *U)
{
    Zap *p=U;
    int s=0;
    while(p)
        {
            if((!strcmp(p->a.pol,Rus("мужской")))&&(p->a.voz>40)&&(!strcmp(p->a.obr,Rus("высшее")))&&(!strcmp(p->a.otv,Rus("да"))))
                s++;
            p=p->next;
        }
    cout << Rus("Кол-во мужчин старше 40 лет, имеющих высшее образование, которые ответили Да на вопрос анкеты равно ") << s << endl;
    cout << "-------------------" << endl;
}
void s2(Zap *U)
{
    Zap *p=U;
    int s=0;
    while(p)
        {
            if((!strcmp(p->a.pol,Rus("женский")))&&(p->a.voz<30)&&(!strcmp(p->a.obr,Rus("среднее")))&&(!strcmp(p->a.otv,Rus("да"))))
                s++;
            p=p->next;
        }
    cout << Rus("Кол-во женщин моложе 30 лет, имеющих среднее образование, которые ответили Да на вопрос анкеты равно ") << s << endl;
    cout << "-------------------" << endl;

}
void s3(Zap *U)
{
    Zap *p=U;
    int s=0;
    while(p)
        {
            if((!strcmp(p->a.pol,Rus("мужской")))&&(p->a.voz<25)&&(!strcmp(p->a.obr,Rus("начальное")))&&(!strcmp(p->a.otv,Rus("да"))))
                s++;
            p=p->next;
        }
    cout << Rus("Кол-во мужчин моложе 25 лет, имеющих начальное образование, которые ответили Да на вопрос анкеты равно ") << s << endl;
    cout << "-------------------" << endl;
}

void DelAll(Zap **U)//Очищение памяти от динамических структур
{
    Zap *p=*U;
    Zap *t=p;
    while(p)
    {
        p=p->next;
        delete t;
        t=p;
    }
    *U=0;
}

int prov(char name[])
{
    int i=0;
    int dlina;
    dlina=strlen(name);
    for (i=0;i<dlina;i++)
	{
		if(name[i]<'0'||name[i]>'9')
			return 1;
	}
	return 0;

}

char buf[600];
char* Rus(const char* text)
{
    CharToOem(text, buf);
    return buf;
}
msk вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама:


Старый 22.12.2009, 10:17   #2
Alan2006
Постоялец
 
Пол:Мужской
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
По умолчанию Re: Ошибка при компиляции

Цитата:
Сообщение от msk Посмотреть сообщение
Код:
int prov(char name[]);
...
char v1=1;
...
if(prov(v1)!=0)

А чего хотим, спрашивается...? Учим мат. часть. Особое внимание уделяем главам "типы данных", "указатели". Страуструп тебе в помощь

Цитата:
Сообщение от msk Посмотреть сообщение
v=atoi(v1)

Что за функция не помню честно говоря... Но, судя по всему, грабли те же...

По этим функциям.. попробуй сделать нечто подобное:
Код:
if(prov(&v1)!=0)
...
v=atoi(&v1)
Воспользуемся тем, что строка есть указатель на первый символ...
Компилироваться будет но при выполнении может начать валиться с ошибкой. Если начнёт - придётся всё переписывать...
Но лучше, раз уж у тебя используется только для обработки выбора пользователя сделать так:
Код:
int prov(char name)
{
	if(name<'0'||name>'9')
	{
		return 1;
	}
	return 0;
}
Зачем тебе обрабатывать весь мусор, который введёт пользователь? Смотри только первый символ.


Цитата:
Сообщение от msk Посмотреть сообщение
Код:
char v[20];
...
v=atoi(v1);
|46|error: incompatible types in assignment of `int' to `char[20]'|

Тут вообще всё ясно написанно.. Функция возвращает целое, а ты пытаешься массиву из 20 символов это, возвращаемое, значение присвоить...
Alan2006 вне форума
 
Ответить с цитированием Вверх
Старый 22.12.2009, 11:42   #3
msk
Пользователь
 
Пол:Мужской
Регистрация: 20.10.2006
Сообщений: 42
Репутация: 2
По умолчанию Re: Ошибка при компиляции

спасибо большое, ничерта не понял честно говоря, щас книжку дочитаю по плюсам, пересмотрю все, спсибо что откликнулся!
================================================== ==================================================

я тоже хочу разбираться как ты =), короче я все сделал как ты сказал, все почти заработало! ---->>>
-(1)"Тут вообще всё ясно написанно.. Функция возвращает целое, а ты пытаешься массиву из 20 символов это, возвращаемое, значение присвоить..." - вот тут я не понял(пока язык можно сказать не знаю), как это переправить?
-(2)"Зачем тебе обрабатывать весь мусор, который введёт пользователь? Смотри только первый символ." - это делается для того чтобы программа реагировала только на нужные символы(1,2,3,4 помоему), сама прога это типа анкетирование простое, там сначала добавляешь человека, прога спрашивает - сколько этому человеку лет? - а юзер может ввести например буквы или 999 лет, и вот программа должна игнорировать такие вот вводы некорректные(правда это все только в одном вроде месте реализовано, а в остальных местах прога зависает, цифры бегут по экрану...)

Последний раз редактировалось msk; 22.12.2009 в 11:57..
msk вне форума
 
Ответить с цитированием Вверх
Старый 22.12.2009, 14:56   #4
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Ошибка при компиляции

Все гораздо проще.
В функции prov() и atoi() Вы передаете одиночный символ,
а надо массив (символьную строку).
Да, и функция atoi() возвращает переменную типа int,
а не указатель на строку.
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 22.12.2009, 16:01   #5
Alan2006
Постоялец
 
Пол:Мужской
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
По умолчанию Re: Ошибка при компиляции

Цитата:
Сообщение от msk Посмотреть сообщение
вот тут я не понял(пока язык можно сказать не знаю), как это переправить?

Тут нужно смотреть что, по замыслу, должна вернуть функция и для чего это, опять же по замыслу, нужно...
atoi, думается мне переводит ansi-символ в целое. Тут уж нужнос мотреть.
На сколько я понял(не вчитывался в код глубоко), выглядеть должно так:
Код:
v1=atoi(v1);
Может ругнуться на несовместимость типов "символ" и "целое".. Тогда можно попробовать явное приведение:
Код:
v1=(char)atoi(v1);
Цитата:
Сообщение от msk Посмотреть сообщение
это делается для того чтобы программа реагировала только на нужные символы(1,2,3,4 помоему), сама прога это типа анкетирование простое, там сначала добавляешь человека, прога спрашивает - сколько этому человеку лет? - а юзер может ввести например буквы или 999 лет, и вот программа должна игнорировать такие вот вводы некорректные(правда это все только в одном вроде месте реализовано, а в остальных местах прога зависает, цифры бегут по экрану...)

У тебя функция prov используется только когда проверяет что ввёл пользователь в ответ на приглашение выбрать действие)
Пусть что хочет вводит) Если первый (он же единственный символ) будет числом то она отработает в том виде, в каком я написал)
Если пользователь дальше что-то навводит то это отбросится.
В любом случае сейчас реально он анализирует только один символ (погоняй в дебаггере или введи "1a" строчку в ответ на приглашение - убедишься)
Alan2006 вне форума
 
Ответить с цитированием Вверх
Старый 22.12.2009, 17:06   #6
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Ошибка при компиляции

Цитата из MSDN
Цитата:
Convert a string to integer.

int atoi(
const char *str
);
int _wtoi(
const wchar_t *str
);
int _atoi_l(
const char *str,
_locale_t locale
);
int _wtoi_l(
const wchar_t *str,
_locale_t locale
);


Parameters
str
String to be converted.

locale
Locale to use.

Return Value
Each function returns the int value produced by interpreting the input characters as a number. The return value is 0 for atoi and _wtoi, if the input cannot be converted to a value of that type.

Так что Вы неправы.
atoi преобразует строку в целое число.
А цифру в число можно преобразовать так:
char v1='5';
int k=v1-'0';
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 23.12.2009, 01:03   #7
msk
Пользователь
 
Пол:Мужской
Регистрация: 20.10.2006
Сообщений: 42
Репутация: 2
По умолчанию Re: Ошибка при компиляции

пипец я попал...беда какая.. всем спаисбо большое, буду разбираться
================================================== ========
а как должна выглядеть проверка на то что ввел пользователь? например вопро такой - какого пола тестируемый? (1-м, 2-ж) - я хочу например чтобы остальные символу, будь то буквы, другие цифры кроме 1 или 2 игнорировались и заново вопрос задавался? как это реализовать в коде? заранее благодарен
msk вне форума
 
Ответить с цитированием Вверх
Старый 23.12.2009, 09:39   #8
Alan2006
Постоялец
 
Пол:Мужской
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
По умолчанию Re: Ошибка при компиляции

Цитата:
Сообщение от zss Посмотреть сообщение
Так что Вы неправы.
atoi преобразует строку в целое число.

Символ в целое, строку в целое... по сути это и имел ввиду) Хотя, наверное, не точно выразился) Здесь главное что становится понятно, что должна делать функция. Как её применять я, похоже, угадал...

Цитата:
Сообщение от zss Посмотреть сообщение
А цифру в число можно преобразовать так:
char v1='5';
int k=v1-'0';

Можно) Можно ещё многими способами Один из которых использовал автор)


Цитата:
Сообщение от msk Посмотреть сообщение
а как должна выглядеть проверка на то что ввел пользователь? например вопро такой - какого пола тестируемый? (1-м, 2-ж) - я хочу например чтобы остальные символу, будь то буквы, другие цифры кроме 1 или 2 игнорировались и заново вопрос задавался? как это реализовать в коде? заранее благодарен

Можно сделать опять же по-разному... Где пользователь может ввести как цифру так и букву (как в примере: 1/2/м/ж) я бы читал символ а потом проверял бы вручную что там ввелось. К примеру, switch'ем. Только учти, что 'М' и 'м' - разные символы.

Где должен ввести что-то конкретное, к примеру число я бы делал форматированный ввод и использовал конструкцию попытка-исключение.
Alan2006 вне форума
 
Ответить с цитированием Вверх
Старый 23.12.2009, 15:50   #9
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Ошибка при компиляции

Строка и символ в С понимаются по-разному.
Строка - это массив символов, в конце которого стоит число 0
(не буква ноль, а именно число 0).
А Ваш кусок ввода должен быть примерно таким:
Код:
    int v1=1;
	while (v1)//цикл для меню
	{
        cout << Rus("Возможные действия:\n");
	    cout << Rus("1-Добавление анкеты\n");
	    cout << Rus("2-Печать всех анкет\n");
	    cout << Rus("3-Вывод статистических данных\n");
	    cout << Rus("0-Выход\n");
	    cout << Rus("Выберите действие: ");
	    cin >> v1;
        if(v1<0 || v1>3)
            {
                cout << Rus("Действие не корреткно.\n");
                cout << "---------------------------" << endl;
                continue;
            }
        else
          {
              v=v1;
.....
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 23.12.2009, 18:17   #10
Alan2006
Постоялец
 
Пол:Мужской
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
По умолчанию Re: Ошибка при компиляции

Цитата:
Сообщение от msk Посмотреть сообщение
Код:
    char v[20];

Цитата:
Сообщение от zss Посмотреть сообщение
v=v1;
[/code]

Безусловно, в корне меняет дело....

Раз уж на то пошло, естественно, проще и надёжнее объявить интом и не мучаться. Правда не знаю, как cin отреагирует на ввод вместо целого скажем строки (да! я старообрядец который использует функции семейства scanf. Ну удобнее мне так! но сканф обижался на такие вот вводы). Что я писал про попытку-исключение - писал как раз чтобы отработать можно было подобную ситуацию в любом случае.
Символ лучше использовать если есть двоякость выбора.. т.е. может ввести "1" а может "м" и тут уж никуда не денешься.

Про строку... Да строка это массив символов. Но что есть указатель на "единичный символ"? Массив состоящий из одного элемента....
Alan2006 вне форума
 
Ответить с цитированием Вверх
Старый 23.12.2009, 23:26   #11
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Ошибка при компиляции

v=v1;
там было написано
v=atoi(...
ну я и не проверил, а действительно ли v целое
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Ответ


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при компиляции binutils-2.17 neonman Вопросы и проблемы 8 23.04.2008 22:51
Дистрибутив для кросс компиляции(debian vs slackware) Xmakc UNIX, Linux, MacOs для PC и другие ОС 4 25.03.2008 12:10
Ошибки компиляции Delphi 2007 Help! Terio Delphi 8 27.02.2008 00:09

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 12:07. Часовой пояс GMT +3.


Copyright ©2004 - 2026 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.06537 секунды с 11 запросами