Új hozzászólás Aktív témák
-
tototos
őstag
Sziasztok!
Egy kis segítségre lenne szükségem C-s téren.
Adott egy struktúrám, amiben van mindenféle változó. Azt szeretném hogy ezeknek a változóknak csak egyszer lehessen értéket adni, és utána ne lehessen megváltoztatni.
A dolog érdekessége hogy a struktúrából létrehozok egy tömböt és egy függvényen belül adok értéket a struktúrák elemeinek. Ha az elemeket const-al deklarálom akkor beszól a fordító hogy read-only value.
Van valami megoldás erre a problémára?Köszi a segítséget
-
tototos
őstag
válasz buherton #3813 üzenetére
Kicsit vázolom a helyzetet, hogy most mi van készen.
.h fájl:
typedef struct{
Signal_Types name;
uint16_t id;
uint8_t pos;
uint8_t length;
uint8_t order;
float factor;
float offset;
uint16_t binValue;
float realValue;
}Signal_TypeDef;
Ezek közül a binValue és realValue-n kívül mindegyik csak egyszer kap értéket..c fájl:
static Signal_TypeDef SIGNALS[9];
uint8_t CAN_Signal_Init()
{ /*Itt kap értéket a struktúra tömb */}
uint8_t get_Signal(Signal_struct** signal)
{ /*Ezt a függvényt hívják meg a fejlesztők hogy megkapják a signal struktúrát */} -
tototos
őstag
válasz buherton #3819 üzenetére
Köszi szépen. Délután kipróbálom a dolgot.
MCU-ra írom, egy kommunikációs modul kiegészítése lesz. Azért használok pointert hogy csak egyszer legyen tárolva a struktúra, és azt lehessen átadni. Sajnos ahogy néztem, az egész struktúrát nem tudom átadni, csak egyenként az elemeket. Az lett volna jó ha tudok egy get függvényt írni ami visszaadja a struktúrát és ha valaki a struktúra elemét akarja átírni akkor beszól a fordító, vagy csak egyszerűen nem történik meg a művelet futás közben. -
tototos
őstag
válasz buherton #3824 üzenetére
És olyat nem lehet hogy ne a fv visszatérési értéke legyen a változó?
ilyenre gondolok:
valami.c:
fooTypeDef localfoo;
void set(const fooTypeDef * const foo)
{
foo.ifoo=0; //ez csak egyszer hívódik meg
}
void get(const fooTypeDef ** const foo)
{
localfoo.cfoo = a+b; //ez az értékadás minden hívásnál megtörténik
*foo= &localfoo;
}
main.c //ezt hívják majd a fejlesztők
footypedef* myfoo;
get(&myfoo);
myfoo->ifoo = 5; //erre vagy hiba vagy ne hajtódjon végre
myfoo->cfoo = 4; // ez annyira nem nagy hiba mert a legközelebbi hívásnál úgyis felülíródik -
tototos
őstag
Sziasztok!
A múltkori struktúrás kérdésemre kapott válaszokat köszönöm. Sajnos valamiért nem akart összejönni a dolog, így kicsit módosítottam a dolgokon.
Adott egy .c fájl amiben megvalósítom a meghívható get_Signal függvényt
ennek a paramétere egy struktúrára mutató pointer, amiben át kell adnom egy lokálisan tárolt struktúrát, aminek az értékeit csak egyszer adom meg és onnantól ne lehessen módosítanisignal.h:
typedef struct{
Signal_Types name;
uint16_t id;
uint8_t pos;
uint8_t length;
uint8_t order;
float factor;
float offset;
}Signal_TypeDef;
signal.c
static Signal_TypeDef SIGNALS[9];
uint8_t CAN_Signal_Init()
{
SIGNALS[NEW_SIGNAL_12].name = NEW_SIGNAL_12__NAME;
SIGNALS[NEW_SIGNAL_12].id = NEW_SIGNAL_12__ID;
SIGNALS[NEW_SIGNAL_12].pos = NEW_SIGNAL_12__POS;
SIGNALS[NEW_SIGNAL_12].length = NEW_SIGNAL_12__LENGTH;
SIGNALS[NEW_SIGNAL_12].order = NEW_SIGNAL_12__ORDER;
SIGNALS[NEW_SIGNAL_12].factor = NEW_SIGNAL_12__FACTOR;
SIGNALS[NEW_SIGNAL_12].offset = NEW_SIGNAL_12__OFFSET;
...
}
uint8_t get_Signal(SignalName name, Signal_struct** signal)
{
*signal = &SIGNALS[name];
}
main.c:
Signal_Struct* signal;
get_Signal(NWE_SIGNAL_12, &signal);
signal->id = 0x200; //ez ne tudjon lefutni vagy jelezzen a fordító hibátAz utolsó sort kellene valahogy megoldanom, hogy ne tudjak a struktúrába módosítani.
-
tototos
őstag
válasz Geresics #3854 üzenetére
akkor kell csinálnod egy beolvas függvényt
void beolvas(int array[5][5])
{
int i,j;
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("Soron kovetkezo elem: ");
scanf("%d", &array[i][j]);
}
}
}
ez pedig a main:
int main()
{
int a[5][5];
int i, j; /* i lesz az oszlop száma */
int szam1, szam2, mem;
/* beolvasás */
printf("\nAdja meg az 5x5-os tomb elemeit! Minden elem utan usson ENTER-t!\n");
beolvas(a);
return 0;
} -
tototos
őstag
válasz Geresics #3856 üzenetére
Attól hogy a függvény paraméterben is a-nak nevezed még nem fogsz arra hivatkozni. Amikor meghívod a beolvas(a) függvényt akkor fogja az array-t az a-ra állítani.
a csere meg kb így néz ki:
void csere(int a[5][5], int oszlop1, int oszlop2)
{
int i; //sorokat jelöli
int temp = 0;
for(i=0;i<5;i++)
{
temp = a[i][oszlop1 - 1];
a[i][oszlop1 - 1] = a[i][oszlop2 - 1];
a[i][oszlop2 - 1] = temp;
}
} -
tototos
őstag
válasz Geresics #3889 üzenetére
na figyi, a szamlalas függvényed honnan tudja a beolvasott szöveget? attól mert ugyanazt a nevet használnod még az nem lesz ugyanaz, plusz a változóknak illik kezdőértéket adni
void beolvas(char* szoveg)
{
printf("Adjon meg egy max. 70 karakter hosszu szoveget, majd usson ENTER-t!\n");
gets(szoveg);
}
int szamlalas(char *szoveg)
{
int db [B]= 0[/B];
int i [B]= 0[/B];
while (szoveg[i]!='\0' || szoveg[i]!='.')
{
if (szoveg[i]=' ') db++; // ha nem használsz {} jeleket akkor érdemes egy sorba írni az if-fel
i++;
}
return db;
} -
tototos
őstag
Sziasztok!
Olyat lehet csinálni hogy létrehozok egy struktúrát amiben néhány változónak void típust adok.
Majd ebből a struktúrából létrehozok egy tömböt. És a tömb eleminek adom meg a pontos típust?
pl:typedef struct{
int ID;
void data;
}myStruct;
myStruct[2] array;
int data = 2;
array.data = (int)data;
} -
tototos
őstag
Sziasztok!
Egy kis preprocesszor segítség kellene.
A következőt szeretném valahogy fordítás előtt megcsinálni.
Adott a következő 2 define#define CHG_I2C I2C1
#define GPIO_AF_I2C1 0x000Ehhez kellene egy macro ami kb így nézne ki.
#define CONCAT(a,b)
ennek azt kellene csinálni hogy
CONCAT(GPIO_AF_,CHG_I2C) meghívása után a GPIO_AF_I2C1 legyenPróbálkoztam sok dologgal de még nem sikerült rájönni melyik a jó kombináció.
-
tototos
őstag
Sziasztok!
Mi a különbség a két függvény között? Mi alapján kell használni az externt és mi alapján nem?
extern void do(int,int)
void do (int,int) -
tototos
őstag
Sziasztok!
Egy kis segítwséget szeretnék kérni.
Adott egy maximum 8 bájtos tömböm, amibe maximum 16 bites változókat szeretnék beszúrni bizonyos bitpozíciókra. A bitpozíciók a nyagságból adódóan 0-tól 63-ig lehetnek számozva. Az első megoldásom az lett volna hogy a tömb helyett használok egy 64 bites változót de ennek a kezelését nem támogatja az eszköz. Tudnátok erre a problémára valamilyen optimális megoldást mondani?
Köszönöm
-
tototos
őstag
válasz dabadab #4234 üzenetére
Köszi.
Hát most végül működik 64 bites változóval de nem tudom mennyire optimális.
Ez az amikor kiveszek egy tömbböl elemeketuint8_t LINReceiveBuffer[8];
LINScheduleTable[ScheduleTableIndex].LINScheduleTableFrame.LINFrameValue = 0;
for (Index = 0;Index < ResponseDataByteIndex-1;Index++)
{
LINScheduleTable[ScheduleTableIndex].LINScheduleTableFrame.LINFrameValue += (LINReceiveBuffer[Index+1] << ((LINScheduleTable[ScheduleTableIndex].LINScheduleTableFrame.LINFrameDataLength - 1 - Index)*8));
}Ezzel rakom be:
if (ResponseDataByteIndex < LINScheduleTable[ScheduleTableIndex].LINScheduleTableFrame.LINFrameDataLength)
{
DataCheck = (uint8_t)(LINScheduleTable[ScheduleTableIndex].LINScheduleTableFrame.LINFrameValue >> (LINScheduleTable[ScheduleTableIndex].LINScheduleTableFrame.LINFrameDataLength - 1 - ResponseDataByteIndex)*8);
LINChecksumBuffer[ResponseDataByteIndex+1] = DataCheck;
USART_SendData(USART6,DataCheck);
ResponseDataByteIndex++;
} -
tototos
őstag
válasz Jester01 #4238 üzenetére
Köszi.
Melyik a jobb megoldás ha veszek egy 64 bites változót, és ebbe rakom be az adatokat, majd ezt bájtokra bontva elküldöm, vagy az ha a tömbbe rakom be a fenti módszerrel az adatokat és a tömböt küldöm ki?
Ugyanezt kell visszafele is, tehát van egy uint8_t tömb[8] tömb, amiből ki kell nyernem az adat pozíciótól az adott hosszú adatokat.@dabadab: Bájtosával kell kiküldenem az adatokat, és úgy is kapom őket. Tehát vagy alapból bájt tömbben tárolom őket, vagy a 64 bites változómat darabolom bájtokra, valamint vételnél visszafele.
[ Szerkesztve ]
-
tototos
őstag
Ha egy 64 bites változóban szeretném átírni a biteket az 5. bittől kezdődően 7 bit hosszan akkor hogy kellene kimaszkolni, hogy a többi bit ne változzon? Nem jut eszembe semmi értelmes általános megoldás. AZ offszet és a hossz változhat.
Köszi
-
tototos
őstag
Sziaszto!
Egy érdekes problémával állok szembe. C-ben szeretnék stringeket darabolni. Ez egyenlőre nem tűnik nagy feladatnak, van egy függvényem ami szépen darabolja a dolgokat. A gond ott kezdődik, hogy amikor fel akarok szabadítani a feldarabolt részeknek allokált területet akkor egyszer a free függvény váratlan hibát generál és a mikrovezérlőm elmegy egy végtelen ciklusba.
EZ lenne a daraboló függvény:
char** str_split(char* a_str, const char* a_delim)
{
char** result = 0;
size_t count = 0;
char* tmp = a_str;
char* last_comma = 0;
size_t index;
/* Count how many elements will be extracted. */
while (*tmp)
{
for (index = 0; index < strlen(a_delim); ++index)
{
if (*(a_delim+index) == *tmp)
{
count++;
last_comma = tmp;
}
}
tmp++;
}
/* Add space for trailing token. */
count += last_comma < (a_str + strlen(a_str) - 1);
/* Add space for terminating null string so caller
knows where the list of returned strings ends. */
count++;
result = malloc(sizeof(char*) * count);
if (result)
{
size_t idx = 0;
char* token = strtok(a_str, a_delim);
while (token)
{
assert(idx < count);
*(result + idx++) = strdup(token);
token = strtok(0, a_delim);
}
//assert(idx == count - 1);
*(result + idx) = 0;
}
return result;
}Ez pedig egy része a kódnak:
tokens = str_split(line, ",;");
if (tokens)
{
LINScheduleTable[frameIndex].Frame.SignalIDs_lda16[signalIndex] = atoi(*tokens);
LINScheduleTable[frameIndex].Frame.SignalOffsets_lda8[signalIndex] = atoi(*(tokens+1));
for (i = 0; *(tokens + i); i++)
{
free(*(tokens + i));
}
free(tokens);
}Az érdekesség, hogy ez a részlet meghívódik kb 25-ször, és 26. lépésnél száll el.
Láttok valami hatalmas hibát a kódban?Köszi
-
tototos
őstag
válasz buherton #4248 üzenetére
Köszi Nem tudtam hogy ennyire tiltott. Azt tudtam hogy beágyazott környezetben kb halál, de most szükségem lenne rá sajnos.
Van az oprendszerben saját heap kezelő. Sajnos ez is kiakad egy ponton. Amikor fel akarom szabadítani a char** változót.
Megnéznétek a kódot, hogy biztosan jól használom a dolgokat? Sajnos valami programozási hibára gyanakszom.[ Szerkesztve ]
-
-
tototos
őstag
Van különbség a két sor között?.
char** tokens;
free(*(tokens + i));
vs.
free(tokens[i]); -
tototos
őstag
Sziasztok!
Egy újabb érdekes esettel fordulok hozzátok.
A split függvény helyett, egyik kollégám ajánlotta a sscanf függvényt, ami nekem pont tökéletes, lenne ha működne úgy ahogy szeretném.Adott a következő char[80] line = "48,8,10;\n\000\000age\000\070\000\060\000;\n\000\000;\n\000\000;\n\000\065,51;\r\n21,52;\r\n1, ..."
ebből s zámomra szükséges rész az ez: 48,8,10;\n\0
na ezt szeretném beolvasni így:
ret = sscanf(line,"%hhu%*1c%hhu%*1c%hhu;\n",&frameID,&frameLength,&frameDelay);
a ret értéke 3, de a frameID és a frameLength 0 a frameDelay az 10.Már próbáltam többféle képpen de egyszerűen nem akar jó lenni :S
-
tototos
őstag
Sziasztok!
Egy kis macro segítség kellene. A következő sorokat szeretném kiváltani macroval:
task_Function[0] = task1;
task_Function[1] = task2;
task_Function[2] = task3;
task_Function[3] = task4;
task_Function[4] = task5;
task_Function[5] = task6;
task_Function[6] = task7;
static portTASK_FUNCTION(task1,params){
portTickType xLastWakeTime;
const portTickType xFrequency = RTOS_tasks[0].period_ldu32 / portTICK_RATE_MS;
// Initialize the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
while(1)
{
RTOS_tasks[0].taskFunction(params);
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}
static portTASK_FUNCTION(task2,params){
portTickType xLastWakeTime;
const portTickType xFrequency = RTOS_tasks[1].period_ldu32 / portTICK_RATE_MS;
// Initialize the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
while(1)
{
RTOS_tasks[1].taskFunction(params);
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}
static portTASK_FUNCTION(task3,params){
portTickType xLastWakeTime;
const portTickType xFrequency = RTOS_tasks[2].period_ldu32 / portTICK_RATE_MS;
// Initialize the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
while(1)
{
RTOS_tasks[2].taskFunction(params);
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}
static portTASK_FUNCTION(task4,params){
portTickType xLastWakeTime;
const portTickType xFrequency = RTOS_tasks[3].period_ldu32 / portTICK_RATE_MS;
// Initialize the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
while(1)
{
RTOS_tasks[3].taskFunction(params);
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}
static portTASK_FUNCTION(task5,params){
portTickType xLastWakeTime;
const portTickType xFrequency = RTOS_tasks[4].period_ldu32 / portTICK_RATE_MS;
// Initialize the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
while(1)
{
RTOS_tasks[4].taskFunction(params);
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}
static portTASK_FUNCTION(task6,params){
portTickType xLastWakeTime;
const portTickType xFrequency = RTOS_tasks[5].period_ldu32 / portTICK_RATE_MS;
// Initialize the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
while(1)
{
RTOS_tasks[5].taskFunction(params);
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}
static portTASK_FUNCTION(task7,params){
portTickType xLastWakeTime;
const portTickType xFrequency = RTOS_tasks[6].period_ldu32 / portTICK_RATE_MS;
// Initialize the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
while(1)
{
RTOS_tasks[6].taskFunction(params);
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
}
}Meg lehet ezt valósítani? Köszi.
-
tototos
őstag
válasz dabadab #4541 üzenetére
RTOS fölé szeretnék írni egy burkolót, ami azt csinálja hogy a felhasználó megadja, hogy melyik funkciót szeretné futtatni, milyen periodicitással, és ezt az alatta lévő réteg elintézi. A felhasználónak nem kell a taskjában while loopot írni, meg várakoztatni adott ideig a taszkot, csak megírja mit csináljon a task és az lefut minden egyes periódusban. A létrehozható taszkok száma maximalizálva van, az a taskN. A bővítést szeretném macroval megoldani, hiszen minden task ugyanazt csinálja, csak ugye a hívandó funkció és a periódus változik.
[ Szerkesztve ]
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Crypto Trade
- Építő/felújító topik
- eBay-es kütyük kis pénzért
- Vicces képek
- Samsung Galaxy S23 Ultra - non plus ultra
- Debrecen és környéke adok-veszek-beszélgetek
- Kodi és kiegészítői magyar nyelvű online tartalmakhoz (Linux, Windows)
- Vodafone otthoni szolgáltatások (TV, internet, telefon)
- Fűnyíró topik
- Témázgatunk, témázgatunk!? ... avagy mutasd az Android homescreened!
- További aktív témák...
- EDIFIER R1700BTS hangfal pár makulátlan, új állapotban, 2 év hivatalos garanciával, alkalmi áron
- LG OLED55B23LA 2 Év GYÁRI GARANCIA
- Apple iPhone XR 128GB, Kártyafüggetlen, 1 Év Garanciával
- Gamer PC , i7 12700KF , RTX 3080 Ti , 64GB DDR5 , 960GB NVME , 1TB HDD
- Intel PC , i5 8500 , 1660 6GB , 32GB DDR4 , 512GB NVME , 500GB HDD
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: Ozeki Kft.
Város: Debrecen