przesyłanie tablicy stringów do funkcji

0

Witam,
Mam problem z poniższym kodem, po kompilacji program się crashuje, nie wiem czym to jest spowodowane,(moze źle przesyłam tablice stringów do funkcji przyporz). Jeśli ktoś rzuci na to okiem będę wdzięczny;) tablica stringow **tabl **jest wypelniona wersami z pliku (linia moze zaczynac sie literą 'K' , 'C' , 'R' lub 'I' , a zmienna linie przechowuje ilosc wersow w pliku.



void przyporz(int linie,string tabl[],string tabk[],string tabc[],string tabr[],string tabs[])
	{
		char pznak;
		int i,k,c,r,s;
		while(i<linie)
		{
			pznak=tabl[i][0];
			cout<<pznak;
			if(pznak=='K')
			{
				tabk[k]=tabl[i];
				k++;
				
			}
						
			if(pznak=='C')
			{
				tabc[c]=tabl[i];
				c++;
			}
			
			
			if(pznak=='R')
			{
				tabr[r]=tabl[i];
				r++;
			}
			
			
			if(pznak=='I')
			{
				tabs[s]=tabl[i];
				s++;				
			}
			
			
			i++;
		}		
	}


int main() 
{

	int linie=5;	
	string tabl[linie];

	string tabk[linie];						
	string tabc[linie];						
	string tabr[linie];						
	string tabs[linie];	
					
	przyporz(linie,tabl,tabk,tabc,tabr,tabs);
	
		
	
	return 0;
}
  
3
        int i,k,c,r,s;
        while(i<linie)

Jaka jest wartość i w pierwszej iteracji? Dokładnie. UB.

Przy okazji, to nie jest poprawny kod w C++ i nie powinien się on kompilować. Wielkość tablicy musi być znana w czasie kompilacji.

0

int i;
więc chyba i=0,
lepiej to zrobić ze wskaźnikami i dynamicznymi tablicami ? tylko jak by to miało wyglądać?

1

Nie. Tylko zmienne globalne i statyczne mają ustawioną domyślną wartość. Musisz ustawić zero.

Przy okazji: wiesz, że do funkcji przekazujesz wskaźniki na string, a nie ich tablice?

0

Dzięki wielkie teraz wszystko działa, ale mam tam inne funkcje np:

int iloscl(string sciezka)
{
int i;
string linia;
fstream plik;
plik.open(sciezka.c_str(),ios::in);

while(plik.eof()==0)
{
	getline(plik,linia);
	i++;
}

plik.close();
return i;

}
i tam wszystko dziła tak jakby i było równe 0.

Wysyłam wskaźnik na wszystkie stringi z np. tabl ?Dobrze rozumiem?

2

To jest UB. Teoretycznie w momencie gdy to robisz to kompilator może wyprodukować kod formatujący Twój dysk twardy. Bardziej realistycznie, potraktuj taką wartość jako wartość losową. Akurat udało Ci się trafić zero, super. Skompilujesz na innym komputerze, kompilatorze, lub nawet z innymi flagami kompilacji i już może być inaczej.

Wysyłam wskaźnik na wszystkie stringi z np. tabl ?Dobrze rozumiem?
Tak

0

sprawdzilem na prostym przykladzie to o czym mowiles

void piszz2()
{
int i,j,k,l;
cout<<k<<endl<<l<<i<<endl<<j<<endl;
}

int main()
{
piszz2();
cout<<endl;
return 0;
}

wynik to 0 ,4236085,-1 , -1
czyli pierwsza wartosc zawsze jest 0 ale inne juz sa losowe:) dzieki za pomoc

0
makoyork napisał(a):

czyli pierwsza wartosc zawsze jest 0

Wnioskowanie w stylu "właśnie jechałem czerwonym autobusem. Z tego powodu wnioskuję, że każdy autobus jest czerwony".
http://melpon.org/wandbox/permlink/VEsYvzktkJBv5vXM

0

wywnioskowałem to dlatego, że robiłem to na swoim kompilatorze parę razy z różnymi zmiennymi i zawsze pierwsze było zero, jak widać przypadek:)

2

Nie rób tablicy stringów, użyj vector<string>.

1

Aby nie przekazywać 5-ciu tablic użyj:

vector<array<string,5> > Params;

Oraz przekazuj przez referencje.

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