Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Deklarowanie struktury lokalnie i globalnie - różnice

Ostatnio zmodyfikowano 2011-08-10 17:25
Autor Wiadomość
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 :)
P-38656
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:

C/C++
#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.
P-38661
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:
C/C++
#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; // tutaj wyskakuje blad
    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;
}


P-38663
Dragonit
» 2011-08-10 12:50:15
Usuń cudzysłowy.
P-38664
madmike44
» 2011-08-10 12:53:41
Poprawny kod:

C/C++
#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; // tutaj wyskakuje blad
    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.
P-38665
DejaVu
» 2011-08-10 12:54:31
silnik jest typem wyliczeniowym, a nie tekstem. Wywal cudzysłowy.
P-38666
inf.kam
Temat założony przez niniejszego użytkownika
» 2011-08-10 13:11:05
Bardzo dziękuje za wszystkie odpowiedzi :)
P-38671
inf.kam
Temat założony przez niniejszego użytkownika
» 2011-08-10 17:05:57
Mam  jeszcze jedno pytanie :

C/C++
switch( rodzaj )
{
case 'A' && 'a': auta.silnik = "benzynowy"; break; //takie coś działa
case 'B': auta.silnik = "diesel"; break;
case 'C': auta.silnik = "gaz"; break;
case 'D': auta.silnik = "hybrydowy"; break;
default: auta.silnik = "benzynowy";
}
 
ale,

C/C++
switch( rodzaj )
{
case 'A' && 'a': auta.silnik = "benzynowy"; break;
case 'B' && 'b': auta.silnik = "diesel"; break; //tutaj wyskakuje błąd o co chodzi??
case 'C': auta.silnik = "gaz"; break;
case 'D': auta.silnik = "hybrydowy"; break;
default: auta.silnik = "benzynowy";
}

proszę o jeszcze jedną pomoc
P-38706
« 1 » 2
  Strona 1 z 2 Następna strona