mój program do nauki wskaźników

Odpowiedz Nowy wątek
2011-09-15 12:07

Rejestracja: 9 lat temu

Ostatnio: 1 rok temu

0

wynik działania programu:

user image

 // wskazniki3.cpp by rewertyn: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <conio.h> 
#include <iostream>
#include <windows.h>

//http://www.egrafik.pl/kurs-c-plus-plus/8.1.php
//http://www.egrafik.pl/kurs-c-plus-plus/8.3.php
//http://technet.microsoft.com/pl-pl/library/zarzadzanie-pamiecia-w-32-i-64-bitowych-systemach-windows-cz-2.aspx

using namespace std;
void (__cdecl funkcja1)(int* zmienna3);

int _tmain(int argc, _TCHAR* argv[])
{
    int zmienna1=0;
    zmienna1=-21;

    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

    cout<<"test"<<endl;
    cout<<"w main()"<<endl;
    //cout<<"*zmienna1=";
    SetConsoleTextAttribute(hConsole, 3);   
    //cout<<*zmienna1;
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<"&zmienna1=";
    SetConsoleTextAttribute(hConsole, 5);   
    cout<<&zmienna1;//wyswietli adres
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<" zmienna1=";
    SetConsoleTextAttribute(hConsole, 11);  
    cout<<zmienna1<<endl;//wyswietli liczbe = -21
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<"wywolanie funkcji: funkcja1(&zmienna1);"<<endl;

    funkcja1(&zmienna1);////////////

    cout<<"znowu w main()"<<endl;
    //cout<<"*zmienna1=";
    SetConsoleTextAttribute(hConsole, 3);   
    //cout<<*zmienna1;
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<"&zmienna1=";
    SetConsoleTextAttribute(hConsole, 5);   
    cout<<&zmienna1;//wyswietli adres
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<" zmienna1=";
    SetConsoleTextAttribute(hConsole, 11);  
    cout<<zmienna1<<endl;//wyswietli liczbe = -12
    SetConsoleTextAttribute(hConsole, 7);   
    system("pause");
    return 0;
}// koniec tmain
//////
void (__cdecl funkcja1)(int* zmienna3)
{
    cout<<"w funkcji: funkcja1(int* zmienna3)"<<endl;
    cout<<"przed zamiana wartosci zmiennej"<<endl;
    HANDLE  hConsole2;
    hConsole2 = GetStdHandle(STD_OUTPUT_HANDLE); 
    cout<<"*zmienna3=";
    SetConsoleTextAttribute(hConsole2, 11);     
    cout<<*zmienna3;//wyswietli liczbe = -21
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<" &zmienna3=";
    SetConsoleTextAttribute(hConsole2, 15);     
    cout<<&zmienna3;//wyswietli adres wskaznika
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<" zmienna3=";
    SetConsoleTextAttribute(hConsole2, 5);  
    cout<<zmienna3<<endl;//wyswietli adres
    SetConsoleTextAttribute(hConsole2, 7); 

    *zmienna3=-12;//////////////

    cout<<"po zamiana wartosci zmiennej"<<endl;
    cout<<"*zmienna3=";
    SetConsoleTextAttribute(hConsole2, 11);     
    cout<<*zmienna3;//wyswietli liczbe = -12
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<" &zmienna3=";
    SetConsoleTextAttribute(hConsole2, 15);     
    cout<<&zmienna3;//wyswietli adres wskaznika
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<" zmienna3=";
    SetConsoleTextAttribute(hConsole2, 5);  
    cout<<zmienna3<<endl;//wyswietli adres
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<"wyjscie z funkcji: funkcja1(int* zmienna3)"<<endl;
    }
//////
edytowany 1x, ostatnio: rewertyn, 2011-09-15 12:10
poniżej kilka postów jest jeszcze wersja do przeanalizowania - rewertyn 2011-09-15 12:53

Pozostało 580 znaków

Kumashiro
2011-09-15 12:22
Kumashiro
0

Jak na pomoc naukową do opanowywania wskaźników, wszystkie te wywołania SetConsoleTextAttribute() tylko sprawiają, że kod jest absolutnie nieczytelny. Jeśli ktoś chciałby zobaczyć w jaki sposób coś powstało, musiałby się przebijać przez masę zbędnych linii. Przydałaby się także arytmetyka na wskaźnikach, bo to ona jest największą zaletą oraz sprawia najwięcej problemów początkującym (i jest świetnym generatorem błędów, ale to tak na marginesie).

