Wskaźniki - nadpisanie wartości?

0

Cześć, siema.

Mam taki problem z dwoma wskaźnikami:

int *currentLang;
int *tmpLang;

*currentLang = 1;
*tmpLang = 1;

cout << *currentLang << endl << *tmpLang;

*tmpLang = 2;

cout << *currentLang << endl << *tmpLang;

Za pierwszym razem pokazuje: 1, 1
Za drugim razem: 2, 2

Chciałbym prosić Was o wytłumaczenie błędu i naprowadzić na sposób naprawy problemu.
Pozdrawiam ;P

PS. Na celu mam, aby currentLang zawierało 1, a tmpLang 2.

3

To co robisz w ogóle jest niepoprawne i może dać losowe wyniki. Stworzyłeś wskaźnik który pokazuje cholera wie gdzie w pamięci a potem próbujesz wpisać tam jakieś wartości. W optymistycznej wersji dostaniesz wyniki z d**y. W pesymistycznej program sie od razu wysypie.

0
    int z1,z2;
    int *currentLang;
    int *tmpLang;
    currentLang = &z1;
    tmpLang  = &z2;
    
    *currentLang = 1;
    *tmpLang = 1;
 
    cout << *currentLang << *tmpLang << endl;
 
    *tmpLang = 2;
 
    cout << *currentLang << *tmpLang << endl; 

Wskaźniki to raczej są do wskazywania jakiegoś miejsca, czyli jak wyżej currentLang wskazuje adres z1 tmpLang wskazuje adres z2. Nie przypisałeś adresu do wskaźnika :)

0

Dobra, dzięki za wytłumaczenie, lecz myślałem, że prostym przykładem zrozumiem swój błąd.. jednak nadal coś jest nie tak :P

Tutaj jest ten prawidłowy kod, który mi się rozwala:

void loadSettings()
{
	ifstream file("game.dat", ios::binary);

	if (file.good())
	{
		char *temp = new char[sizeof(int)];

		file.read(temp, sizeof(int));
		currentLang = (int*)(temp);
		tmpLang = (int*)(temp);

	        if (*currentLang == LANG_PL) *tmpLang = LANG_PL;
		else if (*currentLang == LANG_ENG) *tmpLang = LANG_ENG;

		file.close();
	}
	else
	{
		*currentLang = LANG_PL;
                *tmpLang = LANG_PL;
	}
}

Gdzie popełniłem błąd?

0

na pierwszy rzut oka nie widac tutaj bledu (ten sizeof(int) wydaje sie troche dziwny... ale zalezy co robisz, tak samo nie wiadomo czym dokladnie jest currentLang i dlaczego rzutujesz...). Ale ogolnie to co robisz to nie jest C++ sposob

w C++ robisz na takiej zasadzie

#include <fstream>
#include <iterator>
#include <algorithm>

int main()
{
    std::ifstream input( "C:\\Final.gif", std::ios::binary );
    std::ofstream output( "C:\\myfile.gif", std::ios::binary );

    std::copy( 
        std::istreambuf_iterator<char>(input), 
        std::istreambuf_iterator<char>( ),
        std::ostreambuf_iterator<char>(output));
} 

a jezeli potrzebujesz to gdzies zapisac (do zmiennej) to polecam std::vector

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
    std::ifstream input( "C:\\Final.gif", std::ios::binary );
    // copies all data into buffer
    std::vector<char> buffer((
            std::istreambuf_iterator<char>(input)), 
            (std::istreambuf_iterator<char>()));
} 
0
int currentLang,tmpLang;

void loadSettings()
  {
   ifstream file("game.dat",ios::binary);
   if(file) file.read((char*)&currentLang,sizeof(currentLang));
   else currentLang=LANG_PL;
   tmpLang=currentLang;
  } // file.close(); - sam się zamknie w destruktorze
0

Prawdopodobnie to naprawiłem.

Zmieniłem na to:

char *temp = new char[sizeof(int)];

file.read((char*)temp, sizeof(int));
currentLang = (int*)(&temp);
tmpLang = (int*)(&temp);

Mogę Was prosić o zweryfikowanie?
U mnie program wypisuje poprawne wartości, a adresy currentLang i tmpLang są już inne. Zmiana jednego nie oznacza zmiany drugiego.

1
TurboMen napisał(a):

Zmieniłem na to

  • Po kiego ci te wskaźniki *Lang skoro potrzebujesz wartości?
  • Po kiego ci bufor w postaci tablicy char, skoro możesz odczytać bezpośrednio do jednego ze swoich *Lang?
    <quote="1204229">
file.read((char*)temp, sizeof(int)); // po kiego konwertujesz char* na char* ?
currentLang = (int*)(&temp); // pobierasz adres wskaźnika temp w pamięci, zdecydowanie nie to co odczytałeś.

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