C i problem z wskaźnikami.

0

Witam.
Nie mogę sobie poradzić ze wskaźnikami.
Na potrzeby testu stworzyłem sobie prostą funkcje która ma za zadanie przepisać drugi element tablicy do wskaźnika i następnie go zwrócić.


char US_RX[220]={"$GPGSA,A,1,,9,,,,,,,,,,,,,*1E"};

char *podziel(char *ramka)
{	
	char *wsk;
	
	      ramka++;
	     *wsk=*ramka;
	     	     
	return wsk; 	    	
			 }	

			 
.....

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

 	cout<< podziel(US_RX) << endl;
  

Jak to powinno wyglądać.
Pozdrawiam.

0
char US_RX[220]={"$GPGSA,A,1,,9,,,,,,,,,,,,,*1E"};

co to jest? niepotrzebne nawiasy klamrowe - tworzysz tablicę której jedynym elementem jest wskaźnik na char

1

odpowiem w ramach pytań, żebyś sobie na nie odpowiedział

  1. w funkcji *wsk na co pokazuję?
  2. jeżeli inkrementujesz wskaźnik, a nie przesuwasz "po nim" w sposób *(wsk + i) to czy on nadal pokazuje na to początkowe miejsce?
  3. jak sądzisz co się tutaj zrobi *wsk=*ramka;
    a) do wartości wsk przypisz wartość ramka
    b) do wartosci wsk przypisz wsk razy ramka
    jeżeli nie jesteś pewien to powinieneś użyć nawiasu (nawet po to żeby ktoś inny się nie zastanawiał i było czytelniejsze)
0
  1. *wsk pokazuje na aktualny wskaźnik ramki tzn *ramka
  2. Wskaźnik po inkrementacji wskazuje na następny znak tablicy
    3 *wsk=*ramka Znak na który wskazuje aktualnie wskaźnik ramka zostanie przepisany do aktualnego wskaźnika wsk.

Ogólnie to jestem zielony. Jeśli można to prosił bym o jakiś działający przykład mógł bym go przeanalizować.

1

ale zrobiłem babola. Sry

char *podziel(char *ramka)
{
        char *wsk; // narazie nie pokazuje na nic

            ramka++; // przesuwasz ramke na kolejny element, zapominasz o pierwszym, w ogole nie ma petli to jak chcesz to wszystko przepisac?
             *wsk=(*ramka); // przypisujesz wartosc WSK, ale NADAL nigdzie nie wskazuje (ok wskazuje na losowe miejsce w pamięci wiec jeszcze gorzej)

        return wsk;
} 
 
#include <iostream>
#include <string.h>

using namespace std;

char US_RX[220]={"$GPGSA,A,1,,9,,,,,,,,,,,,,*1E"};
char tablica[220];

char *podziel(char *ramka)
{
        char *wsk = tablica;
        int length = strlen(ramka);

        for (int i = 0 ; i < length ; i++)
          *(wsk+i) = *(ramka+i);
        return wsk;
}




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

         cout<< podziel(US_RX) << endl;
}
0

Dzięki. Ale małe sprostowanie mój problem polegał na tym, że nie chce wszystkiego przepisywać a raczej:
"... funkcje która ma za zadanie przepisać drugi element tablicy do wskaźnika i następnie go zwrócić..."
W tym wypadku jak to powinno wyglądać?

2

no bez przesady... sam sobie możesz to napisać. popatrz na mój kod popatrz na swój stary kod, pomyśl czego w nim brakowało. Uzupełnij i się ciesz

edit. No i nie ma prawa działać. Stworzyłeś zmienna lokalna więc tab2 po opuszczeniu funkcji już nie istnieje (poczytaj sobie o zakresie zmiennych)

do tego jak chcesz drugi element to czy nie lepiej po prostu zrobić US_RX[1] ?

0

Próbuje ale taka funkcja też nie działa:

char *podziel(char *ramka)
{        
	char tab2[20];
	
        char *wsk=tab2;
 
              ramka++;
             *wsk=(*ramka);
 
        return wsk;                     
                         }  
0

nie możesz po prostu dać *wsk = *(ramka + 1)?

0

To nic nie zmienia próbowałem.Efekt ten sam zamiast znaku G wyświetla mi się jakiś uśmieszek.

0

Po wszystkich radach funkcja przybrała taką formę wygląda na to że działa.

char *podziel(char *ramka)
{        	
        char *wsk=tab2; 
              ramka++; 
             *wsk=(*ramka); 
            
        return wsk;                     
                         }   
0

Przepraszam oczywiście pominąłem najważniejsze:

char *podziel(char *ramka)
{            
        static char tab2[20];    
        char *wsk=tab2; 
              ramka++; 
             *wsk=(*ramka); 
 
        return wsk;                     
                         }  
0

Zaptaszkowałem (chyba dobrze). Dziękuję i pozdrawiam.

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