Wadliwa funkcja sortująca.

0

Witam.
Od kilku dni męcze się z pewną funkcją zadanie ma proste podzielić taką tablice:
"$PGTOP,11,2*6E\r\n$GPGGA,000105.799,,,0,0,MM*4B\r\n$GPGSA,A,1,,,,,,,,,,,,,,,*1E\r\n"

Interesuje mnie np. tekst pomiędzy 1 a 2 znakiem '$'. Czyli funkcja powinna wypluć "$PGTOP,11,2*6E".

Teraz chce dowiedzieć się co jest po 2 i 3 znaku ',' tego co otrzymałem czyli w tym wypadku będą to znaki 'A' i '1'.

Tak wygląda funkcja :


char *podziel(int ile,char *ramka,char znaki)
{
			
	static char tab2[50];	 
	int ir=0;
	int kk=0;
	int yy=0;
	
	while(ramka[kk]!='\0')
	{
		if(ramka[kk]==znaki)
			{
				ir++;
					
			if(ir==ile-1){kk++;}
			else if(ir==ile)	{  return tab2;	 };	//									
			};
								
	  if(ir==ile-1)
			{							
				tab2[yy]=ramka[kk];
				 yy++;	
				 tab2[yy]='\0'; 							
			}			
	kk++;
		 }	
		
		return tab2;	
					 }


char *A;
char *B; 
char *C; 
char *RXtemp;


int main(int argc, char *argv[]) {
	

RXtemp=podziel(2,US_SS,'$');                    	
cout<<  RXtemp  << endl;

A=podziel(2,RXtemp,',');                    	
cout<<  A  << endl;

B=podziel(2,RXtemp,',');                    	
cout<<  B  << endl;


	return 0;
}

Niestety funkcja zwraca

PGTOP,11,2*6E

11
11

Zauważyłem rzecz następującą jeśli działam tylko na tablicy
char US_SS[220]={"$PGTOP,11,2*6E\r\n$GPGGA,000105.799,,,0,0,MM*4B\r\n$GPGSA,A,1,,,,,,,,,,,,,,,*1E\r\n"};

np tak:

RXtemp=podziel(2,US_SS,'$');                    	
cout<<  RXtemp  << endl;
RXtemp=podziel(3,US_SS,'$');                    	
cout<<  RXtemp  << endl;
RXtemp=podziel(4,US_SS,'$');                    	
cout<<  RXtemp  << endl;

Wszytko jest w porządku problemy zaczynają się gdy wywołuje funkcje z argumentem RXtemp w którym znajduje się wstępnie obrobiony tekst "$PGTOP,11,2*6E"
Wygląda na to że funkcja modyfikuje mi ten argument tj RXtemp !!!
Czy mógł by ktoś poprawić mi tą funkcje bardzo proszę pomoc .

0

formatuj lepiej kod bo ciężko się to czyta

"Teraz chce dowiedzieć się co jest po 2 i 3 znaku ',' tego co otrzymałem czyli w tym wypadku będą to znaki 'A' i '1'."
to co otrzymałeś to jest "$PGTOP,11,2*6E" powiedz mi gdzie Ty tu widzisz A oraz 1?

RXtemp=podziel(4,RXtemp,'$');
jeżeli tak wywołujesz to jest oczywiste że zmieni Ci RXtemp, przecież zwracasz do niej wskaźnik (obrobionej rzeczy)

btw czemu nie chcesz skorzystać z string oraz jego metod?

0

Witam.

to co otrzymałeś to jest "$PGTOP,11,2*6E" powiedz mi gdzie Ty tu widzisz A oraz 1?

Oczywiście chodziło mi o '11' i '2*6E'

RXtemp=podziel(4,RXtemp,'$');
jeżeli tak wywołujesz to jest oczywiste że zmieni Ci RXtemp, przecież zwracasz do niej wskaźnik (obrobionej rzeczy)

Nigdzie nie mam takiego wywołania:
mam:

RXtemp=podziel(4,US_SS,'$');

btw czemu nie chcesz skorzystać z string oraz jego metod?

Ponieważ docelowo będe pisał program na mikrokontroler . Próbowałem używać funkcji strtok ale niestety pomija puste miejsca znaki tzn np. 1,,3 jeśli bym chciał odczytać co jest po drugim przecinku wyskoczy mi zamiast ' ' liczba '2'.

0

Dlaczego widzę czwarty albo piąty temat z tym samym problemem?

0

Najpierw polecono mi funkcje strtok która okazała się nie działać należycie więc odpowiedzi nie uzyskałem. Od tej pory próbowałem sam napisać funkcje jaką widać powyżej posiłkując się tematami dotyczącymi wskaźników . Niestety poległem, teraz wrzuciłem docelową funkcje która nie działa jak należy.
Zapewniam że jak uzyskam rozwiązanie mojego problemu podobne tematy się skończą. Pozdrawiam

1

problem polega na tym, ze do RXtemp wpisujesz tab2, a poźniej tab2 modyfikujesz kolejnym wywołaniem funkcji przez co nadpisujesz ja. Twoja funkcja działa tak jak chcesz, tylko źle przechowywujesz dane (wywołaj sobie =podziel(3,RXtemp,','); cout<< A << endl;)
mniej więcej idzie to tak

  1. tab jest puste
  2. wywołujesz pierwszy raz funkcje dla $ więc tab zawiera $PGTOP,11,2*6E
  3. wywołujesz drugi raz funkcje i tab zawiera już 11 (została nadpisana)
  4. wywołujesz trzeci raz funkcje ale tab ma 11 więc przecinka już nie znajdzie. przez co zwróci początek c-stringa (czyli 11)

poszerz funkcje o jeden parametr. (source, destiny, which , what) Source czyli będzie tutaj Twój tab. destiny to dokąd ma trafic (A, B itd) which (czyli który) what (czyli co) i funkcja może być typu void lub typu bool żeby zwrócić czy wszystko się udało czy nie

0

Zapewniam że jak uzyskam rozwiązanie mojego problemu podobne tematy się skończą

A jak nie dostaniesz to będziesz napieprzał tymi tematami co drugi dzień aż do skutku? Dostałeś już kilka podpowiedzi i nie udało ci się z nich skorzystać, bo brak ci elementarnych podstaw z C. Idź w tym kierunku, a nie zaśmiecania forum, dopóki nie otrzymasz gotowego rozwiązania.

0

będziesz napieprzał

Proponuje pare głębokich wdechów.
Moje pytania wydają się banalne i jest ich dużo ponieważ własnie jestem początkujący. Tematy które zakładałem dotyczyły większości wskaźników bo z tym mam problem.
Proszę wybaczyć ale podobne wpisy będe ignorował.

0

bana też zignorujesz? ;-)
a tak na serio - skoro jesteś początkujący, to pytania zadawaj w dziale dla początkujących, nazywa się "Newbie".

0

Program już działa za wszelką pomoc dziękuje i pozdrawiam.

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