Hirdetés

2024. május 4., szombat

Gyorskeresés

Hozzászólások

(#5801) artiny


artiny
őstag

Hol kellene megváltoztatni (hogyan) a szenzor érzékenységét - accelerometert 2g-re?
Egy IMU-9150 ,ezt a könyvtárat használom a szenzorhoz.

A register map, a datasheet a szenzorhoz.

Találtam egy ilyen részt a kódban - ebbena fáljban:

..
..
/* Full scale ranges. */
enum accel_fsr_e {
INV_FSR_2G = 0,
INV_FSR_4G,
INV_FSR_8G,
INV_FSR_16G,
NUM_ACCEL_FSR
};
...
...

a másik rész

const struct test_s test = {
.gyro_sens = 32768/250,
.accel_sens = 32768/16,
.reg_rate_div = 0, /* 1kHz. */
.reg_lpf = 1, /* 188Hz. */
.reg_gyro_fsr = 0, /* 250dps. */
.reg_accel_fsr = 0x18, /* 16g. */
.wait_ms = 50,
.packet_thresh = 5, /* 5% */
.min_dps = 10.f,
.max_dps = 105.f,
.max_gyro_var = 0.14f,
.min_g = 0.3f,
.max_g = 0.95f,
.max_accel_var = 0.14f
};

Itt ennél a résznél elég lenne .accel_sens = 32768/16, pl. a 32768/2 -vel osztanom és akkor már 2+/-g lenne beallitva az accelerometer érzékenységére ?

(#5802) ZTE_luky


ZTE_luky
aktív tag

Sziasztok! Tudnátok segíteni? Kell írnom egy programot (c) ami lefordít egy *.asm fájlt (egy adott programnyelv) Visual X-toy-ra (virtuális számítógép ami egy 1960-as gépet szimulál, és csak ezt a különleges utasításrendszerből álló *.asm fájt szedi be helyesen)

A lényeg h első sorban szedjünk be vmit getcharral szóközt sortörést ignoráljuk és nem szabad labeleket hazsználnunk, de én már itt elakatam.

#include<stdio.h>
#include<string.h>

#define SIZE 256

int main()
{
char c;
char buffer[SIZE];
int i = 0;
// char* bp;
//bp = &buffer[0];
while ((c = getchar()) != EOF)
{
c = getchar();
if(c != 0x20 || c != 0xA)
{
// *bp = c;
//bp++;
buffer[i] = c;
i++;
}
}
//bp = &buffer[0];
i = 0;
while(i < strlen(buffer))
{
printf("%04X\n", buffer[i]);
i++;
}
return 0;
}

Ez a c kódom, és ez az inputom:

ABCDEFG

tesztelésképpen néztem meg ezt az inputot, viszont csak ezt dobja ki outputra:

0042
0044
0046
000A

Ami BDF, szóval kidob minden második karakter és belerak egy sortörést, amikor azt ignorálnia kéne. nem értem mi a rossz. tudnátok segíteni?

[ Szerkesztve ]

(#5803) buherton válasza ZTE_luky (#5802) üzenetére


buherton
őstag

if(c != 0x20 || c != 0xA)

Ha nem space, akkor az igaz lesz. Ha space, akkor az nem lesz \n, vagyis az is igaz lesz.

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5804) axioma válasza ZTE_luky (#5802) üzenetére


axioma
veterán

A while-ban is elkered a getchar-ral a kovetkezot, majd benne van egy masik getchar a ciklustorzsben. Ez ket kulon lekeres, ezert csak minden masodikat dolgozod fel. A masodik felesleges.
(meg termeszetesen az elottem irt || -> && csere is kell ettol fuggetlenul)

[ Szerkesztve ]

(#5805) ZTE_luky válasza axioma (#5804) üzenetére


ZTE_luky
aktív tag

köszönöm szépen, mindkettőtöknek, kijavítva, működik :)

(#5806) ZTE_luky


ZTE_luky
aktív tag

Sziasztok, ismét én, zárójelben kezdő vagyok, és C nyelvben kellene egy programot megírnom ami lényegében felistem karaktereket (utasításokat) és lefordítja azokat.

pl: első sor: ADD R4 R5 RA
ADD-nak az utasításkódja 1, és összeadás a jelentése, az utána lévő registerek pedig: az 5-ös és az A-dik registerben lévő elemeket adja össze és rakja a 4-es regiszterre.

ezt a következőképp kéne kiiratni:
10:145A

tényleg nem fontos hoyg ez mire kell, lényeg hogy egy output file-t hozzunk létre egy inputból ezzel a c-vel ami sorokat hoz létre 10 11 12 13 stb stb.. kezdettel, rak utána egy kettőspontot, és kiírja a parancs megfelelőjét, hoyg azt le lehesen futtatni. Talán ha elolvassáto ka kódot rájöttök. nem is ez a lényeg. A lényeg az hogyha az input bármilyen érvénytelen karaktert tartalmaz írjon ki FFFF-et és álljon le, a szókö és sortörést ignorálja. úgy oldottam meg hogy beolvas egy sztringet, azt átírja, majd olvassa a kövit és az is, de valamiért nem fut le. azzal van gond hoyg nem áll le ( c != EOF) valamint nem olvassa be a következő sztringet (sort) ott a state inkrementálással van baj, valamiért. elég sokat foglalkoztam vele de nem megy, valaki legyen szíves segítsen köszönöm!

#include<stdio.h>
#include<string.h>
#define SIZE 9

//DEBUG -- Buffer Overflow, Read the following string

int main()
{
char c;
int counter = 0;
int no[] = {0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B};
char string[SIZE];
int state = 0;
int op;
char r1;
char r2;
char r3;
int i = 0;
int o = 0;



for (state = 0; c != EOF; ) //reading the strings
{
for (o = 0; o < 10 ;) // get the characters on a string
{
c = getchar();
if(c != 0x20 && c != 0xA && c != 0x2C) // ignore whitespaces and \n
{
string[counter] = c;
counter++;
o++;
}
}
// ---------- Search Function (Operating Code) ----------
if (string[0] == 0x41 && string[1] == 0x44 && string[2] == 0x44)
{
op = 1; //add
state++;
no[i]++;

r1 = string[4];
r2 = string[6];
r3 = string[8];

printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
o = 0;
}

else if (string[0] == 0x53 && string[1] == 0x55 && string[2] == 0x42)
{
op = 2; //sub
state++;
no[i]++;

r1 = string[4];
r2 = string[6];
r3 = string[8];

printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
o = 0;
}

else if (string[0] == 0x41 && string[1] == 0x4E && string[2] == 0x44)
{
op = 3; //and
state++;
no[i]++;

r1 = string[4];
r2 = string[6];
r3 = string[8];

printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
o = 0;
}

else if (string[0] == 0x58 && string[1] == 0x4F && string[2] == 0x52)
{
op = 4; //xor
state++;
no[i]++;

r1 = string[4];
r2 = string[6];
r3 = string[8];

printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
o = 0;
}

else if (string[0] == 0x53 && string[1] == 0x48 && string[2] == 0x4C)
{
op = 5; //shl
state++;
no[i]++;

r1 = string[4];
r2 = string[6];
r3 = string[8];

printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
o = 0;
}

else if (string[0] == 0x53 && string[1] == 0x48 && string[2] == 0x52)
{
op = 6; //shr
state++;
no[i]++;

r1 = string[4];
r2 = string[6];
r3 = string[8];

printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
o = 0;
}

else if (string[0] == 0x48 && string[1] == 0x4C && string[2] == 0x54)
{
op = 0; //halt
}
else printf("FFFF\n");
//---------- Define Register's Value ----------
//---------- Print the current string ----------
r1 = string[4];
r2 = string[6];
r3 = string[8];
printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
o = 0;
}

return 0;
}

Itt egy input file példának, és tesztelésnek:

ADD R4 R5 RA
AND RF R2 R3
XOR R1 RE RA
HLT

RÖVIDEN: csak az a probléma hogyha felismer egy utasítást, inkrementálja a state-t majd ugorjon vissza a loop elejére, és csináljon meg mindent újra, és írja ki a kövi sort. itt van a legfőbb probléma szerintem. a másik a bufferrel van szerintem, mert ezt írja hibaüzenetnek:
*** stack smashing detected ***: ./1531726 terminated
Aborted (core dumped)

[ Szerkesztve ]

(#5807) buherton válasza ZTE_luky (#5806) üzenetére


buherton
őstag

A counter változót mindig csak noveled, nincs nullazva a cikluson kívül.

A parancs felismereshez használj legalább egy makrot.

Az ifek törzset nyugodtan rakhatod egy fuggvenybe.

Illetve ne Hard codeolj számokat. Használd bátran a define-okat.

[ Szerkesztve ]

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5808) ZTE_luky válasza buherton (#5807) üzenetére


ZTE_luky
aktív tag

de a countert hol nullazzam hogy teljesüljön a kiiratás? mi az a makró? bocsi ,de tényleg kezdő vagyok

(#5809) buherton válasza ZTE_luky (#5808) üzenetére


buherton
őstag

A for ciklus előtt/után, miért is nem jó?

Makró

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5810) ZTE_luky válasza buherton (#5809) üzenetére


ZTE_luky
aktív tag

Ez látható outputként:
10:145A
10:145A
11:3F23
11:3F23
12:41EA
12:41EA
12:0���

Ennek kéne lennie:

10:145A
11:3F23
12:41EA
13:0000

(#5811) buherton válasza ZTE_luky (#5810) üzenetére


buherton
őstag

A programod végében van mindkét hibád.

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5812) ZTE_luky válasza ZTE_luky (#5810) üzenetére


ZTE_luky
aktív tag

köszi, kezd megoldódni, már csak apróságokon csiszolgatok, mégegyszer nagyon szépen köszönöm!!! nagyon hazsnos volt :))

(#5813) ZTE_luky


ZTE_luky
aktív tag

A fent látható kódot szeretném átírni LABEL-ökre, de megint megakadtam.

Eredeti (persze csak egy része, a tartalom és változók kivágva)
for (state = 0; c != EOF;) // Reading the strings
{
counter = 0;
for (o = 0; o < 9 ;) // Get the characters on a string
{
c = getchar();
if(c != 0x20 && c != 0xA) // Ignore spaces and \n
{
string[counter] = c;
counter++;
o++;
}

}
}

És ez a próbálkozásom LABEL-ökkel, de nem nagyon értem el vele semmit (szintén Segmentation fault (core dumped), amit még mindig nem tudok hogy miért van :( )

if ( c!= EOF)
{
init:
counter = 0;
o = 0;
goto thestring;

thestring:
if (o < 9)
c = getchar();

if (c != 0x20 && c != 0xA)
{
string[counter] = c;
counter++;
o++;
}

goto thestring;

és persze még az egész kód végére beraktam hogy goto init; és bezártam a bracket-et

Kérem aki tud, segítsen hogy mit rontok el. Válaszokat előre is köszönöm szépen!

(#5814) dobragab válasza ZTE_luky (#5813) üzenetére


dobragab
addikt

Ne akarj goto-t használni :N

Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.

(#5815) ZTE_luky válasza dobragab (#5814) üzenetére


ZTE_luky
aktív tag

ez a feladat :(

Az a baj h már ebbe is beleköt.

goto_1.c: In function ‘main’:
goto_1.c:53:4: warning: ‘c’ is used uninitialized in this function [-Wuninitialized]
if (c != EOF)

[ Szerkesztve ]

(#5816) dabadab válasza ZTE_luky (#5815) üzenetére


dabadab
titán

De hát oda is írja, hogy mi a gond: a c értékét azelőtt használod (itt konkrétan arra, hogy összehasonlítsd az EOF-fal), mielőtt értéket adnál neki, vagyis elsőre biztosan valami memóriaszemét lesz benne.

DRM is theft

(#5817) ZTE_luky válasza dabadab (#5816) üzenetére


ZTE_luky
aktív tag

az a baj hogy akár hova rakom az EOF ellenőrzst sehogy se jó. NAgyobb baj, ha kiveszem belőle úgy se fut le normálisan

(#5818) dabadab válasza ZTE_luky (#5817) üzenetére


dabadab
titán

Még a for (vagy a legelső if) előtt adjál neki értéket. Tulajdonképpen mindegy mit, csak ne EOF legyen :)

DRM is theft

(#5819) ZTE_luky válasza dabadab (#5818) üzenetére


ZTE_luky
aktív tag

igen ezzel már próbálkoztam csak az a baj akár mit ki vagy betesze még mindig
Segmentation fault (core dumped)
és nem ír ki semmit hogy mit hova hogyan :(

mi folyhat le, mi lehet a hiba? mikor írja ezt?

[ Szerkesztve ]

(#5820) Domonkos válasza ZTE_luky (#5819) üzenetére


Domonkos
Ármester

Modernebb OS-ekben van egy biztonsagi mechanizmus, ami nem engedi hogy olyan memoriaterulethez ferjen hozza a program, ami nem a sajatja. Ha megis megprobalkozik vele, akkor az adott folyamat kap egy SIGSEGV-t, amit a te esetedben nem kezel le semmi -> elszall a program. Valoszinunek tartom, hogy valami olyasmi lehet a hibad, hogy tulindexelsz mondjuk egy tombot vagy nullpointert szeretnel dereferalni. - ezek a leggyakoribbak. Azt neked kellene kideritened hogy hol tortenhet ilyen a kodban es megakadalyoznod / vagy kezelned a szignalt. A kepen a 49. sor potencialisan ilyen.
Probalj meg debugolni egyet! :K

Gender of electrical connectors is defined by the pins.

(#5821) ZTE_luky válasza Domonkos (#5820) üzenetére


ZTE_luky
aktív tag

köszönöm szépen a nagyon hasznos választ :))

igen teljesen igazad van. a counter és az o változó (index counter) véleméynem szerint ugyan azt a funkciót látta el. nem is tudom hoyg került bele kétszer. át is írtam az o-t counterre, máshol meg kitöröltem de valamiért így se jó :( ugyan az a hibaüzenet. hol lehet még hiba? :(

(#5822) buherton válasza ZTE_luky (#5819) üzenetére


buherton
őstag

Szerintem itt lesz az ideje beszerezned egy IDE-t, ami támogatja a debuggolást.

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5823) Domonkos válasza ZTE_luky (#5821) üzenetére


Domonkos
Ármester

A kep alapjan a masik sejtesem, hogy a no[] tombodet indexelheted tul/alul. Egyebkent szarmazhatna meg stack overflow-bol - ha mondjuk benezel egy rekurziot, vagy ha csak olvashato memoriara szeretnel irni stb...
Ha gyorsan ki szeretned deriteni hogy hol a hiba, akkor debuggolj egyet lepesenkent! :K

Gender of electrical connectors is defined by the pins.

(#5824) ZTE_luky


ZTE_luky
aktív tag

Köszönöm szépen a segítséget, hát igen no [] tömböm random meg van határozva, de annál kevesebb értéket is kivehet mint a max, többet nem. Nem tudom az mennyire lehet probléma. Jelenleg se történik semmi, valami ilyesmit kellett kihozni az egészből 14:00-kor kell leadnom, de nem működik, tele van warning-al és nem is csinál semmi értelmeset sajnos. PEdig a kiinduló C-file gyönyörűen működik. Nem tudom mi lehet a baj, eléggé belekeveredtem sajnos.

#include<stdio.h>
#include<string.h>

// ---------- Globale Variablen ----------
int no[] = {0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,
0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B};
// Address array
char string[9]; // String array
int R0; // (--int halt--) 0 Constant
int R1;
int R2; // (--int counter--) Index counter (String)
int R3; // (--int op--) Index Operation-Code
int R4; // (--int state--) Index strings
int R5; // (--int i--) Index counter (Address)
char R6; // (--char c--) Character to getchar
char R7; // (--char r1--) Register 1
char R8; // (--char r2--) Register 2
char R9; // (--char r3--) Register 3
int *RA; // (--int *no0--) BP of Address-array NEW
int *RB; // (--int *noi--) Flexibe Array Pointer NEW
char *RC; // (--char *string0--) BP of String-array NEW
char *RD; // (--char stringi--) Flexibe Array Pointer NEW
int RE; // SIZE 9
int RF; // FFFF

// ---------- Main Function ----------
int main()
{
R0 = 0;
R1 = 1;
R2 = 0;
R4 = 0;
R5 = 0;
RA = &no[0];
RC = &string[0];
RE = 9;
RF = 0xFFFF;
//no0 = &no[R0]; // Zero Element (in array "no") NEW
//string0 = &string[R0]; // Zero Element (in array "string") NEW

// ---------- Program ----------
L0: //init
R2 = R0; //counter
goto L1; //thestring;

L1: //thestring:

if (R2 < RE) // for (counter = 0; counter < 9 ;)
R6 = getchar(); //c
if ( R6 != EOF) //c
goto L2; //ignore;
else {goto L3;} //end

L2: //ignore:
if (R6 != 0x20 && R6 != 0xA) // R6=c
{
R2 += R1; //counter++;
//o++;
goto L1; //thestring;
}


// ---------- Search Function (Operating Code) ----------


// if (string[0] == 0x41 && string[1] == 0x44 && string[2] == 0x44)
if (*RC == 0x41 && *RC + R1 == 0x44 && *RC + R1 + R1 == 0x44) //NEW
{ //----- Function ADD -----
R3 = R1;
R4 += R1;
RB += R1;
R7 = RC + R1 * 4;
R8 = RC + R1 * 6;
R9 = RC + R1 * 8;
printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
}

//else if (string[0] == 0x53 && string[1] == 0x55 && string[2] == 0x42)
else if (*RC == 0x53 && *RC + R1 == 0x55 && *RC + R1 + R1 == 0x42)//NEW
{ //----- Function SUB -----
R3 = R1;
R4 += R1;
RB += R1;
R7 = RC + R1 * 4;
R8 = RC + R1 * 6;
R9 = RC + R1 * 8;
printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
}

//else if (string[0] == 0x41 && string[1] == 0x4E && string[2] == 0x44)
else if (*RC == 0x41 && *RC + R1 == 0x4E && *RC + R1 + R1 == 0x44) //NEW
{ //----- Function AND -----
R3 = R1;
R4 += R1;
RB += R1;
R7 = RC + R1 * 4;
R8 = RC + R1 * 6;
R9 = RC + R1 * 8;
printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
}

//else if (string[0] == 0x58 && string[1] == 0x4F && string[2] == 0x52)
else if (*RC == 0x58 && *RC + R1 == 0x4F && *RC + R1 + R1 == 0x52) //NEW
{ //----- Function XOR -----
R3 = R1;
R4 += R1;
RB += R1;
R7 = RC + R1 * 4;
R8 = RC + R1 * 6;
R9 = RC + R1 * 8;
printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
}

//else if (string[0] == 0x53 && string[1] == 0x48 && string[2] == 0x4C)
else if (*RC == 0x53 && *RC + R1 == 0x48 && *RC + R1 + R1 == 0x4C) //NEW
{ //----- Function SHL -----
R3 = R1;
R4 += R1;
RB += R1;
R7 = RC + R1 * 4;
R8 = RC + R1 * 6;
R9 = RC + R1 * 8;
printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
}

//else if (string[0] == 0x53 && string[1] == 0x48 && string[2] == 0x52)
else if (*RC == 0x53 && *RC + R1 == 0x48 && *RC + R1 + R1 == 0x52) //NEW
{ //----- Function SHR -----
R3 = R1;
R4 += R1;
RB += R1;
R7 = RC + R1 * 4;
R8 = RC + R1 * 6;
R9 = RC + R1 * 8;
printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
}

//else if (string[0] == 0x48 && string[1] == 0x4C && string[2] == 0x54)
else if (*RC == 0x48 && *RC + R1 == 0x4C && *RC + R1 + R1 == 0x54) //NEW
{ //----- Function HLT -----
R3 = R1;
R4 += R1;
RB += R1;
R7 = RC + R1 * 4;
R8 = RC + R1 * 6;
R9 = RC + R1 * 8;
printf("%D:%d%d%d%d\n",RB,R0,R0,R0,R0); //Print the current string
}

else printf("%04X\n", RF); //Print FFFF when it's an incorrct Value

goto L0; //init;
L3: //end

return 0;
}

[ Szerkesztve ]

(#5825) Domonkos válasza ZTE_luky (#5824) üzenetére


Domonkos
Ármester

Najah - vannak itt gondok.
Egy csomo helyen intnek szeretnel pointert castolas vagy dereferalas nelkul ertekul adni. Ez nem szokott semmi jora vezetni. pl.: R7 = RC + R1 * 4;
Tovabba a printfekben a format stringek sem igazan korrektek a tipusokat nezve %d-vel ne akarj pointert kiirni... Azt hiszem hogy a :-ot is ki kellene escapelned - bar ez nem tuti.
Emellet van meg par dolog ami csak a frissebb szabvanyokkal megy el - bar nem tudom hogy neked melyiknek kell megfelelned.
Amit adtal korabban input file pelda most nem produkal semmi ertelmeset nalam :(

13 utan jobban raerek.

Gender of electrical connectors is defined by the pins.

(#5826) ZTE_luky válasza Domonkos (#5825) üzenetére


ZTE_luky
aktív tag

nálam se sajnos. igen a pointerekkel elég nagy gáz van, de sajnos nem áll össze. Köszi szépen rövidült azóta, és le kell előbb adnom sajnos. hát ez van. :( nagy fába vágtam a fejszém

(#5827) #29810176


#29810176
törölt tag

Sziasztok tudtok ajánlani jó könyveket C tanulásához? A nagyon alap dolgokat tudom. (Lynda-s Fundamentals-ból.)
A Head First C mennyire kezdőbarát könyv?

(#5828) DrojDtroll válasza #29810176 (#5827) üzenetére


DrojDtroll
addikt

videósorozat nem érdekel?

(#5829) kispx válasza #29810176 (#5827) üzenetére


kispx
addikt

Offline könyv: Programozzunk ​C nyelven!

(#5830) #29810176 válasza DrojDtroll (#5828) üzenetére


#29810176
törölt tag

Köszi a válaszokat! Video sorozat is érdekel, ha nem túl drága (max. 10000Ft), jó kezdőknek, tényleg részletesen mindent (már ha létezik ez a szó a programozásban) elmagyaráz.

kispx:
Köszi :D Ez jó kezdőknek is? Nem igényel más nyelv ismeretét?

(#5831) buherton válasza #29810176 (#5830) üzenetére


buherton
őstag

[link] :) persze, ha tudsz angolul.

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5832) #29810176 válasza buherton (#5831) üzenetére


#29810176
törölt tag

Oh köszi :D
Nyelvi osztályon vagyok :)

(#5833) kispx válasza #29810176 (#5830) üzenetére


kispx
addikt

Ezzel tanultam a nyelvet tizenvalahány éves koromban. Nem igényel más nyelv ismeretét.

[ Szerkesztve ]

(#5834) #29810176


#29810176
törölt tag

Sziasztok!
Már most elakadtam :(
A conio.h nem nagyon ANSI :( Linux alatt nem nagyon megy. Ezt a feladatot hanyagoljam vagy inkább használjak ncurses-t? Esetleg próbáljak valami alternatívát keresni? Illetve miért -1 van az exit-ben? Nem 0-255 között kellene lennie?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
int a,b, c;
do
{
printf("Kérek két számot: ");
if (scanf("%d, %d,",&a, &b) != 2)
{
printf("Hibás adatbevitel!\n");
exit(-1);
}
c=a+b;
printf("A két szám összege: %d + %d = %d\n", a, b, c);
} while (getch() !=32);
}

[ Szerkesztve ]

(#5835) kispx válasza #29810176 (#5834) üzenetére


kispx
addikt

Hanyagold szerintem.

A getch helyet használhatod a getc(stdin) hívást is. Az exit függvény int paramétert vár el, ami lehet negatív is.

(#5836) Domonkos válasza #29810176 (#5834) üzenetére


Domonkos
Ármester

>Illetve miért -1 van az exit-ben? Nem 0-255 között kellene lennie?
Nem. Az exit() egy intet var, amit aztan osszeesel (bitenkent) 0377-tel, amit aztan az o szuloje kap meg - ami igy mar valoban 0 es 255 koze fog esni...

Szerk: Linux alatt.

[ Szerkesztve ]

Gender of electrical connectors is defined by the pins.

(#5837) #29810176 válasza kispx (#5835) üzenetére


#29810176
törölt tag

Köszönöm mindenkinek a válaszokat!
Ezek a bitműveletek picit magasak még nekem. Mi a reális haszna? C#-ban is van valami hasonló.

Szerk.: Olyan, mintha átugraná. Csak folyton ismétli. :(

[ Szerkesztve ]

(#5838) Domonkos válasza #29810176 (#5837) üzenetére


Domonkos
Ármester

Gondolom azert, mert amikor betolod a szamokat, akkor utanakuldesz egy entert i(esetleg valami mas delim karaktert) ami a getchar() hivasig bufferelodik az stdin-en - es a while feltetelvizsgalatanal ezt olvasod ki es hasonlitod ossze. Szerintem ha eldobnal egy (de lehet hogy tobb) karaktert a getchar elott vagy explicit rahivnal mondjuk az __fpurge()-re, akkor mukodne a dolog.
Ezt ugy mondom hogy nem tudtam kiprobalni, szoval bocsi hogy ha nem mukodik ezutan sem.

Gender of electrical connectors is defined by the pins.

(#5839) #29810176 válasza Domonkos (#5838) üzenetére


#29810176
törölt tag

Kilép -1-el

(#5840) szombatitomi


szombatitomi
aktív tag

Sziasztok!

Olyan kérdésem lenne, hogy ha stdin-ről olvasok be mondjuk fgets-sel NULL-ig, akkor linux alól hogy tudok nullt bevinni, hogy leállítsam a futást?

(#5841) Domonkos válasza szombatitomi (#5840) üzenetére


Domonkos
Ármester

Legtobb terminalon vagy ^V vagy ^@ szokott lenni.
Bar ajanlom, hogy ha file-t (vagy mas inputot) szeretnel olvasni, akkor inkabb hasznald az erre kitalalt "end of transmission" (EOT) karaktert; ^D.

Gender of electrical connectors is defined by the pins.

(#5842) szombatitomi válasza Domonkos (#5841) üzenetére


szombatitomi
aktív tag

Köszönöm szépen! :R

(#5843) Milgram1


Milgram1
aktív tag

Üdv!
Egy kis segítségre lenne szükségem utolsó beadandómhoz. Feladat a következő: Adatnyilvántartó program, ami a következőket tudja: új adat megadás, keresés, módosítás, törlés, listázás és egy bináris fájlba kell kiírnom a rekordokat meg onnan kell visszaolvasni a program indulásakor. Ezen kívül még a program futása közben láncolt listában kell tárolnom a rekordokat. Egy rekord 3 adatból áll. Egy integer azonosító, és egy név meg telefonszám ami karaktertömb. Na most jöjjön a probléma: A program nagyrészt megvan viszont a fájlba írás/olvasás(194 és 209 sor) nem működik mert egyrészt nem fut le valami hiba miatt az a rész másrészt meg így nem is tudom hogy jó lenne-e.A másik meg az adatbevitelnél le kell ellenőriznem hogy létezik-e a megadott azonosító amire van egy bool fv(100 sor) aminek visszatérési értéke true ha létezik és addig kellenek kérnie az azonosítót amíg nem hamis viszont tovább megy. Igazán nagyra értékelném ha valaki besegítene mert ezek hiányznak. :DDD
[link]

[ Szerkesztve ]

(#5844) Domonkos válasza Milgram1 (#5843) üzenetére


Domonkos
Ármester

Az elso problemara: nem zarod be a file-t es mivel az bufferelt, igy valoszinuleg bennragad egy keves adat a vegen amit nem dolgozol fel. Ez egy eros sejtesem.
A masikra kesobb ranezek ha lesz tobb idom, mert az nem tunik ennyire trivinek. :K

Gender of electrical connectors is defined by the pins.

(#5845) Milgram1 válasza Domonkos (#5844) üzenetére


Milgram1
aktív tag

Beolvasásra ezt írja bár nem tudom miért. de ettől függetlenül még mindig lehet rossz mert nem tudtam próbálni. :F

(#5846) kispx válasza Milgram1 (#5845) üzenetére


kispx
addikt

fread(&nevek,sizeof(nevek),1,fp);
A nevek az egy típus, nem változó. Egy típusnak nem tudod lekérdezni a memóriában elfoglalt címét. Szerintem az uj változóba szeretted volna beolvasni.

aktualis=fread(&nevek,sizeof(nevek),1,fp);
A fentebb lévő hiba ugyanitt is előfordul. + Az fread visszatérési értéke a sikeresen beolvasott elemek száma size_t (nálam ez unsigned int) formátumban. unsigned intből sehogy nem lesz struct nevek típus.

[ Szerkesztve ]

(#5847) Milgram1 válasza kispx (#5846) üzenetére


Milgram1
aktív tag

Így próbálkoztam, ahogy az új adatnál van de kifagy mikor elindul. Hogy őszinte legyek ennél a láncolt listás dolognál kicsit elmaradtam.

void fajlolvasas()
{
FILE *fp;
fp=fopen("data.BIN","r+b");
if(fp==NULL)
{
fp=fopen("data.BIN","w+b");
}
else
{

fseek(fp,0,SEEK_SET);
uj=(struct nevek*)malloc(sizeof(struct nevek));
fread(&uj,sizeof(nevek),1,fp);
elozo=NULL;
aktualis=elso;

while(!feof(fp))
{
fread(&uj,sizeof(nevek),1,fp);

aktualis=aktualis->kovetkezo;

}
fclose(fp);
}

}

[ Szerkesztve ]

(#5848) EQMontoya válasza Milgram1 (#5847) üzenetére


EQMontoya
veterán

De minek nyitod meg írásra, ha nem létezett korábban? Nem irsz bele...

A ciklusban pedig nem teszed el sehova a belvasott adatot, csak leptetsz valamit, ami számomra értelmezhetetlen.

[ Szerkesztve ]

Same rules apply!

(#5849) G.A.


G.A.
aktív tag

Üdv!

8Bites mikróvezérlőhöz írogatok kódot, amit VS 2015-ben (C++) tesztelek.
A vezérlőre írt kódot C-ben írom, de a teszthez használt segédfunkciókhoz C++-t is használok.

A probléma:
globális struktúra (pontosabban union) tömböt(pointert?) szeretnék funkcióval manipulálni (méret megadása, adatokkal feltöltés)

Kódban kifejezve:

typedef union dns_answer
{
struct
{
my_16b name;
my_16b type;
my_16b rrs_class;
my_32b ttl;
my_16b rd_length;
my_32b data;
};
u8b b[16];
}dns_answer;

void function(u8b data[], dns_answer** answer)
{
dns_answer local_answer;
*dns_response = (dns_answer*)malloc(data[7] * sizeof(dns_answer));

for(u8b i = 0; i < data[7]; i++)
{
for (u8b x = 0; x < 4; x++)
{
local_answer.data.b[x] = data[x];
//*dns_response[i].data.b[x] = data[x];
}
*dns_response[i] = local_dns_resp; // HIBA ITT
}
}

dns_answer* answer_array = NULL;
u8b data[512] = {};

int main(void)
{
...
function(data, &answer_array);
...
}

Ezzel a kóddal jelenleg az a problémám, hogy:
Ha érkezik egy adatcsomag(DNS üzenet), ahol több válasz van (data[7] > 1), akkor a jelölt helyen (HIBA ITT)
áll meg a kód... Hibaüzenet: Access violation writing location 0x00000000

Ha jól értem olyan címre akar írni, ami nem létezik. A hiba eredetét a malloc()-ra tippelem. Következtetésem az, hogy ha kihagyom a function()-ban a malloc()-ot és az inicializáláskor az int main() előtt megadom a tömb méretet, akkor nincs ez a hiba.
Hogyan méretezhetném újra a struktúra tömbömet (dns_answer* answer_array) a funkción belül, úgy hogy az globálisan is megvalósuljon?

illetve., hogy kerülhetném ki a function()-ban az átmeneti lokális struktúra használatát?

(#5850) buherton válasza G.A. (#5849) üzenetére


buherton
őstag

dns_answer local_answer -> ez nincs használva.
dns_response -> nincs deklarálva.
local_dns_resp -> nincs deklarálva.
A struct-hoz erősen javaslok egy packed attribute-omot.
dns_answer** answer -> ezt nem használod semmire.
u8b data[] -> ez nagyon csúnya.
Minek union?
A for ciklikusok, miért is nem memcpy-k? Ez nem C++ ahol számít, hogy a konstruktor adott esetben meghívódjon.

A hiba itt van:

*dns_response[i] -> *(dns_response[i]); szerintem így helyes, de lehet, hogy nekem van nagyon péntek este.

[ Szerkesztve ]

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

Copyright © 2000-2024 PROHARDVER Informatikai Kft.