CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Nie widzi zmiennej

Nie widzi zmiennej

dział ogólny

Nie widzi zmiennej

Nowy postprzez tomass » poniedziałek, 21 lutego 2011, 19:53

KOD cpp:     UKRYJ  
#include <iostream>
#include <conio.h>
#include <string>

void game(void);

int main()
{
std::cout << "tekst" << std::endl;
system("pause>nul");
system("cls");
game();
_getch();
}

void game(void)
{
char ruch;
static int znak;
std::cout << "Gra w konsoli !" << std::endl;
do {
ruch = _getch();
if (ruch == 'w' || ruch == 'W')
{
std::cout << "tekst" << std::endl;
static int znak = 1;
}
std::cout << (char) (znak);

} while (0 == 0);
}
 


Noi mam pytanie co zrobić by w if można było zadeklarować że znak to 1, a poza if wiedziało o tym jest nato jakiś sposob ?
Avatar użytkownika
tomass
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): czwartek, 23 grudnia 2010, 18:46
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows
Kompilator: visual c++ 2008
SKYPE: byakuyaPL
Gadu Gadu: 9698486
    Windows 7Firefox

Re: Nie widzi zmiennej

Nowy postprzez polymorphism » poniedziałek, 21 lutego 2011, 21:42

  1. zacznij używać interpunkcji.
  2. kod wstawiaj w znaczniki CPP a nie CODE.
  3. formatuj kod.
  4. wewnątrz bloku if definiujesz nową zmienną znak, która przysłania tą zdefiniowaną wcześniej, dlatego nie widać różnicy. Usuń definicję, zostaw przypisanie.
  5. dobrze by było jakbyś zajrzał do jakiejś książki, bo to, o co pytasz, to postawy podstaw.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Nie widzi zmiennej

Nowy postprzez tomass » wtorek, 22 lutego 2011, 14:30

wewnątrz bloku if definiujesz nową zmienną znak, która przysłania tą zdefiniowaną wcześniej, dlatego nie widać różnicy. Usuń definicję, zostaw przypisanie.


tzn ?
Avatar użytkownika
tomass
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): czwartek, 23 grudnia 2010, 18:46
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows
Kompilator: visual c++ 2008
SKYPE: byakuyaPL
Gadu Gadu: 9698486
    Windows 7Firefox

Re: Nie widzi zmiennej

Nowy postprzez polymorphism » wtorek, 22 lutego 2011, 14:37

KOD cpp:     UKRYJ  
static int znak;

...

if (...)
{
        ...
        static int znak = 1; //<--- definiujesz nową zmienną o tej samej nazwie co ta zdefiniowana wyżej. Po co?
}
 
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Nie widzi zmiennej

Nowy postprzez Cyfrowy Baron » wtorek, 22 lutego 2011, 15:23

Tutaj trzeba dokładniej opisać problem, gdyż tomass najwyraźniej ma niewielkie pojecie o zmiennych.

Jeżeli deklarujesz jakąś zmienną wewnątrz funkcji lub zdarzenia (zdarzenie to też funkcja) to taka zmienna istnieje tylko wewnątrz tej funkcji i można jej używać tylko wewnątrz tejże funkcji.
Jeżeli zadeklarujesz zmienną jako prywatną w pliku nagłówkowym np. Unit1.h w sekcji private lub jako publiczną w sekcji public pliku nagłówkowego to taka zmienna jest dostępna dla wszystkich metod klasy w której została zadeklarowana. W przypadku aplikacji konsolowej mamy jednak do czynienia ze zmiennymi lokalnymi deklarowanymi wewnątrz funkcji main dostępnymi tylko wewnątrz tej funkcji lub ze zmiennymi globalnymi deklarowanymi poza funkcją main i jakąkolwiek inną funkcją. Zmienne globalne są dostępne dla wszystkich funkcji.

KOD cpp:     UKRYJ  
int zmienna_A; // zmienna globalna

int main(void)
{

 int zmienna_B; // zmienna lokalna

}
Jeżeli zmienna globalna i zmienna lokalna mają identyczne nazwy to zmienna lokalna zawsze przesłoni zmienną globalną, czyli program będzie używał zawsze zmiennej lokalnej, chyba, że nie będzie widział zmiennej lokalnej, wtedy użyje zmiennej globalne. Przysłanianie działa tylko wtedy gdy zmienne mają te same nazwy.

Podobnie jest w przypadku warunków if i wszelkich pętli np. for; while; itp. Jeżeli deklarujesz wewnątrz jakiejś funkcji zmienną lokalną, a następnie wewnątrz tejże funkcji tworzysz warunek i w tym warunku również definiujesz zmienną lokalną o identycznej nazwie, to zmienna wewnątrz warunku przesłoni zmienną będącą poza warunkiem. Co wtedy? Zmienna lokalna zdefiniowana wewnątrz warunku jest dostępna tylko wewnątrz tego warunku, poza nim już nie istnieje. Mimo iż te dwie zmienne mają identyczne nazwy, to są to dwie różne zmienne, równie dobrze mógłbyś im nadać różne nazwy. Te zmienne nie komunikują się między sobą. Dlatego Twój kod powinien wyglądać tak:

KOD cpp:     UKRYJ  
using namespace std;

/*     [...]                 */
void game(void)
{
  char ruch;
  static int znak; /* zmienna lokalna */

  cout << "Gra w konsoli !" << endl;

  while(1)
  {
    ruch = getch();

    if( ruch == 'w' || ruch == 'W' )
    {
      std::cout << "tekst" << std::endl;
      znak = 1;  /* używam zmiennej lokalnej deklarowanej poza warunkiem i pętlą */
    }

    cout << znak << endl;
  }
}


Zmienna statyczna zachowuje się tak jak zmienna globalna, z tą różnicą, że jest dostępna tylko wewnątrz funkcji w której została zdefiniowana, ale podobnie jak zmienna globalna przechowuje przypisaną wartość tak długo jak długo nie zostanie jej przypisana nowa wartość.



Kod: Zaznacz cały
while (0 == 0);


Co to niby ma być?



Zapoznaj się z tum wątkiem: http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=1197&hilit&start=30#p8295
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości