[C++] nieznany błąd przy debugowaniu

Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] nieznany błąd przy debugowaniu

Post autor: Transatlantyk »

witam, w skrócie mam do napisania program, który z pliku wejsciowego podanego z lini polecen do wyjsciowego podanego w ten sam spoób. funkcja szukaj ma konczyć program, zna juz obydwa pliku, caly program kompiluje mi sie poprawnie oprócz jednego bledu w tej funkcji który odnosi się do pierwszego nawiasu klamrowego

Kod: Zaznacz cały

{
		cout << "Plik wejsciowy zawiera   " << dw << "  dwuznakow, natomiast " << z << " znakow";
	}
a brzmi:

Kod: Zaznacz cały

Severity	Code	Description	Project	File	Line	Suppression State
Error	C2784	'std::basic_ostream<_Elem,_Traits> &std::operator <<(std::basic_ostream<_Elem,_Traits> &&,const _Ty &)': could not deduce template argument for 'std::basic_ostream<_Elem,_Traits> &&' from 'std::string'	ConsoleApplication2	e:\agatka\visual studio 2015\projects\dwuznak\consoleapplication2\consoleapplication2.cpp	173	

Kod: Zaznacz cały

void szukaj(string wejscie, string wyjscie)
{
	ifstream plik;
	plik.open(wejscie, ios::out);
    int dw, z;
	int u;
	string dane;
	plik.seekg(0, ios::cur);
	getline(plik, dane);
	u = dane.length();
	char** textline = new char*[];
	char*taba = new char[46];
	taba[0 - 22] = { 'a' - 'z', };
	taba[23 - 46] = { 'A' - 'Z' };
	char dwuznak[16] = { 'cz','rz','ch','sz','dz','si','ni','zi','Cz','Rz','Sz','Dz','Si','Ni','Zi' };
	do
	{
		getline(plik, dane);
		u = dane.length();
		for (int n = 0; n < u; n++)
		{
			for (int j = 0; j < 46; j++)
			{
				if (*textline[n] == taba[j])
				{
					z++;
				}
			}

			for (int k = 0; k < 16; k++)
			{
				if ((*textline[n] + *textline[n + 1]) == dwuznak[k]) { dw++; }
			}
		}
		delete[] textline, taba, dwuznak;
	}
	while (!plik.eof());
	plik.close();
	ofstream plik;
    plik.open(wyjscie, ios::in);
	string wypiszwynik(const int  &dw, const int &z)
	{
		cout << "Plik wejsciowy zawiera   " << dw << "  dwuznakow, natomiast " << z << " znakow";
	}
	
	wyjscie << wypiszwynik;
}

pomocy!!!!!!!
Ostatnio zmieniony 4 gru 2016, o 00:42 przez Transatlantyk, łącznie zmieniany 2 razy.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Błąd z szablonami i strumieniami

Post autor: kalwi »

Kod: Zaznacz cały

   plik.open(wejscie, ios::out);
zła flaga

Kod: Zaznacz cały

   plik.seekg(0, ios::cur);
to kompletnie nic nie robi

Kod: Zaznacz cały

 taba[0 - 22] = { 'a' - 'z', };
   taba[23 - 46] = { 'A' - 'Z' };
To jest kompletnie bez sensu

Kod: Zaznacz cały

   char dwuznak[16] = { 'cz','rz','ch','sz','dz','si','ni','zi','Cz','Rz','Sz','Dz','Si','Ni','Zi' };
tak jak i to (nie wiesz czym jest char)

Kod: Zaznacz cały

      delete[] textline, taba, dwuznak;
to też nie działa tak jak myślisz

Kod: Zaznacz cały

    plik.open(wyjscie, ios::in);
też zła flaga

Kod: Zaznacz cały

  string wypiszwynik(const int  &dw, const int &z)
   {
      cout << "Plik wejsciowy zawiera   " << dw << "  dwuznakow, natomiast " << z << " znakow";
   }
   
To też jest bez sensu, bo nie umieszcza się definicji funkcji w funkcji (pomijając już fakt, że i tak dostaniesz zły wynik po poprawieniu tego)
Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] Błąd z szablonami i strumieniami

Post autor: Transatlantyk »

Poprawiłam, mam nadzieję że ok (jestem laik, wybacz)
są teraz dwie funkcje zamisat tamtej

Kod: Zaznacz cały

int szukaj(string wejscie)
{
	ifstream plik;
	plik.open(wejscie, ios::in);
    int dw, z;
	int u;
	string dane;
	getline(plik, dane);
	u = dane.length();
	char** textline = new char*[];
	char taba[] = { 'a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','r','s','t','u','w','x','y','z',
	                'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','W','X','Y','Z' };
	do
	{
		getline(plik, dane);
		u = dane.length();
		for (int n = 0; n < u; n++)
		{
			for (int j = 0; j < 48; j++)
			{
				if (*textline[n] == taba[j])
				{
					z++;
					for (int k = 0; k < 5; k++)
					{
						if ((taba[j] == 'z' || taba[j] == 'Z') && (*textline[n + 1] == taba[8])) { dw++; }
						else if ((taba[j] == 'n' || taba[j] == 'N') && (*textline[n + 1] == taba[8])) { dw++; }
						else if ((taba[j] == 's' || taba[j] == 'S') && (*textline[n + 1] == taba[8])) { dw++; }
						else if ((taba[j] == 'r' || taba[j] == 'R') && (*textline[n + 1] == taba[22])) { dw++; }
						else if ((taba[j] == 'c' || taba[j] == 'C') && ((*textline[n + 1] == taba[22]) || (*textline[n + 1] == taba[7]))) { dw++; }
					}

				}
			}
		}
	delete[] textline;
	delete[] taba;
	}
	while (!plik.eof());
	plik.close();
	return dw, z;
}


i ten drugi, debug zwraca tylko jesdenm ten sam błąd

Kod: Zaznacz cały

void wynik(string wyjscie)
{
	ofstream plik;
	plik.open(wyjscie, ios::out);
	wyjscie << wynik;
}
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Błąd z szablonami i strumieniami

Post autor: kalwi »

Kod: Zaznacz cały

  plik.open(wejscie, ios::in);
nie sprawdzasz, czy udało się otworzyć plik
linijka 8,9:

Kod: Zaznacz cały

   getline(plik, dane);
   u = dane.length();
a potem

Kod: Zaznacz cały

  do
   {
      getline(plik, dane);
      u = dane.length();
8,9 do wywalenia.

Kod: Zaznacz cały

char** textline = new char*[];
1) UB
2) to jest tablica wskaźników na wskaźnik, także kolejny błąd, bo nie alokujesz ponownie pamięci
3) potem jest

Kod: Zaznacz cały

if (*textline[n] == taba[j])
a nigdzie wcześniej tej tablicy textline nie zapełniałaś. Kolejne UB, o odczycie z nieprzydzielonego obszaru pamięci nie wspominając.

Kod: Zaznacz cały

   char taba[] = { 'a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','r','s','t','u','w','x','y','z',
 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','W','X','Y','Z' };
serio?...

Kod: Zaznacz cały

size_t rozmiar = 'z' - 'a';
char tab[2 * rozmiar];

for(size_t i = 0; i < rozmiar; ++i)
	tab[i] = 'a' + i;
for(size_t i = rozmiar; i < 2 * rozmiar; ++i)
	tab[i] = 'A' + i;

Kod: Zaznacz cały

 && (*textline[n + 1] == taba[8])
pomijając wcześniejszy błąd - czym niby jest taba[8]?
nie można było napisać po prostu 'i?

poza tym nie uwzględniłaś przypadków z dużą literą I, Z, H...

Kod: Zaznacz cały

         for (int j = 0; j < 48; j++)
czym jest niby 48? (pytanie retoryczne, nie powinno być "magicznych zmiennych" w kodzie.

Kod: Zaznacz cały

  for (int k = 0; k < 5; k++)
      {
          if ((taba[j] == 'z' || taba[j] == 'Z') && (*textline[n + 1] == taba[8])) { dw++; }
          else if ((taba[j] == 'n' || taba[j] == 'N') && (*textline[n + 1] == taba[8])) { dw++; }
          else if ((taba[j] == 's' || taba[j] == 'S') && (*textline[n + 1] == taba[8])) { dw++; }
          else if ((taba[j] == 'r' || taba[j] == 'R') && (*textline[n + 1] == taba[22])) { dw++; }
          else if ((taba[j] == 'c' || taba[j] == 'C') && ((*textline[n + 1] == taba[22]) || (*textline[n + 1] == taba[7]))) { dw++; }
      }
ta pętla jest kompletnie bez sensu. Zrób sobie dwie oddzielne funkcje - jedną, w której szukasz znaku i drugiej, w której szukasz dwuznaku. Prościej to będzie napisać...

Kod: Zaznacz cały

   delete[] taba;
google.pl -> zmienne automatyczne
tego nie usuwasz

Kod: Zaznacz cały

   return dw, z;
Po raz kolejny - nie wiesz jak działają funkcję. Funkcja nie zwraca dwóch wartości, tylko jedną.

Kod: Zaznacz cały

void wynik(string wyjscie)
{
   ofstream plik;
   plik.open(wyjscie, ios::out);
   wyjscie << wynik;
}
Nic dziwnego, że zwraca błąd, bo chcesz przeciążyć operator << z klasy ostream funkcją wynik(?).
Zresztą dokładnie taki kod błędu jest:

Kod: Zaznacz cały

could not deduce template argument for 'std::basic_ostream
-- 4 gru 2016, o 01:13 --
[C++] nieznany błąd przy debugowaniu
polecam zapoznać się z definicją słowa "debugowanie", bo skoro się program nie kompiluje to o debugowaniu nie ma mowy
Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] nieznany błąd przy debugowaniu

Post autor: Transatlantyk »

Ok, a co powiesz o zamianiae tego bajzlu w dwie funkcje:

Kod: Zaznacz cały

	
void szukajWszystkichFraz(string &wejscie, int &dw )
{
        int j;
        ifstream plik;
	plik.open(wejscie, ios::in);
	if (!plik.good()){exit(EXIT_FAILURE);}
	long u;
	plik.seekg(0, ios::end);
	u = plik.tellg();
	plik.seekg(0, ios::beg);
	const int l = u;
	char dwu[] = { 'cz','rz','ch','sz','dz','si','ni','zi','Cz','Ch','Rz','Sz','Dz','Si','Ni','Zi' };
	int ilechar = 16;
	size_t found =wejscie.find(dwu[j]);
	do
	{
	     plik.seekg(u, ios::cur);
	     for (int i = 0; i < l; i++);
	     {
	         for (int j = 0; j < ilechar; j++);
	          {
	               found = wejscie.find(dwu[j]);
	               if (found == string::npos);
	               else { dw++; }
	          }
	       }
	} while (!plik.seekg(u, ios::end));
}

Kod: Zaznacz cały

void szukajZnaku( string &wejscie, int &z )
{
        int j;
	ifstream plik;
	plik.open(wejscie, ios::in);
	if (!plik.good()){exit(EXIT_FAILURE);}
	long u;
	plik.seekg(0, ios::end);
	u = plik.tellg();
	plik.seekg(0, ios::beg);
	const int l = u;
	char taba[] = {'a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','r','s','t','u','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','W','X','Y','Z' };
	int ilechar = 48;
	size_t found =wejscie.find(taba[j]);	
	do
	{
		plik.seekg(u, ios::cur);
		for (int i = 0; i < l; i++);
		{
			 for (int j = 0; j < ilechar; j++);
			{
				 found = wejscie.find(taba[j]);
				if (found == string::npos);
				else { z++; }
			}
		}

	} while (!plik.seekg(u, ios::end));
}




nie wyśmiewaj moich tablic, tak je wypełniam bo Twojego zapisu nie rozumiem.
za niedługo dorzucę już cały kod, oczywiście jeżeli(a tak będzie) nie powiesz, że to co właśnie wklejam to głupoty.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] nieznany błąd przy debugowaniu

