Страница 1 из 2

expexted primary expression before "void"

Добавлено: 13 июн 2010, 21:20
Юлько
Эм, помогите, люди добрые! В чём ошибка и как бы это исправить? Чёт я зависла слегка, знаний не хватает))
Пасибо огромнейшее заранее тому, кто мне скажет, где я балбеско!

Код: Выделить всё

 
#include <iostream>
using namespace std;
int main()
{
    char benutzereingabe_text;
    int benutzereingabe_zahl;
    int testscore = 0;
    bool richtige_Eingabe = false;
    int zaeler = 1;
    int Anzahl_der_Aufgaben = 7;
    
    void aufgabe1()
    {
         cout<<"Bitte loesen Sie die"<<zaeler<<". Aufgabe: \n 319 + 72 = ";
         cin>>benutzereingabe_text;
         
         richtigeEingabe = ueberpruefung(benutzereingabeText);
         if (richtigeEingabe)
		 {
			if (benutzereingabe_zahl == 391)
			{ 
				testscore++;
				zaehler++;
			}
			else
			{
				cout<<"Die Antwort war leider falsch. Auf zur naechsten Aufgabe.\n\n";
				zaehler++;
            }
         }
    }
    
    void aufgabe2()
    {
         cout<<"Bitte loesen Sie die"<<zaeler<<". Aufgabe: \n 125 : 5 = ";
         cin>>benutzereingabe_text;
         
         richtigeEingabe = ueberpruefung(benutzereingabeText);
         if (richtigeEingabe)
		 {
			if (benutzereingabe_zahl == 25)
			{ 
				testscore++;
				zaehler++;
			}
			else
			{
				cout<<"Die Antwort war leider falsch. Auf zur naechsten Aufgabe.\n\n";
				zaehler++;
            }
         }
    }
    
    void aufgabe3()
    {
         cout<<"Bitte loesen Sie die"<<zaeler<<". Aufgabe: \n (315 - 26) * 3 = ";
         cin>>benutzereingabe_text;
         
         richtigeEingabe = ueberpruefung(benutzereingabeText);
         if (richtigeEingabe)
		 {
			if (benutzereingabe_zahl == 867)
			{ 
				testscore++;
				zaehler++;
			}
			else
			{
				cout<<"Die Antwort war leider falsch. Auf zur naechsten Aufgabe.\n\n";
				zaehler++;
            }
         }
    }
    
    void aufgabe4()
    {
         cout<<"Bitte loesen Sie die"<<zaeler<<". Aufgabe: \n 16^2 = ";
         cin>>benutzereingabe_text;
         
         richtigeEingabe = ueberpruefung(benutzereingabeText);
         if (richtigeEingabe)
		 {
			if (benutzereingabe_zahl == 256)
			{ 
				testscore++;
				zaehler++;
			}
			else
			{
				cout<<"Die Antwort war leider falsch. Auf zur naechsten Aufgabe.\n\n";
				zaehler++;
            }
         }
    }
    
    void aufgabe5()
    {
         cout<<"Bitte loesen Sie die"<<zaeler<<". Aufgabe: \n (40 : 2) ^ 2 = ";
         cin>>benutzereingabe_text;
         
         richtigeEingabe = ueberpruefung(benutzereingabeText);
         if (richtigeEingabe)
		 {
			if (benutzereingabe_zahl == 400)
			{ 
				testscore++;
				zaehler++;
			}
			else
			{
				cout<<"Die Antwort war leider falsch. Auf zur naechsten Aufgabe.\n\n";
				zaehler++;
            }
         }
    }
    
    void aufgabe6()
    {
         cout<<"Bitte loesen Sie die"<<zaeler<<". Aufgabe: \n (527 + 31 ) : 3 = ";
         cin>>benutzereingabe_text;
         
         richtigeEingabe = ueberpruefung(benutzereingabeText);
         if (richtigeEingabe)
		 {
			if (benutzereingabe_zahl == 201)
			{ 
				testscore++;
				zaehler++;
			}
			else
			{
				cout<<"Die Antwort war leider falsch. Auf zur naechsten Aufgabe.\n\n";
				zaehler++;
            }
         }
    }
    
    void aufgabe7()
    {
         cout<<"Bitte loesen Sie die"<<zaeler<<". Aufgabe: \n (9^2)(6^2)(3^2) + 21 = ";
         cin>>benutzereingabe_text;
         
         richtigeEingabe = ueberpruefung(benutzereingabeText);
         if (richtigeEingabe)
		 {
			if (benutzereingabe_zahl == 147)
			{ 
				testscore++;
				zaehler++;
			}
			else
			{
				cout<<"Die Antwort war leider falsch. Auf zur naechsten Aufgabe.\n\n";
				zaehler++;
            }
         }
    }
    
    bool ueberpruefung(char benutzereingabe_text)
    {
         bool ueberpruefung = false;
         try
         {
			benutzereingabe_zahl = Integer.valueOf(benutzereingabe);
			ueberpruefung = true;
		 }
		 catch (Exception e)
		 {
			cout<<"Die Zahl, die Sie eingegeben haben, ist keine Zahl.\n\n";
		 }
		return ueberpruefung;
	}
	void main(char)
	{
		cout<<"Bitte loesen Sie die folgenden Aufgaben.\n\n";
		do
		{
			switch (zaehler-1)
			{
			 case 0: aufgabe1();
                break;
			 case 1: aufgabe1();
				break;
			 case 2: aufgabe1();
				break;
			 case 3: aufgabe1();
				break;
			 case 4: aufgabe1();
				break;
			 case 5: aufgabe1();
				break;
			 case 6: aufgabe1();
				break;
			}
		}
		while (zaehler-1 != Anzahl_der_Aufgaben);
		cout<<"\a";
		cout<<"\n\nSie haben den Test abgeschlossen.\nIhre Punktzahl betraegt: "<<testscore;
	}
    cout<<"\n";
    cout<<"\n";
    system("pause");
    return 0;
}

