Deklarowanie struktury lokalnie i globalnie - różnice
Ostatnio zmodyfikowano 2011-08-10 17:25
inf.kam Temat założony przez niniejszego użytkownika |
Deklarowanie struktury lokalnie i globalnie - różnice » 2011-08-10 12:02:19 Mam pytanie, na kursie z tej strony struktury są deklarowane przed słowem int main(), a ja korzystam z innego źródła i tam jest struktura deklarowana po słowie int main() czy to jest jakaś różnica?? To pytanie dla niektórych może będzie głupie ale od niedawna programuję więc sorki :) |
|
madmike44 |
» 2011-08-10 12:27:27 Różnica jest taka, że deklarując strukturę (zmienną, klasę) wewnątrz jakiejś funkcji (również funkcji main), możesz takiej struktury używać tylko wewnątrz tej funkcji - jest to struktura o zasięgu lokalnym. Natomiast deklaracja struktury na początku pliku przed funkcją main() pozwala na użycie takiej struktury we wszystkich definicjach funkcji umieszczonych poniżej w pliku. Prosty przykład: #include <iostream>
struct struktura { int x; };
int main() { struktura pierwsza; return 0; }
void funkcja() { struktura druga; }
Powyższy kod skompiluje się poprawnie - chcemy użyć struktury zadeklarowanej globalnie w funkcjach main() oraz funkcja(). Jeśli przeniesiesz deklarację/definicję struktury do funkcji main(), otrzymasz błąd - w funkcji funkcja() kompilator zgłosi brak deklaracji struktury. |
|
inf.kam Temat założony przez niniejszego użytkownika |
» 2011-08-10 12:39:17 Bardzo dziękuje za wyjaśnienie. Czy mógłbyś jeszcze zerknąć na kod i powiedzieć co zrobiłem źle: #include <iostream> #include <cstring>
using namespace std;
int main() { enum rodzajSilnika { benzynowy, diesel, gaz, hybrydowy }; struct Samochod { string marka; string model; unsigned short rokProdukcji; rodzajSilnika silnik; } auta; char rodzaj; cout << "Podaj informacje o swoim aucie" << endl; cout << "Podaj marke: "; cin >> auta.marka; cin.ignore(); cout << "Podaj model: "; cin >> auta.model; cin.ignore(); cout << "Podaj rok produkcji: "; cin >> auta.rokProdukcji; cin.ignore(); cout << "Wybiez swoj rodzaj silnika: "; cout << "A.benzynowy"; cout << "B. diesel"; cout << "C. gaz"; cout << "D. hybrydowy"; cin >> rodzaj; cin.ignore(); switch( rodzaj ) { case 'A': auta.silnik = "benzynowy"; break; case 'B': auta.silnik = "diesel"; break; case 'C': auta.silnik = "gaz"; break; case 'D': auta.silnik = "hybrydowy"; break; default: auta.silnik = "benzynowy"; } cout << "Dane twojego auta: "; cout << "Marka: " << auta.marka << endl; cout << "Model: " << auta.model << endl; cout << "Rok produkcji: " << auta.rokProdukcji << endl; cout << "Rodzaj silnika: " << auta.silnik << endl; cout << endl << endl << "Nacisnij Enter aby zakonczyc" << endl; getchar(); return 0; }
|
|
Dragonit |
» 2011-08-10 12:50:15 Usuń cudzysłowy. |
|
madmike44 |
» 2011-08-10 12:53:41 Poprawny kod: #include <iostream> #include <cstring> #include <cstdio>
using namespace std;
int main() { enum rodzajSilnika { benzynowy, diesel, gaz, hybrydowy }; struct Samochod { string marka; string model; unsigned short rokProdukcji; rodzajSilnika silnik; } auta; char rodzaj; cout << "Podaj informacje o swoim aucie" << endl; cout << "Podaj marke: "; cin >> auta.marka; cin.ignore(); cout << "Podaj model: "; cin >> auta.model; cin.ignore(); cout << "Podaj rok produkcji: "; cin >> auta.rokProdukcji; cin.ignore(); cout << "Wybiez swoj rodzaj silnika: "; cout << "A.benzynowy"; cout << "B. diesel"; cout << "C. gaz"; cout << "D. hybrydowy"; cin >> rodzaj; cin.ignore(); switch( rodzaj ) { case 'A': auta.silnik = benzynowy; break; case 'B': auta.silnik = diesel; break; case 'C': auta.silnik = gaz; break; case 'D': auta.silnik = hybrydowy; break; default: auta.silnik = benzynowy; } cout << "Dane twojego auta: "; cout << "Marka: " << auta.marka << endl; cout << "Model: " << auta.model << endl; cout << "Rok produkcji: " << auta.rokProdukcji << endl; cout << "Rodzaj silnika: " << auta.silnik << endl; cout << endl << endl << "Nacisnij Enter aby zakonczyc" << endl; getchar(); return 0; }
Rodzaj silnika jest typem wyliczeniowym, więc przypisując określoną wartość nie używaj cudzysłowów, bo wtedy próbujesz przypisać wartość, która jest zabroniona (zwykły c-string, a nie jedną z podanych wcześniej możliwości). Kompilator próbuje dopasować wartości przez konwersję i od razu się wysypuje. P.S. Definicja funkcji getchar() znajduje się w pliku nagłówkowym cstdio. |
|
DejaVu |
» 2011-08-10 12:54:31 silnik jest typem wyliczeniowym, a nie tekstem. Wywal cudzysłowy. |
|
inf.kam Temat założony przez niniejszego użytkownika |
» 2011-08-10 13:11:05 Bardzo dziękuje za wszystkie odpowiedzi :) |
|
inf.kam Temat założony przez niniejszego użytkownika |
» 2011-08-10 17:05:57 Mam jeszcze jedno pytanie : switch( rodzaj ) { case 'A' && 'a': auta.silnik = "benzynowy"; break; case 'B': auta.silnik = "diesel"; break; case 'C': auta.silnik = "gaz"; break; case 'D': auta.silnik = "hybrydowy"; break; default: auta.silnik = "benzynowy"; }
ale, switch( rodzaj ) { case 'A' && 'a': auta.silnik = "benzynowy"; break; case 'B' && 'b': auta.silnik = "diesel"; break; case 'C': auta.silnik = "gaz"; break; case 'D': auta.silnik = "hybrydowy"; break; default: auta.silnik = "benzynowy"; }
proszę o jeszcze jedną pomoc |
|
« 1 » 2 |