Fontos linkek a C-ről:
Prog.hu-s cikkek
Prog.hu-s tudástár témák
The C Library Reference Guide
Standard C
Wikipedia
C Tutorial
Programming in C
Bevezetés a C programozási nyelvbe
Gyorskeresés
Legfrissebb anyagok
- Bemutató Spyra: akkus, nagynyomású, automata vízipuska
- Bemutató Route 66 Chicagotól Los Angelesig 2. rész
- Helyszíni riport Alfa Giulia Q-val a Balaton Park Circiut-en
- Bemutató A használt VGA piac kincsei - Július I
- Bemutató Bakancslista: Route 66 Chicagotól Los Angelesig
Általános témák
LOGOUT.hu témák
- [Re:] [bb0t:] Gyilkos szénhidrátok, avagy hogyan fogytam önsanyargatás nélkül 16 kg-ot
- [Re:] [Luck Dragon:] MárkaLánc
- [Re:] [Luck Dragon:] Asszociációs játék. :)
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] [antikomcsi:] Való Világ: A piszkos 12 - VV12 - Való Világ 12
- [Re:] [btz:] Internet fejlesztés országosan!
- [Re:] Spyra: akkus, nagynyomású, automata vízipuska
- [Re:] Elektromos rásegítésű kerékpárok
- [Re:] [D1Rect:] Nagy "hülyétkapokazapróktól" topik
- [Re:] [sziku69:] Szólánc.
Szakmai témák
PROHARDVER! témák
Mobilarena témák
IT café témák
GAMEPOD.hu témák
Téma összefoglaló
- Utoljára frissítve: 2014-04-25 14:12:00
LOGOUT.hu
Hozzászólások
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 ?
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 ]
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... !!!
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 ]
ZTE_luky
aktív tag
köszönöm szépen, mindkettőtöknek, kijavítva, működik
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 ]
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... !!!
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
buherton
őstag
A for ciklus előtt/után, miért is nem jó?
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... !!!
ZTE_luky
aktív tag
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... !!!
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
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!
dobragab
addikt
Ne akarj goto-t használni
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
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 ]
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
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
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
ZTE_luky
aktív tag
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!
Gender of electrical connectors is defined by the pins.
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?
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... !!!
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!
Gender of electrical connectors is defined by the pins.
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 ]
Domonkos
Ármester
Najah - vannak itt gondok.
Egy csomo helyen int
nek 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.
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
#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?
DrojDtroll
addikt
videósorozat nem érdekel?
kispx
addikt
Offline könyv: Programozzunk C nyelven!
#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 Ez jó kezdőknek is? Nem igényel más nyelv ismeretét?
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... !!!
#29810176
törölt tag
Oh köszi
Nyelvi osztályon vagyok
kispx
addikt
Ezzel tanultam a nyelvet tizenvalahány éves koromban. Nem igényel más nyelv ismeretét.
[ Szerkesztve ]
#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 ]
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.
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.
#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 ]
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.
#29810176
törölt tag
Kilép -1-el
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?
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.
szombatitomi
aktív tag
Köszönöm szépen!
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.
[link]
[ Szerkesztve ]
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.
Gender of electrical connectors is defined by the pins.
Milgram1
aktív tag
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 ]
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 ]
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!
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?
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... !!!
Téma tudnivalók
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!