Post autor: kalwi »

Kod: Zaznacz cały

string &wejscie
niepotrzebna referencja

Kod: Zaznacz cały

   const int l = u;
const musi być ustalone już w momencie kompilowania się programu, nie może tu przypisać zmiennej u

Kod: Zaznacz cały

   char dwu[] = { 'cz','rz','ch','sz','dz','si','ni','zi','Cz','Ch','Rz','Sz','Dz','Si','Ni','Zi' };
Po raz kolejny - nie rozumiesz, czym jest typ char
Zamiast robić coś na intuicję, należy otworzyć książkę i poczytać co jest czym.
char (czytaj "czar"), od angielskiego character to jest JEDEN znak. JEDEN znak z tabeli ASCII:

Kod: Zaznacz cały

https://pl.wikipedia.org/wiki/ASCII

nie wyśmiewaj moich tablic, tak je wypełniam bo Twojego zapisu nie rozumiem.
To teraz spójrz na to co napisałem u góry, i zobacz sobie pod tym linikiem, że literka 'a' odpowiada wartości decymalnej równej 97, literka 'b' 98, itd. Więc zapis

Kod: Zaznacz cały

cout << (char)('a'+1)
jest równoważny

Kod: Zaznacz cały

cout << (char)'b'
I jeśli nadal nie rozumiesz w jaki sposób wypełniłem tę tablicę:

Kod: Zaznacz cały

size_t rozmiar = 'z' - 'a';
char tab[2 * rozmiar];

for(size_t i = 0; i < rozmiar; ++i)
   tab[i] = 'a' + i;
for(size_t i = rozmiar; i < 2 * rozmiar; ++i)
   tab[i] = 'A' + i;
to sobie stwórz nowy projekt, pomodyfikuj, pozmieniaj, aż w końcu zrozumiesz.

W związku z tym, że tabela dwu jest źle, to cała reszta potem - również.
Jeżeli chcesz zapisać tabelę dwu w charze (nie wiem w sumie, czemu się tak upierasz przy tym char, który jest pozostałością z C, zamiast stosować stringi z C++), to musisz napisać

Kod: Zaznacz cały

   char dwu[][3] = { "cz","rz","ch","sz","dz","si","ni" itd.};
jak sobie może w końcu przeczytasz, czym jest łańcuch literowy w C/C++ to zrozumiesz, czemu tam jest 3 na końcu, a nie dwa

dalej, kolejna funkcja

Kod: Zaznacz cały

 string &wejscie
znowu, niepotrzebna referencja

Kod: Zaznacz cały

 const int l = u;
niepotrzebny const

Kod: Zaznacz cały

char taba[] = {'a','b','c','d','e','f','g','h','i','k','l','m',...
to już wcześniej skomentowałem, ale potem

Kod: Zaznacz cały

   int ilechar = 48;
znowu masz magiczną liczbę
Jak chcesz sobie zliczyć ilość wyrazów w tablicy, to po prostu:

Kod: Zaznacz cały

size_t ilechar = sizeof(taba)/sizeof(taba[0]);
aczkolwiek coś takiego działa jedynie przy tablicach automatycznych

Kod: Zaznacz cały

    int j;
a następnie

Kod: Zaznacz cały

   size_t found =wejscie.find(taba[j]);   
no i ile niby to j wynosi, co?

Kod: Zaznacz cały

   plik.seekg(0, ios::beg);
a potem

Kod: Zaznacz cały

      plik.seekg(u, ios::cur);
które jest równe

Kod: Zaznacz cały

   u = plik.tellg();
czyli tak naprawdę na dzień dobry robisz

Kod: Zaznacz cały

   plik.seekg(0, ios::end);

Kod: Zaznacz cały

 if (found == string::npos);
            else { z++; }
a nie można po prostu

Kod: Zaznacz cały

 if (found != string::npos);
            z++; 
?

Kod: Zaznacz cały

while (!plik.seekg(u, ios::end));
nie, taki warunek nie jest dobry
Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] nieznany błąd przy debugowaniu

