 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3116 Aktiv.: 19.68 Kraj: Koroška Bela
|
Objavljeno: Pon Dec 07, 2020 3:09 pm Naslov sporočila: |
|
|
Sem pogledal v program in tam podpičje je. Mislim da se je podpičje izgubilo pri Copy/paste kode tukaj v post, ko sem ga urejal..
|
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3116 Aktiv.: 19.68 Kraj: Koroška Bela
|
Objavljeno: Pet Dec 11, 2020 3:02 pm Naslov sporočila: |
|
|
Pozdrav, tisto kar sem spraševal prejšnjič, bom preverjal preko vikenda, sem imel drugo delo.
Imam pa dve težavici - warninga pri kompilanju in to že od začetka učenja C-ja, torej cca 10 let . Program sicer dela b.p., ampak med toliko warningi potem izgubiš bistvenega...
Torej, v knjižnici za uporabo LCD-ja imam deklaracijo funkcije tako:
Koda: |
void LCDstring(uint8_t*, uint8_t, uint8_t); //Outputs string to LCD - na poziciji x,y (12.10.2011)
|
v programu pa imam deklarirano recimo eno globalno spremenljivko,
Koda: |
volatile unsigned char tekst [21]; |
v programu pa funkcijo uporabim takole:
Koda: |
LCDstring ("11.12.2020 v1.2", 0, 1);
|
Tavarianta mi vrže ven warning:
../DS18_adresar.c:61:1: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'char *'
Kaj je treba narediri, da se tega znebim? Domnevam, da je nekaj narobe z deklaracijo spremenljivk, ampak mi ne uspe rešiti brez Warningov.
2 varianta pa je uporaba tega:
Koda: |
sprintf (tekst, "%03d.%d'C", temp/10, abs(temp%10));
LCDstring(tekst,9,0); |
kar vrže napako:
../DS18_adresar.c:142:1: warning: passing argument 1 of 'sprintf' discards qualifiers from pointer target type
../DS18_adresar.c:143:1: warning: passing argument 1 of 'LCDstring' discards qualifiers from pointer target type
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'volatile unsigned char *'
Mislim, da bo rešitev enega problema rešila tudi drugega...
|
|
Nazaj na vrh |
|
 |
tilz0R Član


Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 864 Aktiv.: 8.20 Kraj: Črnomelj
|
Objavljeno: Pet Dec 11, 2020 3:04 pm Naslov sporočila: |
|
|
Najprej se odloči, ali boš uporabljal tipe iz stdint ali navadne tipe, predvsem integer.
String je signed char, medtem ko ti imaš parameter unsigned char. Zato imaš warning.
Deklariraj funkcijo, da sprejme "char *". in deklariraj spremenljivko kot char text..
_________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
 |
mato1111 Član

Pridružen-a: Pet 28 Dec 2012 14:42 Prispevkov: 538 Aktiv.: 5.47 Kraj: Vrhnika
|
Objavljeno: Pet Dec 11, 2020 10:33 pm Naslov sporočila: |
|
|
Tudi jaz imam vprsanje in sicer je povezano z eepromom. Rad bi nastavil zacetne vrednosti eeprom spremenljivk in jih vnesel v MCU ko bi ga sprogramiral z eep datoteko.
V spodnjem primeru mi je jasno:
Koda: |
static char EEMEM eVar[9]= "XYZ"; //primer z zacentno vrednostjo
|
Ni pa mi jasno kako se to naredi ce imam spremenljivke v strukturi:
Koda: |
struct EEP_Vars_struct
{
char EEP_Var1[9]; //to bi nastavil na "X"
char EEP_Var2[5]; //to bi nastavil na "Y"
};
struct EEMEM EEP_Vars_struct EEP_Vars[3]; //v vseh strukturah zelim enako
|
In se naslednje vprasanje. Zelim n spremenljivk tipa string kot je spodnja
Je boljse uporabit en 2D array ali n struktur?
Koda: |
struct ID_struct {
char ID[5];
};
ID_struct ID[n];
ali
char ID[n][5]; |
|
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3116 Aktiv.: 19.68 Kraj: Koroška Bela
|
Objavljeno: Tor Dec 15, 2020 7:16 am Naslov sporočila: |
|
|
Samo da odgovorim Tilz0r-ju, na žalost (ali srečo) sem in bom imel do novega leta bolj malo časa za testiranje... En kup zaposlenosti. Da se bo vedelo, zakaj ne sodelujem aktivno v temi z "mojimi" vprašanji..
|
|
Nazaj na vrh |
|
 |
