Metoda łącząca łańcuchy zwraca śmieci.

Metoda łącząca łańcuchy zwraca śmieci.
MN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Zapewne mój problem bierze się z jakiegoś głupiego błędu, ale niestety nie potrafię go usunąć. Mianowicie, potrzebuję stworzyć w klasie Data metodę WyswietlDate, która ma za zadanie połączyć pola Dzien, "-", Miesiac, "-" i Rok, a potem zwrócić je.

Treść metody napisanej przeze mnie:

Kopiuj
char *WyswielDate() const
{
	char dzien[3], miesiac[3], rok[5], data[20];

	_itoa_s(Dzien, dzien, 10); strcpy_s(data, dzien); strcat_s(data, "-");
	_itoa_s(Miesiac, miesiac, 10); strcat_s(data, miesiac); strcat_s(data, "-");
	_itoa_s(Rok, rok, 10); strcat_s(data, rok);

	return data;
}

Gdy wyświetlam w tej metodzie wartość zmiennej data to działa ona właściwie, ale gdy wywołuję metodę z programu to wysypują się z niej śmieci.

Wywołanie:

Kopiuj
data = new Data(st.wDay, st.wMonth, st.wYear);
cout<<data->WyswielDate();

Z góry dziękuję za wszelką pomoc.

//edit:

Dzien, Miesiac i Rok to pola typu unsigned int.

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
0

Nie bardzo wiem co kombinujesz bo darowalem sobie czytanie tego, ale tak sie laczy napisy:
http://ideone.com/AiOGQg
Kilka uwag jeszcze dopisze:

  • styl, w ktorym to jest napisane jest ogolnie przyjetym stylem powodujacym bledy (zwracanie nie statycznej tablicy na stosie)
  • liste parametrow jakie moze ta funkcja przyjmowac (co moze wrzucac do bufora) znajdziesz w dokumentacji printfa (bodajze przy sprintf jest odnosnik)
  • nie zadziala (nie powinno w normalnym jezyku) jesli nie przekazesz wyniku bezposrednio do innej funkcji (a i to nie jest pewne rozwiazanie)
  • na twoim miejscu pierwsze co mi przychodzi do glowy to bufer przesylac jako argument funkcji (argument-wynik) i do niego ladowac wydobyty string
  • jeszcze jedno rozwiazanie, zacznij uzywac C++ (bo to wbrew pozorom nie jest C z coutem)
fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0
Kopiuj
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string data = "";
    ostringstream oss;

    int dzien = 10;
    int miesiac = 10;
    int rok = 2010;

    oss << dzien << "-" << miesiac << "-" << rok;
    data = oss.str();
    cout << data;
    return 0;
}
 
MN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Po wprowadzeniu poprawek na podstawie kodu od n0name_l uzyskałem coś takiego:

Kopiuj
class Data
{
	unsigned int Dzien, Miesiac, Rok;

...

	char *WyswielDate()
	{
		char data[11];
	
		sprintf_s(data, "%d-%d-%d", Dzien, Miesiac, Rok);

		cout<<data;	// <- TUTAJ DATA WYŚWIETLA SIĘ DOBRZE

		return data;
	}
}

A po wywołaniu:

Kopiuj
data = new Data(st.wDay, st.wMonth, st.wYear);
cout<<data->WyswielDate();

pojawia się:
921857257518658abe8076.png

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
1

poczytaj o zasięgu zmiennych. Używasz czegoś, czego już nie ma (w main)

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
1

Nastepnym razem czytaj (albo mysl) co masz zrobic.
http://ideone.com/x7Wot8
http://ideone.com/ARPRiT
http://ideone.com/Uu7ICm
najladniejsze ostatnie.

MN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Dziękuję wszystkim za pomoc, już działa :)

Mam jeszcze jedno pytanie. Nie będę zakładał osobnego tematu dla takiej pierdółki...

Potrzebuję stworzyć pętlę w której program będzie wyświetlał menu i czekał minutę na reakcję użytkownika. Jeśli użytkownik w ciągu minuty naciśnie jakikolwiek klawisz to czas zatrzyma się i będą wykonywane dalsze operacje, a jeśli nie naciśnie to dalsza część kodu będzie pominięta, pętla zostanie ponownie wykonana, a czas zacznie się odliczać od nowa. W jaki sposób coś takiego wykonać? O ile w ogóle coś takiego można wykonać...

MN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Dzięki za nazwy funkcji :-)

Napisałem coś takiego:

Kopiuj
while(true)
{
	cout<<"1. Opcja 1"<<endl
		<<"2. Opcja 2"<<endl
		<<"3. Opcja 3"<<endl
		<<"Wybor: ";

	Sleep(1000);

	if(_kbhit())
	{
		c = _getch();
		cout<<"Wybrales "<<c;
	}
}

Teoretycznie działa dobrze, ale jest z tym kodem jeden problem. Mianowicie, po wciśnięciu jakiegoś przycisku nie pojawia on się od razu tylko trzeba czekać aż minie czas aby akcja została wykonana. Teraz to nie problem ale w projekcie który robię muszę to zastosować z opóźnieniem w okolicach kilku minut...

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
1
Kopiuj
wyswietl menu
wlacz licznik_czasu
petla:
    jezeli licznik_czasu > 1 minuta
        zrestartuj licznik_czasu
        kontynuuj
    jezeli kbhit()
        wylacz licznik_czasu
        przerwij

dalsze instrukcje

Cos takiego w najprostszej formie.

Kopiuj
time_t start, now;
start = time(NULL)
while(true)
{
    now = time(NULL);
    if(difftime(now, start) > 60.0)
    {
        start = time(NULL);
        continue;
    }
    if(kbhit())
        break;
}

// dalsze instrukcje
MN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Wielki dzięki, przerobiłem trochę Twój kod i wszystko śmiga. Masz u mnie wielkie piwo :-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.