Post autor: Transatlantyk »

no dobra, dużo już nie zmienię, projekt był do wczoraj, więc coś pokombinuję jeszcze (mózg mam zlasowany), teraz pokażę Ci tylko jak próbuję rozwiącać ten drugi problem i znów nie wiem czemu jest niepoprawny??

Kod: Zaznacz cały

void thefinalcountdown(int dw, int z, string &wynik)
{
	string wynik1("Plik wejsciowy zawiera:    ");  // " << dw << "  dwuznakow, natomiast " << z << " znakow";
	string wynik2("dwuznakow, natomiast znakow:  ");
	int i = dw;
	ostringstream ss;
	ss << dw;
	string dwuznaki = ss.str();
	ss << z;
	string znaki = ss.str();
	wynik = wynik1 + dwuznaki + wynik2 + znaki;

}
void wynik(string wyjscie, string wynik)
{
	fstream plik;
	plik.open(wyjscie, ios::out);
	wyjscie << wynik;
}


w sensie zwraca ten dziwaczny błąd cały czas
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] nieznany błąd przy debugowaniu

Post autor: kalwi »

Kod: Zaznacz cały

void wynik(string wyjscie, string wynik)
{
   fstream plik;
   plik.open(wyjscie, ios::out);
   wyjscie << wynik;
}
jak wg Ciebie dziala ten kod?
Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] nieznany błąd przy debugowaniu

Post autor: Transatlantyk »

funkcja obiera argumenty pliku wyjsciowego i zmiennej, którą chcę tam wpisać,

w ciele funkcji otwieram plik do zapisu danych a następnie do pliku, podobnie jak 'cin' wpisuję zmienną string.

co tu może być źle? co ja źle rozumiem? wyślę Ci zaraz pełen kod i jak chcesz to go też przejżyj, może udzielisz mi jakichś rad tylko na poziomie studenta pierwszego roku informatyki , który ominął cały listopad w uczelni
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] nieznany błąd przy debugowaniu

Post autor: kalwi »

Źle może być na przykład to, że wyjscie to jest nazwa pliku i teraz chcesz wpisać string wynik do stringa wyjscie, a nie do pliku o nazwie wyjscie
Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] nieznany błąd przy debugowaniu

Post autor: Transatlantyk »

poszło!!!!!!!!! znalazłam rozwiązania na wszystkie błędy, teraz tylko testowanie wykryje mi ich 18tys ale kompiluje się, debuguje, żadnych ostrzeżeń czy błędów!!!!!!



DZIĘKUJĘ!!!!!!!!!!!!
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] nieznany błąd przy debugowaniu

Post autor: kalwi »

Błędów jest nadal cała masa, ale przynajmniej jakiś postęp zrobiłaś. Dobra robota.
Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] nieznany błąd przy debugowaniu

Post autor: Transatlantyk »

a powiesz mi jeszcze jak mam z napisanego kodu zrobić program.exe? jakiś konwerter?


Jaaakie błędy???:((((((((
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] nieznany błąd przy debugowaniu

Post autor: kalwi »

To co tu wcześniej napisałem, czy też

Kod: Zaznacz cały

    int j = (0 <= k <= 48);
to nie ma sensu

co do pliku .exe - to będzie on w folderze, w którym masz projekt
Transatlantyk
Użytkownik
Użytkownik
Posty: 52
Rejestracja: 30 cze 2014, o 15:08
Płeć: Kobieta
Lokalizacja: Ziemia

[C++] nieznany błąd przy debugowaniu

Post autor: Transatlantyk »

Znowu wykrywa błędy krytyczne..... proszę, powiedz co ja mam zrobić z tymi funkcjami szukającymi żeby program leciał jak strzała....
ODPOWIEDZ