Je to tedy spíš Céčkový problém, ale nevěděl jsem kam to dát.
Konkrétně - dá se jako parametr řetězcové funkce dát struktura?
Vysvětlím proč:
potřebuju odesílat některé proměnné z MCU do PC a pak změněné vrátit a nejjednodušší se mi zdálo sdružit ty kterých se to týká do struktury
char pcBuffer[7];
struct
{
char teplota;
char tlak;
char den;
char mesic;
int rok;
char nula=0;
} dataDoPc;
puts(dataDoPc); //nebo
strcpy(dataDoPc,pcBuffer);
to samozřejmě nejsou ony proměnné
překladač proti použití struktury jako parametru řetězcové funkce nic nemá, ale taky to nic nedělá.
Mělo by to jít, když místo struktury samotný použiješ pointer na ni.
Struktury se totiž předávají hodnotou, kdežto řetězec je pole a to se předává odkazem (do funkce se předává pointer).
Strukturu jako návratový typ použít můžeš. Jen zvaž, jesli není vhodnější opět pointer, protože pak se ta struktura nekopíruje, pracuje se na datech v původním umístění. Záleží co potřebuješ.
Ak s tou strukturou, polom, hocicim inak nepracujes, prekladac ich kludne moze z kodu vyhodit ako zbytocne. Naco by kopiroval nieco niekde, ked tam o to ani pes nezavadi. to je obrovska vyhoda optimalizacii prekladaca. Skus vypnut optimalizacie (napr. v GCC -O0) a hlavne napis co to robi ked to “nic to nedela”.
Inak ako pise Piityy. Funkcii (napr. strcpy) je uplne jedno ako Ty chapes zhuk bajtov na ktore posielas odkaz. Pre Teba je to struktura/pole/hocico, pre funkciu je to suvisly pas bajtov ktore prenesie odniekal niekam az pokial nenarazi na kod /0. Potom prestane. V tom je sila ukazatelov.
Takze ak teplota == /0, potom funkcia naozaj urobi to, ze hned skonci, lebo narazila na koncovy znak.
No jo, tenhle detail (že se může nula vyskytnout dříve než na koci) mě v tu chvíli ani nenapad .
Lou: Každopádně pro zkopírování obsahu struktury někam můžeš využít sizeof() a for(). Jesli ji nepotřebuješ kopírovat, ale stačí reference, tak vem pointer na strukturu, a předej ho přetypovanej jako pointer na polech uchar.
Asi by se lépoe nafrhovalo řešení, kdybysmě měli k dispozi konkrétní kus kódu a požadovanou funkčnost.
Původní záměr byl vůbec s ničím nemanipulovat, nic nikam nekopírovat jen řadu dat nerozházených po celé paměti odeslat přes UART do PC za pomoci funkce void puts(char *str); která nehledá nulový znak ale \n (10, 0xA) - je sice pravda, že některý byte může mít tuto hodnotu, ale není problém to zrušit a předělat ji třeba na void puts(char *str,char len); a pak proměnné opět naplnit funkcí *gets(char *str,unsigned char len);
Přiznám se, že ten union bylo první co mě napadlo, ale nešlo mi to, protože jsem to nejdřív dělal blbě[code]union
{
tohle mi zas nevzal překladač i když třeba v MPlabu to jdeunion
{
struct
{
char teplota;
char tlak;
char den;
char mesic;
int rok;
char nula;
} SdataDoPc;
char pcBuffer[7];
}uniPc;
A preco sa neda pouzit ukazatel na strukturu pretypovany na ukazatel na char? Toto mi stale nejako unika. Co konkretne v tomto pripade riesi union ked funkcia strcpy() aj tak robi s ukazatelmi? Dakujem za objasnenie.
Ukazatel na strukturu se samozřejmě dá použít jako parametr řetězcové funkce. Union je v tomto případě opravdu zbytečný.
Jediný problém je v tom, že funkce obsahující v názvu str jsou asi primárně určené pro znakové řetězce a končí vždy po nalezení hodnoty 0.
Pro kopírování struktur, polí atd. jsou tedy určené funkce s mem - třeba **void *memcpy(void dest,void src,unsigned char n);
Dnes už asi nedohledám, kde byla na začátku chyba, ale už to funguje.
Musel jsem pouze upravit funkci puts z knihovny CV výše uvedeným způsobem.
to doverne poznam. Clovek sa s niecim babre dva tri tyzdne a nie je z to ani ziadne poucenie pre inych, lebo to zacne casom jednoducho fungovat
A neviem, akej chyby sa mam vyvarovat v buducnosti, respektive ci tam ta chyba nahodou neostal, len sa momentalne neprejavuje.
Ale presne toto robi zivot programatora jednocipakov velmi zle platenou ale o to viac zaujimavejsou dobrodruznou cestou len o chlp bezpecnejsou ako boli cesty Zigmunda a Hanzelky:-)