Autor Wątek: Funkcja zmieniajaca wartosc zmiennej z funkcji main.  (Przeczytany 4657 razy)

Offline _user

  • Użytkownik

# Maj 11, 2015, 14:59:30
Chce zeby funkcja zmienila wartosci zmiennych zainicjalizowanych w funkcji main i zebym potem te zmienione wartosci mogl wykorzystac w innej funkcji, czytalem ze w takim wypadku uzywa sie & oraz *, a wiec nie wiem dlaczego ten kod nie dziala
Kod: (c) [Zaznacz]
#include<stdio.h>

int podaj(int *pln, int *pld, int *wsch, int *zach, int *wskaz){
  int kier=0,kro=0;
  pln=0,pld=0,wsch=0,zach=0;
  for(int i=0;i<wskaz;++i){
    scanf("%i %i", &kier, &kro);
    if(kier==0)
      *pln+=kro;
    if(kier==1)
      *pld+=kro;
    if(kier==2)
      *wsch+=kro;
    if(kier==3)
      *zach+=kro;
  }
  return 0;
}
int wyswietl(int pln, int pld, int wsch, int zach){
  printf("%i %i %i %i", pln,pld,wsch,zach);
  return 0;
}
 
int main(void){
  int wskazowki=0;
  int pln=0,pld=0,wsch=0,zach=0;
  scanf("%i", &wskazowki);
  podaj(&pln,&pld,&wsch,&zach,wskazowki);
  wyswietl(pln,pld,wsch,zach);
  return 0;
}
« Ostatnia zmiana: Maj 11, 2015, 15:11:17 wysłana przez _user »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline mawpa

  • Użytkownik

  • +1
# Maj 11, 2015, 16:09:49
Kod nie działa, bo:
pln=0,pld=0,wsch=0,zach=0;Ustawiasz wskaźniki na adres 0. Jeśli chcesz zerować zmienne, na które pokazują te wskaźniki, trzeba się posłużyć dereferencją:
*pln = *pld = *wsch = *zach = 0;Poza tym śmiało można zmienić definicję funkcji podaj na taką:
int podaj(int *pln, int *pld, int *wsch, int *zach, int wskaz)


Offline _user

  • Użytkownik

# Maj 11, 2015, 16:20:39
@Rolek - 2 z podanych przez ciebie kursow ukonczylem, pozatym dzieki za pozostale linki, przydadza sie.
@mawpa - nie pomyslalbym ze problem jest tam gdzie zerowalem ze zmienne, zamiast tego szukalem w tabelce z ifami, dzieki.

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Maj 11, 2015, 18:33:28
Cytuj
Chce zeby funkcja zmienila wartosci zmiennych zainicjalizowanych w funkcji main i zebym potem te zmienione wartosci mogl wykorzystac w innej funkcji, czytalem ze w takim wypadku uzywa sie & oraz *, a wiec nie wiem dlaczego ten kod nie dziala

Więc po co się bawisz ze wskaźnikami ("*") zamiast użyć referencji ("&")?

Przykład:

int funkcja(int &zmienna)
{
    zmienna = 777;
}

int main()
{
    int to = 0;
    funkcja(to);
    std::cout << "Zmienna: " << to << std::endl;

    // Za ewentualne literówki przepraszam. ;)

    return 0;
}

Offline Rolek

  • Użytkownik

# Maj 11, 2015, 19:24:36
Więc po co się bawisz ze wskaźnikami ("*") zamiast użyć referencji ("&")?
Bo może pisze w C, a nie C++ ;)

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Maj 11, 2015, 19:49:18
Oj, przepraszam, nie znam się zbyt na C i nie wiedziałem o tej różnicy. ;)

@_user: Jeżeli nikt (nic) Ci tego nie narzuca to przejdź na C++, jest wg. mnie o wiele lepszy na początek niż C - oczywiście sądząc po tych wszystkich różnicach jakie zdążyłem zauważyć...

Offline Cyste

  • Użytkownik

# Maj 11, 2015, 23:39:09
Ja na przykład piszę w C++ a nigdy nie używam referencji.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +3
# Maj 11, 2015, 23:59:15
Ja na przykład piszę w C++ a nigdy nie używam referencji.
No to musisz bardzo mało z tego C++ używać. Przykładowo praktycznie cały STL odpada, bo tam większość rzeczy przekazywana jest przez referencje.

Offline wozix

  • Użytkownik

# Maj 12, 2015, 00:08:52
Oj, przepraszam, nie znam się zbyt na C i nie wiedziałem o tej różnicy. ;)

@_user: Jeżeli nikt (nic) Ci tego nie narzuca to przejdź na C++, jest wg. mnie o wiele lepszy na początek niż C - oczywiście sądząc po tych wszystkich różnicach jakie zdążyłem zauważyć...
Na początek to tak naprawdę jedno licho. Przeciez c++ to z grubsza c z obiektowością.

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Maj 12, 2015, 08:50:48
@up: A std? Cout, cin, itd.? ;)

Offline Xirdus

  • Moderator

# Maj 12, 2015, 09:56:56
@up: A std? Cout, cin, itd.? ;)
To wszystko są obiekty. Generalnie wszystko z biblioteki standardowej co siedzi w namespace std nie jest dostępne w C (bo C nie ma namespace'ów).

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +1
# Maj 12, 2015, 12:34:49
Cytuj
@up: A std? Cout, cin, itd.? ;)
Powiem szczerze, że cout/cin to ja chyba jeszcze nigdy nie użyłem. :) Zawsze był printf, a od dłuższego już czasu doszedł mi własny wrapper na vsnprintf w postaci format(fmt,...). :) Z coutem zawsze jest za dużo roboty żeby coś sformatowac dokładnie tak jak się chce, a scanf/cin do żadnego poważniejszego parsowania wejścia jak dla mnie się nie nadają (w sumie podobnie jak całe standardowe wejście - chyba że pisze się commandlinowe toole konkretnie do przetwarzania tekstu). :)

Cytuj
Generalnie wszystko z biblioteki standardowej co siedzi w namespace std nie jest dostępne w C (bo C nie ma namespace'ów).
A nie do końca prawda. Przykładowo taki std::printf z biblioteki standardowej C++ jest dostępny w C i C++ jako zwykły printf, tylko w innym nagłówku. Podobnie jak całość tej części biblioteki standardowej, którą C++ odziedziczył po C.

Offline draghan

  • Użytkownik

  • +1
# Maj 12, 2015, 12:39:17
Plus są jeszcze inne drobne różnice w "polityce zachowania" programu, na które trzeba zwrócić uwagę.
Ja uczyłem się programowania na C++, na studiach każą mi pisać w czystym C, w dodatku w standardzie C89.
Nie można dostać się do przesłoniętych zmiennych, na przykład. Nie ma zmiennych logicznych. Referencje odpadają. To tylko pierwsze, co mi do głowy przyszło, na pewno można wskazać więcej takich znaczących drobnostek. Trochę się trzeba namęczyć, żeby przesiąść się z wygodniejszego C++ na C. :D

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +1
# Maj 12, 2015, 13:14:40
Cytuj
Nie ma zmiennych logicznych.
Kiedyś nie było. Teraz już są.