C i problem z wskaźnikami.

C i problem z wskaźnikami.
NJ
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
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ć.

Kopiuj

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.

edytowany 2x, ostatnio: naJ
DA
  • Rejestracja:około 17 lat
  • Ostatnio:prawie 12 lat
0
Kopiuj
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


#define if(x) if(rand()%6 && (x)) u mad? <img src="http://e.deviantart.net/emoticons/t/trollface.png" alt="user image" />
edytowany 1x, ostatnio: dawidgarus
fasadin
nawiasy klamrowe mogą być (wyświetli wszystko poprawnie), ale jest to pewna niekonsekwencja (przynajmniej dla mnie)
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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)
edytowany 1x, ostatnio: fasadin
NJ
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
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ć.

fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

ale zrobiłem babola. Sry

Kopiuj
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;
} 
Kopiuj
 
#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;
}
edytowany 1x, ostatnio: fasadin
NJ
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
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ć?

edytowany 3x, ostatnio: naJ
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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] ?

edytowany 2x, ostatnio: fasadin
NJ
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
0

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

Kopiuj
char *podziel(char *ramka)
{        
	char tab2[20];
	
        char *wsk=tab2;
 
              ramka++;
             *wsk=(*ramka);
 
        return wsk;                     
                         }  
Richard Stallman
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:43
0

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


"Daj komuś Windowsa, a nauczy się w jeden dzień. Naucz go obsługi GNU/Linux a będzie sie z nim trudził przez całe życie."
NJ
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
0

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

edytowany 1x, ostatnio: naJ
NJ
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
0

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

Kopiuj
char *podziel(char *ramka)
{        	
        char *wsk=tab2; 
              ramka++; 
             *wsk=(*ramka); 
            
        return wsk;                     
                         }   
Richard Stallman
przecieŻ nic nie zmieniłeś! Nie ma tylko tab2[20] nie wiem gdzie to wstawiłeś. Nagle zaczęła ci działać?
NJ
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
0

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

Kopiuj
char *podziel(char *ramka)
{            
        static char tab2[20];    
        char *wsk=tab2; 
              ramka++; 
             *wsk=(*ramka); 
 
        return wsk;                     
                         }  
Richard Stallman
to teraz daj mu ptaszka jak ci pomógł :P
Richard Stallman
osiem równa się 'D' :P
NJ
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
0

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

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.