Új hozzászólás Aktív témák
-
tototos
addikt
-
tototos
addikt
válasz
DrojDtroll #5010 üzenetére
Hát mekkora méretet gondolsz a tömbnek? A foglalások számát nem közli a feladat így nem tudod mekkora tömbre van szükséged. A struktúra meg sokkal átláthatóbbá teszi a kódot, mint ha külön tömbben tárolod az összes adatot. Tehát ha már tömbbel szeretnéd megoldani akkor is inkább egy struktúra tömb a javasolt szerintem,
-
tototos
addikt
Én több hibát is látok. Először is ha egy tömb elemét akarod címezni akkor nem () kell hanem []
Valamint az strlen nem fogja megmondani neked a tömb méretét, csak egy string hosszát. Tömb méretet belekódolod a programba, mivel itt statikus foglalásról van szó teljesen járható út.
Másik hiba hogy az if után ha nem blokkosítod az utasításokat, akkor az összes kapacitást ki fogja írni, mert az if csak a névre lesz hatásra.main fv:
beolvas(&tomb(i)); helyett beolvas(&tomb);nagyobb fv:
void nagyobb(Pendrive *tomb, int size)
{
int i;for(i = 0; i < size; i++)
{
if(tomb(i).kapacitas > 2)
{printf("%s",tomb(i).nev);
printf("%i",tomb(i).kapacitas);
}
}
} -
tototos
addikt
válasz
kmisi99 #4786 üzenetére
hát itt van elég sok gond.
Ha egy függvény mutatót kér paraméternek akkor hiába írod oda, hogy double* még nem fogja átadni a változó címét.
Másrészt dekralálsz változókat a main-ben min és max néven. Majd ezeknek a címét akarod átadni a függvénynek, a függvényen belül meg ezeket a címeket akarod átírni a tömb elemeinek címére?
Döntsd el, hogy a maxot és mint szeretnéd külön tárolni, vagy elég ha a tömb bizonyos elemeire mutatnak a pointerek. -
tototos
addikt
Kicsit csatlakoznék mint informatikus diplomával rendelkező emberke. Tény, hogy az ember akkor tanul a legjobban ha tudja is mire írja programot mi hogyan működik. De sztem az arduinonak és más hasonló ilyen áramkörnek az a lényege, hogy kis efforttal már tudsz ledet villogtatni, anélkül hogy mindenféle kapcsolást megnéztél volna. Van olyan ember aki itt megáll, csak kipróbáűlta. Aki jobban érdekel a dolog az neki fog állni és kiegészítő saját kis áramkörrel, vagy elkezdi megismeri pontosan mi is van a nyákon és miért.
Én anno önálló laborként csak beágyazott szoftverfejlesztéssel foglalkoztam. Semmi hardver, tisztán csak szoftver használtam a gyári könyvtárakat és hittem a fejlesztőknek hogy jól csináltak mindent. Szakdogának már nyákot terveztem 0 előzetes tudással.
Amit én ajánlok az arduino mellé és sztem árban is nagyon baráti az egy Nucleo board
Kicsit drágább de nagyobb tudású vezérlővel: stm32f4-discovery
és már kijelzővel is ellátott csúcs stm32 mikrovezérlő: stm32f429i-discoveryFejlesztőkörnyezetnek lehet eclipse+gcc+openocd. De ahol ez összeintegrálva megtalálható az a CooCox környezetben. 1 éve használom és eddig minden szükséges dolgot megtaláltam benne.
-
tototos
addikt
Sziasztok!
Egy két másodperces késleltetőt szeretnék implementálni. Ehhez tudom az aktuális időt, ennek is a másodperc értékét szeretném felhasználni. Azt szeretném meghatározni, hogy meddig várjak, tehát az aktuális másodperchez hozzáadok 2-t. Csak ugye 60, 61, 62 esetben nekem 0, 1 és 2 kell. Erre van valamilyen bitműveletes kód, vagy simán if és mask?
Most ezt képzeltem
int act_sec = GetSec();
int wait = act_sec+2;
if(wait>=60)
{
wait = wait&0x03;
}
while(act_sec<wait)
{
act_sec=GetSec();
} -
tototos
addikt
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.
-
tototos
addikt
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
addikt
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
addikt
Van különbség a két sor között?.
char** tokens;
free(*(tokens + i));
vs.
free(tokens[i]); -
-
tototos
addikt
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. -
tototos
addikt
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
addikt
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
addikt
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.
-
tototos
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
addikt
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
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Counter-Strike: Global Offensive (CS:GO) / Counter-Strike 2 (CS2)
- Milyen légkondit a lakásba?
- Goddess of Victory:Nikke
- Fegyencedzés - calisthenics - street-workout
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Videó stream letöltése
- Trollok komolyan
- Extra D betűvel jöhet GeForce RTX 5090D utódja
- Egyre csak fejlődik az AI, emberek tízezreit rúgja majd ki a BT
- exHWSW - Értünk mindenhez IS
- További aktív témák...
- BESZÁMÍTÁS! ASUS ROG STRIX Z270G GAMING WiFi alaplap garanciával hibátlan működéssel
- BESZÁMÍTÁS! AMD FX-8320 8 mag 8 szál processzor garanciával hibátlan működéssel
- Wacom Cintiq DTK-2260 - Digitális rajztábla
- 10% -tól elvihető.Országosan a legjobb BANKMENTES részletfizetési konstrukció! ACER PREDATOR HELIOS
- BESZÁMÍTÁS! GIGABYTE H77-DS3H H77 chipset alaplap garanciával hibátlan működéssel
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest