• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wpisywanie danych int

Object Storage Arubacloud
+2 głosów
559 wizyt
pytanie zadane 11 lipca 2015 w C i C++ przez rafalmagician Obywatel (1,320 p.)

Jak wpisać liczby do struktury żeby nie wyrzucało mnie z programu?

Kod w mainie:

I jest błąd w 19 linii i nie wiem co oznacza :(

Proszę o pomoc i wytłumaczenie co to oznacza?

2 odpowiedzi

+4 głosów
odpowiedź 11 lipca 2015 przez mrcnsct Nałogowiec (36,390 p.)
Powinieneś dać &osoba.pensja. Taki błąd wyskakuje, gdy wczytuje się int przez scanf i nie da się &.
komentarz 11 lipca 2015 przez rafalmagician Obywatel (1,320 p.)
Dziękuję Ci bardzo :) Ale ze mnie dłupek że o tak prostej "rzeczy" zapomniałem.
komentarz 11 lipca 2015 przez Buby Pasjonat (19,590 p.)
A teraz pomogę Ci wyjasnić co oznacza ten błąd - funkcja scanf oczekuje wskaźnika do zmiennej. Wskaźnik ten przechowuje adres w której znajduje się wartość zmiennej. Funkcja wymaga tego, aby zapisać w tym miejscu wartość.

Aby przekazać do funkcji wskaźnik, a nie zmienną używa się operatora adresu, którym jest ampersant &.  

Przykład jak powinno to wyglądać zaprezentował kolega wyżej. :)
komentarz 11 lipca 2015 przez rafalmagician Obywatel (1,320 p.)
Teraz już rozumiem. Dziękuję bardzo :)
+1 głos
odpowiedź 11 lipca 2015 przez rafalmagician Obywatel (1,320 p.)

Nie chcę robić nowego tematu więc piszę tutaj :)

Teraz jest problem z wypisaniem danych z funkcji żeby nie było takich znaków:

Kod w mainie:

Kod w funkcji:

Nie wiem co muszę zmienić i gdzie w kodzie. Zaznaczam że program działa i nie wypisuje żadnych błędów wszystko kompiluje się prawidłowo.

I proszę też o wytłumaczenie co zrobiłem źle :)

Z góry dziękuję :)

komentarz 11 lipca 2015 przez mrcnsct Nałogowiec (36,390 p.)
Wypisuje tylko te znaki czy coś jeszcze? Może błąd nie jest przy wypisywaniu tylko przy wczytywaniu. Pokaż jeszcze kod funkcji wpisz. Kiedyś miałem podobny problem, wypisywało mi to co chciałem, a oprócz tego jeszcze jakieś dziwne znaczki i błąd miałem tam, gdzie wczytywałem dane.
komentarz 11 lipca 2015 przez rafalmagician Obywatel (1,320 p.)
edycja 11 lipca 2015 przez rafalmagician

Kod funkcji wpisz:

Z tego co wiem to tu jest wszystko prawidłowo ale mogę się mylić.

A i wypisuje tylko te znaki...

komentarz 11 lipca 2015 przez mrcnsct Nałogowiec (36,390 p.)

NIe jestem pewny, czy poprawnie zrobiłem dwa programy poniżej, i czy dobrze rozumiem to zagadnienie, ale spróbuję pomóc. Przekazałeś strukturę do dwóch funkcji, tj. wpisz i drukuj. W tych funkcjach zrobiona została kopia tej struktury i te dane do niej były wpisywane. Nie wpłynęło to na strukturę z funkcji main(). Aby to działało, należy zadeklarować strukturę, jako globalną i nic nie wysyłać do funkcji wpisz i drukuj (program 1), albo użyć wskaźników i do funkcji wpisz i drukuj przekazać adres struktury (program 2). Nie jestem pewny czy jest to dobrze zrobione, ponieważ sam się dopiero uczę.

Program 1

#include <stdio.h>

struct PRACOWNICY{

