Void, a int main

Xenodium
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 lat
  • Postów:5
0

Cześć, zacząłem się uczyć C++, jest to moja pierwsza styczność z programowaniem, ale mam problem, który mnie irytuje.

Próbowałem znaleźć coś na forum, ale są rzeczy dotyczące voida dla bardziej zaawansowanych. Teoretycznie poradziłem sobie inną metodą, ale chciałbym zrozumieć swój błąd. Uczę sie z kursów xiona, cpp0x, książek Praty.

Kopiuj
// Obsługa strumienia wyjścia i wejścia

#include <iostream>
#include <conio.h>
#include <string>

using namespace std;

void funkcja()
{
    string imie;
    cout << "Podaj swoje imie: ";
    cin >> imie;
    cout << "Twoje imie to " << imie << "." << endl;
    getch();

}

Kopiuj

// Obsługa strumienia wyjścia i wejścia

#include <iostream>
#include <conio.h>
#include <string>

using namespace std;

int main()
{
    string imie;
    cout << "Podaj swoje imie: ";
    cin >> imie;
    cout << "Twoje imie to " << imie << "." << endl;
    getch();
    return 0;
}

W drugim jest wszystko oczywiste, natomiast w pierwszym nie jestem pewien błędu, zresztą taki kod jest w tutorialu xiona.

pol90
W pierwszym jest brak funkcji main
Xenodium
@pol90: tak, tylko jak zastąpię nazwę jako main to błąd pozostaje
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
1

Ale... jakie jest pytanie?


Xenodium
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 lat
  • Postów:5
0

A, zapomniałem dodać ;)

Kopiuj
||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
D:\Projekty\test\main.cpp|6|error: '::main' must return 'int'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

Tekst błędu, nie wiem jak poradzić sobie, aby umieścić to w funkcji void.

edytowany 1x, ostatnio: Xenodium
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
1

Jeśli pierwszy listing to cały program, to brak w niej funkcji main. Sygnatura main jest z góry narzucona przez standard języka (przynajmniej w dużej mierze).


Xenodium
Ale przy zmianie na main w dalszym ciągu "error: '::main' must return 'int'" "
kq
Odpowiadaj w odpowiedziach.
Xenodium
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 lat
  • Postów:5
0

Po zmianie na main:

Kopiuj
// Input – użycie zmiennych i strumienia wejścia
#include <string>
#include <iostream>
#include <conio.h>

void main()
{
   std::string strImie;
   std::cout <<"Podaj swoje imie: ";
   std::cin >> strImie;
   std::cout   << "Twoje imie to " << strImie <<  "." << std::endl;
   getch();
}

Błąd w dalszym ciągu:
D:\Projekty\test\main.cpp|6|error: '::main' must return 'int'|

pol90
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:1181
0

A weź spróbuj tak.

Kopiuj
// Input – użycie zmiennych i strumienia wejścia
#include <string>
#include <iostream>
#include <conio.h>

int main()
{
   std::string strImie;
   std::cout <<"Podaj swoje imie: ";
   std::cin >> strImie;
   std::cout   << "Twoje imie to " << strImie <<  "." << std::endl;
   getch();
}
kq
Tak mu nie pomożesz nauczyć się czytania tego co mu wypluwa kompilator.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
2

Jak u Ciebie z językiem angielskim?

'::main' must return 'int'

oznacza

'::main' musi zwracać 'int'


edytowany 1x, ostatnio: kq
Xenodium
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 lat
  • Postów:5
0

Ale ja angielski bardzo dobrze rozumiem, jedyne co to nie mogę zrozumieć logiki tego błędu i nie wiem jak sobie poradzić z voidem, tak jak jest w przykładzie xiona.

Zamieniłem właśnie na int samodzielnie, dodałem return 0; w sensie co ma zwracać. Ale mi chodzi o sam fakt, że coś takiego jest w tutorialu.

Część druga: z czego składa się program, strona 11 (http://xion.org.pl/files/texts/mgt/pdf/1_2.pdf)

edytowany 2x, ostatnio: Xenodium
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
3

Tutorial xiona ma, o ile się nie mylę, ok. 20 lat. Inaczej mówiąc, jest jeszcze starszy niż Symfonia C++.

Nie rozumiem czego nie rozumiesz w takim razie - main ma zwracać int, więc jak próbujesz na siłę sprawić aby zwracał void to kompilator mówi, że robisz źle.


kaczus
Tak dla porządku, symfonia ma ponad 20 lat :)
kq
No ta stara tak, ale jest wydanie z 2005. No i niedawno wyszło Opus Magnum Grębosza. Już mam, niedługo zrecenzuję :>
Xenodium
@kq: o symfonii też czytałem, odpuściłem sobie; niektórzy polecają, a niektórzy "karcą" za jej używanie przez to, że jej przestarzała.
Xenodium
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 lat
  • Postów:5
0

Po prostu się uczę, a czytałem tu na forum (nie jakieś stare wątki), że to polecany kurs. Z racji jednak tego, że wywalało mi ten błąd, a nie wiedziałem dlaczego postanowiłem się zapytać. Lepiej dowiedzieć się więcej niż mniej.

@kq jest sens z niego się uczyć, czy go odstawić lepiej?

Shalom
Te wątki to chyba jednak był starsze od ciebie jeśli polecały ten tutorial ;)
Xenodium
@Shalom: właśnie mi się wydaje, że był z 2016, ale ręki sobie uciąć nie dam, zresztą to nieistotne. Cpp0x + prata będą w porządku na początki?
tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
2

W pierwszym programie musisz dodać funkcję main, która wywoła funkcje funkcja.

Kopiuj
int main( int, char** )
{
  funkcja();
  return 0;
}

"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
R1
  • Rejestracja:około 13 lat
  • Ostatnio:3 miesiące
  • Postów:46
0

Wystarczy, że zmienisz nazwę funkcji "funkcja" na main. Void zastąpisz int a na koncu funkcji dodasz return ( TRUE ).

Zobacz pozostałe 4 komentarze
kq
Bleh, jak czytałem te reguły MISRA to wiem, że powołałbym się na klauzulę sumienia gdyby kazali mi tego używać :​/
R1
Jak już nie ma wyjścia to się komentuje poprzez "klauzule sumienia" :) Nie mniej jednak klienci wymagaja jak najmniejsza ilosc tego typu ostrzezen. Czasem kod 2 liniki trzeba rozbic na 10 linijek zeby bylo zgodne z regulami MISRA/POLYSPACE/COMPILER. No coz, taka praca... Milego Piatku:) a ja wracam do sprawdzania ostrzezen z MISRY :P
vpiotr
OK, ale "TRUE"??? To jakiś Windowsowy antypattern? Równie dobrze można zwracać NULL.
R1
A czepiamy sie. EXIT_SUCCESS, pasuje? Podalem tylko przyklad.
xxx_xx_x
Chodzi o to że TRUE = 1, a to oznacz kod błędu. Main powinien zwrócić 0
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.