Re: expexted primary expression before "void"

Добавлено: 13 июн 2010, 23:27
Romeo
Ну хоть опиши, как ошибка проявляется. А то куча кода, сообщения на немецком (которого я не знаю). В общем на разор уйдёт много времени, которого у меня, к сожалению, нету.

Re: expexted primary expression before "void"

Добавлено: 14 июн 2010, 00:40
Юлько
ошибка выдаётся в каждой строчке, которая начинается с void - то бишь 7 раз.
смысл программы: небольшой тестик с математическими заданиями. его можно написать гораздо проще, но мне хотелось, чтобы если пользователь вместо ответа вводит не цифры, а чего-нибудь другое, выдавалось соответственное сообщение и вопрос повторялся. И это единственный способ, который я смогла придумать (ибо с++ начала изучать всего 2 недели назад :) )

Re: expexted primary expression before "void"

Добавлено: 14 июн 2010, 02:40
Romeo
В общем здесь множество ошибок и я даже не знаю, как их исправить, так как не понимаю, как в все эти функции связаны друг с другом (незнание немецкого влияет на понимание коренным образом). Предлагаю для начала определиться какая функцию какую будет вызывать, а также избавится от вложенности функций.

Re: expexted primary expression before "void"

Добавлено: 14 июн 2010, 06:22
Vasilisk
У вас, барышня, все функции вложены внутрь функции main(). А языг такого не допускает - он хочет, чтобы вложенных функций не было. Т.е. все функции нужно вынести и записать после main. Или - перед.

Re: expexted primary expression before "void"

Добавлено: 17 июн 2010, 15:43
BBB
Vasilisk писал(а):У вас, барышня, все функции вложены внутрь функции main(). А языг такого не допускает - он хочет, чтобы вложенных функций не было. Т.е. все функции нужно вынести и записать после main. Или - перед.
Я полагаю, что НЕ ПОСЛЕ, а именно ПЕРЕД :) Т.к. если записать после, то при компиляции main эти ф-ии будут еще неизвестны для компилятора, и опять получим ошибку.

Re: expexted primary expression before "void"

Добавлено: 17 июн 2010, 18:03
Юлько
BBB писал(а):Я полагаю, что НЕ ПОСЛЕ, а именно ПЕРЕД :) Т.к. если записать после, то при компиляции main эти ф-ии будут еще неизвестны для компилятора, и опять получим ошибку.

логично... а переменные тогда где обьявлять? покажииите мне пожаааааааалуйста один раз, как это должно выглядеть и я больше не буду задавать глупых вопросов))

Re: expexted primary expression before "void"

Добавлено: 17 июн 2010, 18:37
Vasilisk
Юлько писал(а):логично... а переменные тогда где обьявлять? покажииите мне пожаааааааалуйста один раз, как это должно выглядеть и я больше не буду задавать глупых вопросов))

Можно и "перед", а можно и "после" :) - сишник есть такой удивительный языг, в котором есть "описание функции" и "определение функции" и это - разные вещи. В той же ПХПе этого нет - там определение функции это её же и описание, что порождает иногда совершенно жуткий геморрой.

В C/C++ же всё просто. Там, где компилер встречает выражение y=func(x) это "ссылка на функцию", т.е. к моменту получения этого выражения компилер уже должен знать "как функцию вызывать". При этом компилеру не нужно знать саму функцию - ему нужно только знать, как в неё подставлять параметры. Этого можно добиться поместив определение самой функции перед её вызовом. Но можно - поместив перед её вызовом только описание "прототипа функции", а само тело функции - поместить где будет удобно. Даже в другой единице компиляции, всё равно собирает-то всё вместе не компилер, а линкер...

Поэтому в данном случае покатит так:

Код: Выделить всё

int func(int);

int main(){
int x;
...
y = func(x);
...
}

int func(int arg){
...
 return 1;
}

т.е. перед вызовом функций достаточно описать только заголовки тех функций, которые вызываются. Это - ни к чему не обязывает программиста и никакого объектного кода не порождает, это - просто информация программиста компилятору и только. В любом *.h файле собраны именно такие описания прототипов функций, можно туда заглянуть и всё увидеть.

Переменные объявляются не так, как функции - у них нет "прототипов", объявление переменной это её же определение в том блоке, в котором она встретилась. Если переменная встречается вне какой-либо функции, то она считается "глобальной", т.е. доступной из любой функции без дополнительного объявления. При этом, если проект имеет более одного файла, то определить так переменную можно только в каком-то одном файле. Во всех прочих её нужно "объявлять" с атрибутом extern - собирает все файлы в один линкер и это объявление для линкера откуда ему брать что.

Re: expexted primary expression before "void"

Добавлено: 17 июн 2010, 22:40
Decoder
Да уж... если в столице Германии так учат программированию, то что говорить про нашу страну. В Америку надо ехать, там хорошо учат.

Re: expexted primary expression before "void"

Добавлено: 17 июн 2010, 22:48
Юлько
Decoder писал(а):Да уж... если в столице Германии так учат программированию, то что говорить про нашу страну. В Америку надо ехать, там хорошо учат.

Ох, учат ещё интересней... Проф у нас тётка из Греции, по-немецки говорит с жутким акцентом, предложения не заканчивает, обьяснять ни фига не умеет... поэтому учу сама по книжкам, да и то всего 3 недели как(((
Утешает только то, что это не основной предмет, я вообще-то на математика учусь))