webForumDet fria alternativet

Vad är det för fel

C/C++

17 svar · 732 visningar · startad av yador

Medlem sedan mars 2004455 inlägg
Frågan#1

Hej alla wf:are, igen. Jag håller på att lära mig c++, men jag har stannat på ett ställe som jag har provat att lösa i cirka 2 dygn, men det blir bara ett felmedelande hela tiden. Så jag undrar vad som är fel med denna kod

#include <iostream.h>
void main()
{
     char en_variabel;
     cout << "jag är smart\n";
     cout << "Tror inte du det? (j/n)";
     cin >> en_variabel;
     if(en_variabel == 'j')
         cout << "\nSåklart";
     else
         cout << "\nNej";
}

Är väldigt tacksam för svar och jag andvänder dev-c++ om ni ville veta.
Tack på förhand!

Medlem sedan juni 20034 013 inlägg
#2

Vad blir det för felmeddelande då?

Medlem sedan mars 2004455 inlägg
#3

Så här står de i kompilatorloggen:

Kompilator: Default compiler
Kör g++.exe...
g++.exe "C:\Dev-Cpp\include\c++\3.4.2\backward\program.cpp" -o "nul" -g3 -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -g3
In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31,
from C:\Dev-Cpp\include\c++\3.4.2\backward\program.cpp:1:

C:/Dev-Cpp/include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
C:\Dev-Cpp\include\c++\3.4.2\backward\program.cpp:3: error: `main' must return `int'

Körning avslutad

Menar du det?

Medlem sedan juni 20034 013 inlägg
#4

Okej, om vi översätter det till svenska så har du fått en varning och ett fel. Varningar är mindre allvarliga fel som inte hindrar programmet från att köras.

Varningen är: "This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>."

Vilket översatt betyder att du ska skriva #include <iostream>

Felet är: "`main' must return `int'"

Och det betyder att din main-funktion inte returnerar int, utan du har skrivit void där. Ändra void till int och lägg sedan till return 0; sist i main-funktionen.

Medlem sedan mars 2004455 inlägg
#5

Okej, ska prova.. det ståd annat i min bok

Medlem sedan juni 20034 013 inlägg
#6

Din bok är förmodligen äldre.

Medlem sedan mars 2004455 inlägg
#7

Har provat det nu men då får jag massa andra(3) fel. Menar ni verkligen så här:

#include <iostream>
int main()
{
     char en_variabel;
     cout << "jag är smart\n";
     cout << "Tror inte du det? (j/n)";
     cin >> en_variabel;
     if(en_variabel == 'j')
         cout << "\nSåklart";
     else
         cout << "\nNej";
     return 0;
}

jag får detta som svar:
error: `cout' undeclared (first use this function)
error: (Each undeclared identifier is reported only once for each function it appears in.)
error: `cin' undeclared (first use this function)

Medlem sedan juni 200010 432 inlägg
#8

Använd std::cout och std::cin istället för bara cout och cin, eller så globalt genom "using namespace std"

Medlem sedan mars 2004455 inlägg
#9

vad är using namespace std

Medlem sedan mars 2004455 inlägg
#10

vad menar programmet att jag ska göra när jag får detta meddelande: void value not ignored as it ought to be

Medlem sedan juni 200010 432 inlägg
#11

http://www.it.uu.se/edu/course/homepage/dopTDB1/c++/tips.html

De filer som C++ har ärvt från C har ändrat namn något: man har tagit bort .h och placerat bokstaven c först: så har t.ex. math.h blivit cmath. Anledningen till att man bytt namn är bl.a. att begreppet namespace införts, detta för att minska riskerna för namnkollisioner. Man kan i stället för att skriva using namespace std skriva t.ex. std::cout i sin kod och på så sätt slippa få problem med namnkollisioner i filen iostream. Nu är detta inget man egentligen behöver tänka på (förutom om man deltar i stora programmeringsprojekt): det räcker att veta hur man ska skriva:

\#include \<iostream\>
using namespace std;

std är alltså namespacet std.

Medlem sedan juli 2002581 inlägg
#12

Denna kod fungerar:

#include <iostream>
int main()
{
     using namespace std;
     char en_variabel;
     cout << "jag är smart\n";
     cout << "Tror inte du det? (j/n)";
     cin >> en_variabel;
     if(en_variabel == 'j')
         cout << "\nSåklart";
     else
         cout << "\nNej";
}
Medlem sedan feb. 2002476 inlägg
#13
#include <iostream>

using namespace std;

int main(int argc, char *argc[])
{
     char en_variabel;
     cout << "jag är smart\n";
     cout << "Tror inte du det? (j/n)";
     cin >> en_variabel;
     if(en_variabel == 'j')
         cout << "\nSåklart";
     else
         cout << "\nNej";

     return 0;
}

Vore något bättre... Det är inte bra att inte returnera ett värde. Dessutom är det alltid bra att ha med argc och argv

Medlem sedan juli 2002581 inlägg
#14

Att inte skicka tillbaka ett värde från main fungerar alldeles utmärkt. Läs C++-standarden, eller sök på nätet. Att inte skriva någonting är samma sak som att skicka tillbaka 0. Dessutom är det bättre, eftersom man då kan koncentrera sig på det viktiga i programmet.

Att ta med två argument till main när de ändå inte används ser jag ingen som helst poäng med. Saker som programmet inte använder sig av (returvärde, kommandoradsparametrar) skall heller inte finnas i källkoden. Punkt.

RED:
Du glömde även säga varför du tyckte det var bättre med "using namespace std" globalt i stället för lokalt i main.

Medlem sedan feb. 200321 inlägg
#15

Kan du tala om vart på nätet som det står att det går utmärkt att inte skicka med retur värde från main?

ISO C++ Standard (ISO/IEC 14882:1998) talar klart och tydligt om att main MÅSTE returnera int.

Däremot är det giltligt i C att inte returnera int..

Angående using namespace std; är det väl en smaksak. Anledningen till att ha den överst är att slippa skriva den i varenda funktion som använder stdlib.

Medlem sedan dec. 20025 483 inlägg
#16

verifier skrev:

Kan du tala om vart på nätet som det står att det går utmärkt att inte skicka med retur värde från main?

Istället för att hänvisa till en källa på nätet, dirigerar jag dig till ISO/IEC 14882:1998, 3.6.1, stycke fem. Där kan läsas att utelämnandet av en return-sats har samma effekt som return 0.

verifier skrev:

ISO C++ Standard (ISO/IEC 14882:1998) talar klart och tydligt om att main MÅSTE returnera int.

Vad jag kan se har ingen i denna tråd påstått annat. Att explicit inkludera en return-sats är däremot frivilligt.

Medlem sedan juli 2002581 inlägg
#17

verifier skrev:

Kan du tala om vart på nätet som det står att det går utmärkt att inte skicka med retur värde från main?

Från skaparen av C++:
http://www.research.att.com/~bs/bs_faq2.html#void-main

verifier skrev:

ISO C++ Standard (ISO/IEC 14882:1998) talar klart och tydligt om att main MÅSTE returnera int.

Vad bra att du känner till standarden. Om du även hade läst den hade du hittat stycket som Peter visade.

verifier skrev:

Däremot är det giltligt i C att inte returnera int..

Se ovanstående länk.

Medlem sedan feb. 200321 inlägg
#18

Ahh. Läste fel. Trodde du skrev att main kan vara void (void main()). :birp

261 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)