Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 3 sty 2025, o 01:56


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 14 kwi 2014, o 17:10 
Offline
Użytkownik

Dołączył(a): 28 paź 2013
Posty: 28
Pomógł: 1

Witam wszystkich. Straciłem już wszystkie włosy na głowie i nadal nie mogę dojść do ładu z pewnym "nienormalnym" zachowaniem aplikacji :(

Domyślam się, że problemem jest moja nie wiedza, a nie "głupi" kompilator, czy uC :)

Ale do żeczy:

Mam kod jak poniżej...

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Problemem jest to, że w miejscu programu oznaczonym jako ...A... pozyskuję wartość do zmiennej ADCValue. Wartość ta jest z zakresu 0..255. Następnie spodziewałbym się że po wywołaniu funkcji Voltage, będę miał zapisany w pamięci (wskazywanej przez *BFR) ciąg znaków zgodnie z ciałem funkcji Voltage... To znaczy dla wartości 0 pamięć powinna wyglądać tak: 'Z', 'E', 'R', 'O', \0, dla wartości 255 tak: 'M', 'A', 'X', \0, a dla wartości pośrednich tak: 'P', 'O', 'S', 'R', \0

W miejscu programu ...B... "wyświetlam" zawartość pamięci spod adresu wskazywanego przez: BFR. I niestety mam cały czas spacje, te z inicjalizacji zmiennej :(

Nie pomaga już nawet na sztywno przypisywanie wartości do zmiennej ADCValue tuż przed wywołaniem Voltage. Ani też nie pomogłą wykomentowanie ciała funkcji Voltage i na sztywno wstawienie kodu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Potrafi ktoś to wytłumaczyć i pokazać mi, co jest nie tak?

Z góry dziękuję i pozdrawiam...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2014, o 17:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Użyj funkcji strcpy

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oczywiście wcześniej

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2014, o 18:10 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

czarusgg napisał(a):
Voltage (BFR);


Zmienna jest przekazywana do funkcji "przez wartość", nieprawdaż? A więc...pewnie już wiesz co :-)

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2014, o 19:03 
Offline
Użytkownik

Dołączył(a): 28 paź 2013
Posty: 28
Pomógł: 1

Tak też próbowałem...

Voltage (&BFR);

I też kiszka :( Poza tym, że wtedy na pierwszym znaku mam śmieci :)

I teraz w takim razie zapytanie, czy char* BFR nie powoduje zadeklarowanie wskaźnika na znak (bajt) identycznego jak wskaźnik na tablicę bajtów? Samo to powoduje, że BFR tak de facto jest wskaźnikiem. Także w tym wypadku do funkcji trafia wskaźnik...

Ale pokombinuje w tym kierunku...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2014, o 19:36 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

czarusgg napisał(a):
I teraz w takim razie zapytanie, czy char* BFR nie powoduje zadeklarowanie wskaźnika na znak (bajt) identycznego jak wskaźnik na tablicę bajtów? Samo to powoduje, że BFR tak de facto jest wskaźnikiem. Także w tym wypadku do funkcji trafia wskaźnik...


Owszem, wszystko się zgadza...prawie...do funkcji trafia kopia wskaźnika. Przy wyjściu z funkcji kopia jest niszczona. Musisz albo przekazać zmienną przez referencję albo przerobić funkcję na zwracającą wartość.

czarusgg napisał(a):
Tak też próbowałem...

Voltage (&BFR);

I też kiszka :( Poza tym, że wtedy na pierwszym znaku mam śmieci :)

A w funkcji przypisanie wyglądało tak?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jest pewien problem w Twoim kodzie, mianowicie jak już uda Ci się przypisać nowy ciąg do zmiennej BFR to tym samym stracisz dostęp do inicjalnego ciągu spacji. Powinieneś mieć jakąś zmienną typu const, która zawsze będzie przechowywać adres ciągu i drugą zmienną, roboczą do której przypisywać można biążący ciąg.

A tak w ogóle w mikroklockach stałe ciągi znaków definiuje się w pamięci flash, ale może na razie to zostawmy.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2014, o 19:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

A nie powinieneś zainicjować bufor w ten sposób:


char BFR[25];

Ale mogę się mylić.

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2014, o 20:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Jak dasz
czarusgg napisał(a):
Voltage (&BFR);


to funkcja Voltage

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a dalej tak jak xor napisał

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 kwi 2014, o 00:00 
Offline
Użytkownik

Dołączył(a): 28 paź 2013
Posty: 28
Pomógł: 1

Dziękuję, pomogło. Zrozumiałem to w ten sposób...

Skoro przekazuję do funkcji wskaźnik char* B, To tak naprawdę owszem, przekazuję w tym wskaźniku adres na pamięć z moimi spacjami, ale operacji dokonuję na samym wskaźniku a nie tej pamięci. Stąd, jeśli przypisałem B = "ZERO", to defacto, 'Z' oraz 'E' stało się adresem wskazującym na coś tam ('Z' * 256 + 'E'), 'R', '0', \0 zaś mazało po pamięci za tym wskaźnikiem niszcząc inne zmienne bądź co bardziej prawdopodobne mazało po stosie :) Gdy zacząłem się do tego obszaru odwoływać poprzez wskazanie *B, zaczęło działać. No i do funkcji przekazywałem nie sam wskaźnik a faktyczny adres (w nim) moich inicjalizacyjnych spacji poprzez operator pobrania adresu &. Czy dobrze to zrozumiałem. Generalnie dziękuję, działa jak trzeba :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 kwi 2014, o 07:37 

Pomógł: 0

Zasada wskaźników to jest bardzo dobrze wytłumaczona w BB oraz w "Szkoła Programowania C" Praty



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 15 kwi 2014, o 09:36 
Offline
Użytkownik

Dołączył(a): 28 paź 2013
Posty: 28
Pomógł: 1

:) OK, Wrócę do BB zanim Mirek to zobaczy :oops:
Jeszcze raz dziękuję wszystkim za odpowiedzi, wskazówki i wyjaśnienia.

PS. To jak do ciężkiej anielki działają moje dotychczasowe urządzenia :?:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO