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

Nieprawidłowe odwołanie wskaźników do pamięci?

Ostatnio zmodyfikowano 2016-12-07 12:39
Autor Wiadomość
PL_Andrev
Temat założony przez niniejszego użytkownika
Nieprawidłowe odwołanie wskaźników do pamięci?
» 2016-12-06 23:18:13
Witam,

Temat może być mylący, bo nie za bardzo rozumiem zasadę działania programu (wskaźniki).
Próbowałem usunąć wskaźniki (nie zależy mi na szybkości dostępu), ale wtedy, cóż, program nie działa...

Program został żywcem skopiowany z tej strony:
http://edu.pjwstk.edu.pl​/wyklady/pro/scb/PRG2CPP_files​/node104.html

Przy pierwszym uruchomieniu z pierowtnymi danymi uzyskałem zgodne z oczekiwaniami dane (-15 / 15).
Zacząłem więc drobne eksperymenty z poprawianiem kodu, zmianami w kodzie czy zmianom danych wejściowych (p, z1, z2).

(Borland C++ Builder)
C/C++
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 * Form1;

#include <iostream>
using namespace std;

class Zakres;

class Punkt {
    int liczba;
    friend void isInside( const Punkt *, const Zakres * );
public:
    Punkt( int liczba = 0 )
        : liczba( liczba )
    { }
};

class Zakres {
    int lewy, prawy;
    friend void isInside( const Punkt *, const Zakres * );
   
public:
    Zakres( int lewy = 0, int prawy = 0 )
        : lewy( lewy )
         , prawy( prawy )
    { }
};

void isInside( const Punkt * p, const Zakres * z )
{
    int mid;
    mid =(( z->lewy + z->prawy ) / 2 ) - p->liczba;
    ShowMessage( IntToStr( mid ) );
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1( TComponent * Owner )
    : TForm( Owner )
{
    Punkt p( 100 );
    Zakres z1( 0, 100 ), z2( 100, 100 );
    isInside( & p, & z1 ); //<--- tu uwaga wstawienie // przed wywolaniem funkcji dalej daje messagebox -15 (!)
    isInside( & p, & z2 ); //<--- tu uwaga wstawienie // przed wywolaniem funkcji dalej daje messagebox 15 (!)
}
//---------------------------------------------------------------------------

Problem:

Wynik z pierwszego uruchomienia (-15/15) dostaję nie tylko pozmianie parametrów p, z1, z2, ale nawet
po zmianie kodu (wyłączenie wywołania funkcji isInside),
po wyłączeniu C++,
a nawet po resecie komputera (!!!!).

Wynik prawidłowy (w oparciu o nowe dane wejściowe) otrzymuję tylko w przypadku zapisu projektu w innym katalogu, ale zabawa powtarza się na nowo -> zmiana punktu ze 100 na 30 daje takie same wyniki jakby dalej program pamiętał że było 100...

P-154601
mateczek
» 2016-12-07 00:02:27
słowo kluczowe "rebuild all"
P-154602
PL_Andrev
Temat założony przez niniejszego użytkownika
» 2016-12-07 10:36:37
OK, działa - dzięki.

A opcja bez wskaźników jest możliwa?
Próbowałem przebudować funkcję "mid" na kilka sposobów np:
C/C++
mid =(( Zakres::lewy + Zakres::prawy ) / 2 ) - Punkt::liczba;

...ale nie działa (Member Zakres::prawy cannot be used without an Object).
P-154605
j23
» 2016-12-07 11:04:18
Jest możliwa - użyj referencji.

Dlaczego isInside jest funkcją (zaprzyjaźnioną), a nie metodą klasy Zakres?
P-154606
PL_Andrev
Temat założony przez niniejszego użytkownika
» 2016-12-07 12:39:55
Celem było wyciagnięcie niezbędnych danych z klasy Zakres oraz klasy Punkt.
Sugerujesz że byłoby lepiej wyciągnąć interesujące dane poprzez metody do poszczególnych klas?
Metoda 1 -> dane A
Metoda 2 -> dane B
Obliczenia C = f(A,B) w funkcji main?
P-154609
« 1 »
  Strona 1 z 1