IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Deklarace proměnných

Aktivity
Avatar
Vítězslav Škrabal:7.2.2015 12:03

Zdravím
Zkouším přeložit projekt pro mikročip STM32F100 v GCC a mám pár warmingů
na řádce

plen=fill_tcp_data_p(buf,plen,PSTR("<br><p>User tlacitko <b>stisknuto</b>.<br><br><br></p>\n"));

mám warming

Description     Resource        Path    Location        Type
pointer targets in passing argument 3 of 'fill_tcp_data_p' differ in signedness [-Wpointer-sign]        simple_server.c /VL_ETHER37/src line 149        C/C++ Problem

deklarace proměnné je tato

extern uint8_t fill_tcp_data_p(uint8_t *buf,uint16_t pos, const uint8_t *progmem_s);

infos

Description     Resource        Path    Location        Type
expected 'const uint8_t *' but argument is of type 'char *'     ip_arp_udp_tcp.h        /VL_ETHER37/src line 42 C/C++ Problem

další řádek

plen=fill_tcp_data(buf,plen,password);

warming

extern uint8_t fill_tcp_data(uint8_t *buf,uint16_t pos, const uint8_t *s);

infos

extern void make_udp_reply_from_request(uint8_t *buf, uint8_t *data,uint16_t datalen,uint8_t port);

ani nevím jestli to mám správné protože už to dělám po druhé po poprvé když jsem chtěl odeslat správu tak se mi to tratilo což mě pořádně vytočilo nebylo by vhodné jak na jiných fórech napřed si to prohlédnout a pak odeslat? díky

 
Odpovědět
7.2.2015 12:03
Avatar
David.Landa
Člen
Avatar
Odpovídá na Vítězslav Škrabal
David.Landa:7.2.2015 15:17

První co vídím bez hlubšího zamyšlení:

extern uint8_t fill_tcp_data_p(uint8_t *buf,uint16_t pos, const uint8_t *progmem_s);

To je deklarace funkce -- předpokládám, že používáš nějakou kostru z intrenetu? .)
Někde voláš tuto funkci se špatným druhým argumentem, proto:

expected 'const uint8_t *' but argument is of type 'char *'
Editováno 7.2.2015 15:18
 
Nahoru Odpovědět
7.2.2015 15:17
Avatar
David.Landa
Člen
Avatar
Odpovídá na Vítězslav Škrabal
David.Landa:7.2.2015 15:21

Ano, máš pravdu, editace na fóru není nejlepší. Na druhou stranu můžeš příspěvek upravit po odeslání. Na jiném známém Unix/Linux serveru ho zase můžeš prohlédnou před odesláním, nikoliv však opravit.

Editováno 7.2.2015 15:22
 
Nahoru Odpovědět
7.2.2015 15:21
Avatar
Odpovídá na David.Landa
Vítězslav Škrabal:7.2.2015 15:50

Tak ten projekt je odtud http://mcu.cz/…t-n2898.html ten projekt je tady http://mcu.cz/…ether37b.zip to je hotový projekt a překládám ho v Atollic TrueSTUDIO for ARM Lite 5.2.1 nevíte jak to deklarovat dobře?díky za pomoc

Editováno 7.2.2015 15:52
 
Nahoru Odpovědět
7.2.2015 15:50
Avatar
Martin Dráb
Tvůrce
Avatar
Martin Dráb:7.2.2015 18:28

Jestli jsem to pochopil dobře, tak to varování vzniká proto, že daná funkce očekává ve svém parametru hodnotu typu uint8_t *, ale ty ji předáváš char *. Jelikož na daném čipu bude char * určitě 8bitový (nevím, co říká norma C o možných velikostech tohoto typu), tak by toto varování pro výslednou binárku nemělo nic znamenat.

Dokonce bych řekl, že toho varování si jsou autoři projektu vědomi. U větších projektů se mi málokdy stalo, že by překlad proběhl bez jediného varování.

Nahoru Odpovědět
7.2.2015 18:28
2 + 2 = 5 for extremely large values of 2
Avatar
David.Landa
Člen
Avatar
Odpovídá na Vítězslav Škrabal
David.Landa:7.2.2015 18:59