tilz0R Član


Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 864 Aktiv.: 8.20 Kraj: Črnomelj
|
Objavljeno: Tor Dec 15, 2020 8:06 am Naslov sporočila: |
|
|
mato1111 je napisal/a: |
Tudi jaz imam vprsanje in sicer je povezano z eepromom. Rad bi nastavil zacetne vrednosti eeprom spremenljivk in jih vnesel v MCU ko bi ga sprogramiral z eep datoteko.
V spodnjem primeru mi je jasno:
Koda: |
static char EEMEM eVar[9]= "XYZ"; //primer z zacentno vrednostjo
|
Ni pa mi jasno kako se to naredi ce imam spremenljivke v strukturi:
Koda: |
struct EEP_Vars_struct
{
char EEP_Var1[9]; //to bi nastavil na "X"
char EEP_Var2[5]; //to bi nastavil na "Y"
};
struct EEMEM EEP_Vars_struct EEP_Vars[3]; //v vseh strukturah zelim enako
|
|
Tako bo šlo:
Koda: |
/* Lahko daš številko v oklepaje da definiraš velikost, drugače se bo definirala pri definiciji */
struct EEMEM EEP_Vars_struct EEP_Vars[] = {
{"X", "Y"}, /* Prvi element, < C99 stil */
{ .EEP_Var1 = "X", .EEP_Var2 = "Y" } /* >= C99 stil */
} |
mato1111 je napisal/a: |
In se naslednje vprasanje. Zelim n spremenljivk tipa string kot je spodnja
Je boljse uporabit en 2D array ali n struktur?
Koda: |
struct ID_struct {
char ID[5];
};
ID_struct ID[n];
ali
char ID[n][5]; |
|
Dobro vprašanje, in konkretno za arhitekturo AVR ne vem, kar je boljše iz stališča performancev. Generalno pa vedi nekaj:
- Prevajalnik lahko strukturo poravnava na določeno število bytov (ponavadi 2, 4, 8), za dosego najboljšega performance-a. Torej je sizeof(struct ID_Struct) lahko recimo 8 bytov, v tvojem primeru bi lahko bil array tega velik n * 8 bytov, minimalno pa je n * (sizeof_vsake_elementa_posamezno). Če je v strukturi samo en element, se po navadi alignment ne dela, a dobro je vedeti. To ni standard, to je compiler specific. Torej v najboljšem primeru bo porava tvojega pomnilnika n * 5, v najslabšega pa ne vem, lahko da bo n * 8.
- Array bo imel vedno znano velikost, v tvojem primeru n * 5 bytov.
Jaz bi šel z strukturo, če ne drugo je lažje z njo programirati, kot pa z 2d array-i.
_________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3116 Aktiv.: 19.68 Kraj: Koroška Bela
|
Objavljeno: Čet Jan 07, 2021 8:01 pm Naslov sporočila: |
|
|
Pozdravljeni, z večjim delom sem zaključil, sedaj pa k problemu, ki mi še ostaja.
Glede na take post - težave s passing argument differ in signedness sem sestavil tale mali testni programček. V njem sem poskusil upoštevat Tilz0r-jeve usmeritve, ki mi niso čisto jasne.
V programčku sta na začetku dve različni definiciji (po signedness), ena komentirana da sem lahko prevedel z AVR studiem.
na dnu programa pa je še copy paste izpisa warningov za obe varianti.
Tole:
Koda: |
#include <stdio.h>
#include "lcd_lib.c"
#include <avr\io.h>
//ena vrsta definicije je komentirana zaradi možnosti kompilanja
//pri tej definiciji vržeta napako oba LCDstringa, sprintf pa ne (NAPAKA1)
char tekst [20];
//pri tej definiciji vržeta napako prvi LCDstring in sprintf.
//Drugi LCDstring pa ne (NAPAKA2)
//unsigned char tekst [20];
int main (void)
{
while (1)
{
//Rezultat obojega je izpisana beseda "Napiši" na ekranu (pozicija 0,0)
LCDstring ("Napisi",0,0);
sprintf (tekst, "Napisi");
LCDstring (tekst,0,0);
LCDclr();
}
}
/* Copy/paste napake 1 (prva definicija)+++++++++++++++++++++
../Test.c: In function 'main':
*./Test.c:22:1: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'char *'
*./Test.c:25:1: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'char *'
Copy/paste napake 2 (druga definicija)++++++++++++++++++++
':../Test.c: In function 'main':
*./Test.c:22:1: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'char *'
*./Test.c:24:1: warning: pointer targets in passing argument 1 of 'sprintf' differ in signedness
c:\program files\atmel\avr tools\avr toolchain\bin\../lib/gcc/avr/4.5.1/../../../../avr/include/stdio.h:669:12: note: expected 'char *' but argument is of type 'unsigned char *'
*/
|
Če je rešitev samo v napačni definiciji spremenljivke "tekst", bi poprosil za usmeritev na pravo pot. S pointerji nisem ravno na ti, tako da je tu lahko rešitev.
Ker pa mogoče to ni tako lahko, pa prilagam še knjižnico za LCD, z njenimi definicijami funkcij. Da se lahko vanjo pogleda ali pa celo posimulira v AVR studiu, če si kdo lahko vzame čas.
Opis: |
|
 Download |