Pozostało 580 znaków

2011-09-15 12:31

Rejestracja: 9 lat temu

Ostatnio: 1 rok temu

0

http://www.image-share.com/ipng-937-224.html

user image

wywołania SetConsoleTextAttribute(hConsole2, 7); zmieniają kolory wypisywanych wartości zmiennych potem jest ustawiony kolor domyślny do wypisania textu jak sie zmienna nazywa której wartośc jest wypisywana na ekranie , jeszcze dodałem linijkę zaablokowaną :
// wypisanie na ekran: cout<<"zmienna3="<<zmienna3;<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;

// wskazniki3.cpp by rewertyn: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <windows.h>

//http://www.egrafik.pl/kurs-c-plus-plus/8.1.php
//http://www.egrafik.pl/kurs-c-plus-plus/8.3.php
//http://technet.microsoft.com/pl-pl/library/zarzadzanie-pamiecia-w-32-i-64-bitowych-systemach-windows-cz-2.aspx

using namespace std;
void (__cdecl funkcja1)(int* zmienna3);
void (__cdecl wypisz_na_ekran)(char* str,int i,int j);
void (__cdecl wypisz_na_ekran)(int str,int i,int j);
void (__cdecl wypisz_na_ekran)(int* str,int i,int j);

int _tmain(int argc, _TCHAR* argv[])
{
    int zmienna1=0;
    zmienna1=-21;

    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 
    cout<<"test"<<endl;
    cout<<"w main()"<<endl;
    //wypisz_na_ekran("*zmienna1=",7,7); 
    //wypisz_na_ekran(*zmienna1,3,7); 
    wypisz_na_ekran("&zmienna1=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(&zmienna1,5,7); //wyswietli adres
    wypisz_na_ekran("zmienna1=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(zmienna1,11,7);  //wyswietli liczbe = -21
    cout<<endl; 
    cout<<"wywolanie funkcji: funkcja1(&zmienna1);"<<endl;

    funkcja1(&zmienna1);////////////

    cout<<"znowu w main()"<<endl;
    //wypisz_na_ekran("*zmienna1=",7,7); 
    //wypisz_na_ekran(*zmienna1,3,7); 
    wypisz_na_ekran("&zmienna1=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(&zmienna1,5,7); //wyswietli adres
    wypisz_na_ekran("zmienna1=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(zmienna1,11,7);  //wyswietli liczbe = -12
    cout<<endl; 
    system("pause");
    return 0;
}// koniec tmain
//////
void (__cdecl funkcja1)(int* zmienna3)
{
    cout<<"w funkcji: funkcja1(int* zmienna3)"<<endl;
    cout<<"przed zamiana wartosci zmiennej"<<endl;
    // wypisanie w kolorach na ekran: cout<<"*zmienna3="<<*zmienna3<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;
    wypisz_na_ekran("*zmienna3=",7,7);//7=kolor domyslny  
    wypisz_na_ekran(*zmienna3,11,7);  //wyswietli liczbe = -21
    wypisz_na_ekran("&zmienna3=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(reinterpret_cast<int*>(&zmienna3),15,7); //wyswietli adres
    wypisz_na_ekran("zmienna3=",7,7);//7=kolor domyslny 
    cout<<hex;
    wypisz_na_ekran(zmienna3,5,7); //wyswietli adres
    cout<<dec;
    cout<<endl; 

    *zmienna3=-12;//////////////

    cout<<"po zamiana wartosci zmiennej"<<endl;
    // wypisanie w kolorach na ekran: cout<<"*zmienna3="<<*zmienna3<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;
    wypisz_na_ekran("*zmienna3=",7,7);//7=kolor domyslny  
    wypisz_na_ekran(*zmienna3,11,7);  //wyswietli liczbe = -12
    wypisz_na_ekran("&zmienna3=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(reinterpret_cast<int*>(&zmienna3),15,7); //wyswietli adres
    wypisz_na_ekran("zmienna3=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(zmienna3,5,7); //wyswietli adres
    cout<<endl; 
    cout<<"wyjscie z funkcji: funkcja1(int* zmienna3)"<<endl;
    }
//////
void (__cdecl wypisz_na_ekran)(char* str,int i,int j)
{
    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, i);
    cout<<str;
    SetConsoleTextAttribute(hConsole, j);   
}
//////
void (__cdecl wypisz_na_ekran)(int str,int i,int j)
{
    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, i);
    cout<<str;
    SetConsoleTextAttribute(hConsole, j);   
}
//////
void (__cdecl wypisz_na_ekran)(int* str,int i,int j)
{
    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, i);
    cout<<str;
    SetConsoleTextAttribute(hConsole, j);   
}

kod programu do przeanalizowania:


// wskazniki3.cpp by rewertyn: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <conio.h> 
#include <iostream>
#include <windows.h>

//http://www.egrafik.pl/kurs-c-plus-plus/8.1.php
//http://www.egrafik.pl/kurs-c-plus-plus/8.3.php
//http://technet.microsoft.com/pl-pl/library/zarzadzanie-pamiecia-w-32-i-64-bitowych-systemach-windows-cz-2.aspx

using namespace std;
void (__cdecl funkcja1)(int* zmienna3);

int _tmain(int argc, _TCHAR* argv[])
{
    int zmienna1=0;
    zmienna1=-21;

    cout<<"test"<<endl;
    cout<<"w main()"<<endl;
    cout<<" &zmienna1="<<&zmienna1<<" zmienna1="<<zmienna1<<endl;
    cout<<"wywolanie funkcji: funkcja1(&zmienna1);"<<endl;

    funkcja1(&zmienna1);////////////

    cout<<"znowu w main()"<<endl;
    cout<<" &zmienna1="<<&zmienna1<<" zmienna1="<<zmienna1<<endl;
    system("pause");
    return 0;
}// koniec tmain
//////
void (__cdecl funkcja1)(int* zmienna3)
{
    cout<<"w funkcji: funkcja1(int* zmienna3)"<<endl;
    cout<<"przed zamiana wartosci zmiennej"<<endl;
    cout<<"*zmienna3="<<*zmienna3<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;

    *zmienna3=-12;//////////////

    cout<<"po zamiana wartosci zmiennej"<<endl;
    cout<<"*zmienna3="<<*zmienna3<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;
    cout<<"wyjscie z funkcji: funkcja1(int* zmienna3)"<<endl;
    }
//////
edytowany 12x, ostatnio: rewertyn, 2011-09-20 15:31

Pozostało 580 znaków

2011-09-15 12:40

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

równie czytelny kod, albo nawet czytelniejszy można uzyskać dzięki znacznikom '\t' i '\n'. A co tak właściwie tutaj potrzebujesz żeby Ci pomóc?


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-09-15 12:43

Rejestracja: 9 lat temu

Ostatnio: 1 rok temu

0

nie potrzebuję program działa dobrze

Pozostało 580 znaków

Tomasz_kat
2011-09-15 12:51
Tomasz_kat
0

Dołączanie "windows.h" do takiego programu, to śmiech na sali...

Pozostało 580 znaków

Kumashiro
2011-09-15 12:56
Kumashiro
0

Możesz też stworzyć funkcje, które będą Ci drukowały tekst w określonych kolorach. Np.:

funkcja WydrukujWskaźnik(wartość):
    Wydrukuj("Opis");
    ZmieńKolorNaOczojebnyRóż();
    Wydrukuj(wartość);
    PrzywróćKolorStandardowy();

funkcja WydrukujLiczbę(liczba):
    Wydrukuj("Opis");
    ZmieńKolorNaHawajskaZatokaPoLipcowymDeszczu();
    Wydrukuj(liczba);
    PrzywróćKolorStandardowy();

Czytelność kodu nie będzie idealna, ale znacznie lepsza.

Pozostało 580 znaków

2011-09-15 12:59

Rejestracja: 9 lat temu

Ostatnio: 1 rok temu

0

dobry pomysł

Pozostało 580 znaków

Kumashiro
2011-09-15 13:18
Kumashiro
0

Jeśli chcesz zrobić coś naprawdę wyczesanego, mam dla Ciebie taką propozycję. Zadaniem tego programu jest pomóc w nauce używania wskaźników (jak sądzę), a przy tego typu szkoleniach świetną pomocą jest zobrazowanie (na jakimś poziomie abstrakcji) jak to mniej więcej wygląda w pamięci. W trybie tekstowym musiałbyś to zrobić na semigrafikach, co jest dość trudne, ale możliwe. Np. zobrazowanie wskaźnika na char (z podstawieniem rzeczywistych wartości! poniżej są przykładowe):

0x0043F8C8       0x0043F8CC                       0x0043F948
 .....+---+---+---+---+.....                       .....+------------------+.....
      | A | l | a |\0 |                                 |    0x0043F8C8    |
 .....+---+---+---+---+.....                       .....+------------------+.....
        ^                                                         |
        |                                                         |
        +---------------------------------------------------------+

Do tego arytmetyka, iterakcja, podział na tematy i masz ciekawy program.

Pozostało 580 znaków

2011-09-15 18:26

Rejestracja: 9 lat temu

Ostatnio: 1 rok temu

0

tutaj są wykorzystane wszystkie możliwe kombinacje:

// wskazniki3.cpp by rewertyn: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <windows.h>

//http://www.egrafik.pl/kurs-c-plus-plus/8.1.php
//http://www.egrafik.pl/kurs-c-plus-plus/8.3.php
//http://technet.microsoft.com/pl-pl/library/zarzadzanie-pamiecia-w-32-i-64-bitowych-systemach-windows-cz-2.aspx

using namespace std;

void (__cdecl wypisz_na_ekran)(int &str,int i,int j);
void (__cdecl wypisz_na_ekran2)(int str,int i,int j);
void (__cdecl wypisz_na_ekran3)(int* str,int i,int j);

int _tmain(int argc, _TCHAR* argv[])
{
    int zmienna1=0,zmienna2=0,zmienna3=0,&zmienna11=zmienna1;
    zmienna1=-21;

    cout<<"test"<<endl;
    cout<<"w main()"<<endl;
    cout<<"&zmienna1= "<<&zmienna1<<" zmienna1= "<<zmienna1<<endl;
    wypisz_na_ekran(zmienna1,5,7);
    wypisz_na_ekran2(reinterpret_cast<int>(&zmienna1),4,7);
    wypisz_na_ekran3(&zmienna1,3,7);
    cout<<"&zmienna1= "<<&zmienna1<<" zmienna1= "<<zmienna1<<endl;
    int &zmienna4=zmienna1;//robi kopię zmiennej 1 w zmiennej 4
    zmienna4=-11;
    cout<<"&zmienna1= "<<&zmienna1<<" zmienna1= "<<zmienna1<<endl;
    cout<<"&zmienna4= "<<&zmienna4<<" zmienna4= "<<zmienna4<<endl;

    system("pause");
    return 0;
}// koniec tmain
//////
void (__cdecl wypisz_na_ekran)(int &str,int i,int j)
{
        HANDLE  hConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, i);
        cout<<"&str ="<<&str<<" str ="<<str<<endl;
        str=str-4;  
        cout<<"&str ="<<&str<<" str ="<<str<<endl;
        SetConsoleTextAttribute(hConsole, j);         
}
//////
void (__cdecl wypisz_na_ekran2)(int str,int i,int j)
{
        HANDLE  hConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, i);
        cout<<"&str2 ="<<&str<<" str2 ="<<hex<<str<<dec<<endl;
        str=str-40; // minus 40 adresow int
        cout<<"&str2 ="<<&str<<" str2 ="<<hex<<str<<dec<<endl;
        SetConsoleTextAttribute(hConsole, j);         
}
//////
void (__cdecl wypisz_na_ekran3)(int* str,int i,int j)
{
        HANDLE  hConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, i);
        cout<<"&str3 ="<<&str<<" str3 ="<<hex<<str<<dec<<endl;
        //str=str-4;    
        cout<<"&str3 ="<<&str<<" str3 ="<<hex<<str<<dec<<endl;
        SetConsoleTextAttribute(hConsole, j);         
}
edytowany 1x, ostatnio: rewertyn, 2011-09-15 18:29

Pozostało 580 znaków

2011-09-15 18:29

Rejestracja: 10 lat temu

Ostatnio: 8 lat temu

0

Tylko po cholerę komu TAKI program?

Jak nie umiesz wskaźników to idziesz do kompedium wiedzy nie na forum.
Wydaje mi się że temat do usunięcia.

Skoro chcesz pomagać innym, masz od tego kompedium wiedzy.


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0