Není to obecně košér, ale zkus si při kompilaci vypnout varování, které je brané jako chyba. Pokud bys kompiloval s GCC, pak když nastavíš příznak -Werror, pak všechny varování kompilátoru jsou brány jako chyby. Pokud to vypneš, projde ti spousta věcí -- avšak i ty, které není dobré podceňovat. Druhá možnost je zkusit parametr funkce přetypovat na ukazatel na uint8_t. Zřejmě někde tu proměnnou, kterou dosazuješ musíš deklarovat sám, pak ji tedy rovnou deklaruj tak, jak to chce kompilátor.

Typ uint8_t je vždy 8 bitů, char nemusí, i když většinou bude.

 
Nahoru Odpovědět
7.2.2015 18:59
Avatar
David.Landa
Člen
Avatar
Odpovídá na Vítězslav Škrabal
David.Landa:7.2.2015 19:14

V souboru simple_server.c voláš tuto funkci a předáváš ji řetězec jako ukazatel na char jak jistě víš.například na řádce 86:

"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>"
Editováno 7.2.2015 19:14
 
Nahoru Odpovědět
7.2.2015 19:14
Avatar
Odpovídá na David.Landa
Vítězslav Škrabal:7.2.2015 19:28

To jsem ten projekt nepsal já :) to jsem převzal už hotový projekt. Mě to taky zarazilo že tam cpe string i když si možná pomyslíš že dělám machra když mě to teď ukázal ale říkám že jsem nebyl "vychovávám v C" k mě veliké smůle protože prajazyk pro všechno je C díky

 
Nahoru Odpovědět
7.2.2015 19:28
Avatar
David.Landa
Člen
Avatar
Odpovídá na Vítězslav Škrabal
David.Landa:7.2.2015 19:33

Hodně zdaru, C je lehké v knize, těžké v projektu -- zkus si to přetypovat, mustr je zde:

char * message1 = "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>";
uint8_t * message2 = (uint8_t *) m1;
Editováno 7.2.2015 19:33
 
Nahoru Odpovědět
7.2.2015 19:33
Avatar
David.Landa
Člen
Avatar
David.Landa:7.2.2015 19:37

Pardon, m1 má být message1 -- nebo obráceně -- šotek .)

Editováno 7.2.2015 19:38
 
Nahoru Odpovědět
7.2.2015 19:37
Avatar
Odpovídá na David.Landa
Vítězslav Škrabal:7.2.2015 20:00

No jestli to nevadí ve výsledné funkcionalitě tak to předělávat nebudu a toto bych potřeboval vědět ve výsledné binárce mělo být na konci srozumitelný text v tomto případě jednoduchá webová stránka když jsem natáhl binárku pomocí ST-Linku tak jsem tam nic nenašel nebo je to nějak zakódované jako je to delphi v typu

record a:string;a:='hura'

d9ky

 
Nahoru Odpovědět
7.2.2015 20:00
Avatar
David.Landa
Člen
Avatar
Odpovídá na Vítězslav Škrabal
David.Landa:7.2.2015 20:30

Většina triků s uintX_t je kvůli přenositelnosti, protože velikost základních typů je víceméně závislá na architektuře. Jestli to není mission/safety critical/portable projekt, tak bych se tím netrápil.

Editováno 7.2.2015 20:31
 
Nahoru Odpovědět
7.2.2015 20:30
Avatar
Odpovídá na David.Landa
Vítězslav Škrabal:7.2.2015 20:56
není mission/safety critical/portableprojekt

co to je :( ?

 
Nahoru Odpovědět
7.2.2015 20:56
Avatar
David.Landa
Člen
Avatar
Odpovídá na Vítězslav Škrabal
David.Landa:7.2.2015 22:32

To je trochu vtip .) Ale pro vysvělení:
Pokud potřebuješ, aby byl projekt portován na různé architektury, můžeš vyžadovat typ, který má všude stejnou velikost, pak používáš uintx_t, Třeba při práci s grafikou -- úplně blízko železu (hardware) -- tzv. low-level programování, mikročipy atd. Jak sem psal, není potřeba se tím teď zaobírat, ale při programování věcí, které nesmí havarovat -- spadnout -- tzv. kriticky bezpečné aplikace -- musíš znát přesně svoji cílovou architekturu, kompilátor a specifikaci jazyka. Ani já neoplývám těmito znalostmi na takové úrovni, abych se do něčeho takového pouštěl. Pokud máš zájem, podívej se na jazyk Ada a něco kolem toho: http://www.adacore.com/…rs/about/ada

Editováno 7.2.2015 22:33
 
Nahoru Odpovědět
7.2.2015 22:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.