Dá se se strukturou pracovat jako z řetězcem?

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š.

Co rozumies pod slovnym spojenim “nic to nedela”?

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 :smiley:.
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.

A co takhle unie. Pomocí ní může pole char a strktura sdílet stejné místo v paměti, takže k datům lze přistupovat jak přes char a i přest strukturu.

union 
{
       char pcBuffer[7];
       SdataDoPC dataDoPC;
};

SdataDoPC je přirozeně jméno struktury.

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
{

char pcBuffer[7];
char teplota;
char tlak;
char den;
char mesic;
int rok;
char nula=0;
}uniPc;[/code]

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ž teprve toto funguje

[code]typedef struct
{
char teplota;
char tlak;
char den;
char mesic;
int rok;
char nula;
} SdataDoPc;

union
{
char pcBuffer[6];
SdataDoPc dataDoPc;
}uniPc;

puts(uniPc.pcBuffer);
*gets(uniPc.pcBuffer,7);[/code]

takže dík všem, ale hlavně Technikovi za radu jak vecpat strukturu do unionu :slight_smile:

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.

Tak abych to sesumýroval:

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 :frowning:
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:-)

Akurat od programu jednočipu sa očakava bezvadna funkcia narozdiel od windowsu