    char imie[15];
    char nazwisko[15];
    int pensja;

};

struct PRACOWNICY osoba;

void wpisz(){
    puts("imie");
    scanf("%s",osoba.imie);
    puts("nazwisko");
    scanf("%s",osoba.nazwisko);
    puts("pensja");
    scanf("%d",&osoba.pensja);
}

void drukuj(){
    printf("%s %s %d",osoba.imie,osoba.nazwisko,osoba.pensja);
}

int main(){

    printf("podaj dane pracownika\n");
    wpisz();
    printf("\npracownicy w firmie\n");
    drukuj();

    return 0;
}

Program 2

#include <stdio.h>

struct PRACOWNICY{

    char imie[15];
    char nazwisko[15];
    int pensja;

};

void wpisz(struct PRACOWNICY *osoba){
    printf("imie ");
    scanf("%s",(*osoba).imie);
    printf("nazwisko ");
    scanf("%s",(*osoba).nazwisko);
    puts("pensja");
    scanf("%d",&(*osoba).pensja);
}

void drukuj(struct PRACOWNICY *osoba){
    printf("%s %s %d",(*osoba).imie,(*osoba).nazwisko,(*osoba).pensja);
}

int main(){

    struct PRACOWNICY osoba;

    printf("podaj dane pracownika\n");
    wpisz(&osoba);
    printf("\npracownicy w firmie\n");
    drukuj(&osoba);

    return 0;
}

Na przyszłość nie wklejaj screenów z programów, tylko wklej kod. Podczas tworzenia pytania/odpowiedzi/komentarza masz coś takiego jak code. Kliknij to i tam wklej kod, bo łatwiej kod skopiować niż przepisywać.

komentarz 11 lipca 2015 przez rafalmagician Obywatel (1,320 p.)
Dzięki wielkie za pomoc. Działa ten 2 kod. I zastosuje się do rad następnym razem :)
komentarz 12 lipca 2015 przez rafalmagician Obywatel (1,320 p.)
A może ktoś mi wytłumaczyć jak działa program nr 2 (wyżej) ?? Bo chcę to zrozumieć a nie bezmyślnie przepisać i nic z tego nie wiedzieć :)
komentarz 12 lipca 2015 przez mrcnsct Nałogowiec (36,390 p.)

https://pl.wikibooks.org/wiki/C/Funkcje#Za_pomoc.C4.85_wska.C5.BAnik.C3.B3w_.28parametr.C3.B3w.29

https://pl.wikibooks.org/wiki/C/Wskaźniki#Gdy_argument_jest_wska.C5.BAnikiem...

Jeśli robisz tak: wpisz(osoba) to w funkcji wpisz operujesz tylko na kopii "osoba" i nie zmieni to wartości "osoba" w main. Jeśli zrobisz tak: wpisz(&osoba) to do funkcji wpisz przekazujesz adres "osoba". Przez (*osoba).imie odwołujesz się do wartości pod adresem osoba. Np. x to zmienna wskaźnikowa (int *x, tu * oznacza, że to zmienna wskaźnikowa), wpisujemy do niej adres zmiennej całkowitej a, czyli x=&a, wtedy zmienna wskaźnikowa x zawiera adres zmiennej całkowitej a. Zapis *x oznacza wartość pod adresem który zawiera zmienna x, czyli wartość zmiennej a. Jeśli zmienisz wartość pod adresem zmiennej a to tym samym zmienisz zmienną a. Poczytaj o wskaźnikach to może ci się rozjaśni.

Podobne pytania

0 głosów
1 odpowiedź 916 wizyt
pytanie zadane 21 maja 2017 w C i C++ przez Dooky Początkujący (480 p.)
0 głosów
2 odpowiedzi 947 wizyt
pytanie zadane 24 sierpnia 2018 w C i C++ przez Hrabia_ Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 197 wizyt
pytanie zadane 5 grudnia 2020 w Python przez Miki Bywalec (2,480 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...