Ime datoteke: |
lcd_lib.c |
Velikost datoteke: |
7.38 KB |
Downloadano: |
1 krat |
Opis: |
|
 Download |
Ime datoteke: |
lcd_lib.h |
Velikost datoteke: |
3.7 KB |
Downloadano: |
1 krat |
|
|
Nazaj na vrh |
|
 |
mato1111 Član

Pridružen-a: Pet 28 Dec 2012 14:42 Prispevkov: 538 Aktiv.: 5.47 Kraj: Vrhnika
|
Objavljeno: Čet Jan 07, 2021 9:26 pm Naslov sporočila: |
|
|
Za string bo definicija: char tekst [20];
Je pa zanimivo to da imaš v .h datoteki definirano kot void LCDstring(uint8_t*, uint8_t, uint8_t); v .c pa kot void LCDstring(unsigned char* data, unsigned char x, unsigned char y).
Daj popravi in daj v obeh enak tip void LCDstring(char* data, unsigned char x, unsigned char y) ter probaj če bo potem OK.
Jaz za prepis/kopiranje stringov uporabljam funkcijo strcpy.
Koda: |
strcpy(tekst,"Napisi"); //Vkljucit moras se knjiznico <string.h>
|
Še to če kje vidiš da funkcija prejme parameter char data[] ali pa char* data je ubistvu isto ker oboje kaže na lokacijo prvega znaka v stringu.
|
|
Nazaj na vrh |
|
 |
tilz0R Član


Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 864 Aktiv.: 8.20 Kraj: Črnomelj
|
Objavljeno: Čet Jan 07, 2021 10:59 pm Naslov sporočila: |
|
|
Tudi sprintf uporabljaš narobe.
Če že, potem tako:
Koda: |
sprintf (tekst, "%s", "Napisi");
|
strcpy je boljše, še boljše strncpy.
Lojzek, če potrebuješ razlago v voice obliki, sem na voljo ali na zoom ali na mobitel. Več na https://majerle.eu za številko.
_________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3116 Aktiv.: 19.68 Kraj: Koroška Bela
|
Objavljeno: Pet Jan 08, 2021 11:48 am Naslov sporočila: |
|
|
@mato1111 in tilzOR:
ubogal sem nasvet mato-ta voila Brez warningov
V .c in .h knjižnicah sem dal vse na char in unsigned char. Prav tako v programu tekst definiram kot char. In dela.
Sem pa pri tem ugotovil, da prevajalnik (dokaj) dobro prebavi uint8_t in unsigned char in njuno navzkrižno uporabo.
Dokaj zato ker že berem da tudi to ni nujno enako.
Nista pa enaka int8_t in char. Pri tem pa kompiler res dela razliko. Milslim da še posebej ne mara int8_t oblike
Torej, hvala obema za pomoč. Sedaj pa urediti pravi program. Če je samo to, bom hitro skozi.
PS še odgovor za tilzor-ja... Prikazan sprintf je samo za poenostavljen primer. Drugače ga uporabljam za sestavo stringa iz besed in cifer. Za v primeru prikazano uporabo je namreč nesorazmerno "spominsko požrešen" v primeri s sam "LCDstring"
|
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3116 Aktiv.: 19.68 Kraj: Koroška Bela
|
Objavljeno: Pet Jan 08, 2021 12:24 pm Naslov sporočila: |
|
|
Evo mene nazaj.
V nekaj minutah sem se rešil cca 70 warningov in tako sedaj ostajajo še trije nepomembni.
Pa še dve knjižnici za LCD in TWI lcd, ki ju na začetku pisanja programa uporabim, sem popravil.
Hvala še enkrat, Branko
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 46 dni
Powered by phpBB © 2001, 2005 phpBB Group
|