Új hozzászólás Aktív témák
-
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
000AAmi 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
válasz ZTE_luky #5802 üzenetére
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
válasz ZTE_luky #5802 üzenetére
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
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:145Até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
HLTRÖ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
válasz ZTE_luky #5806 üzenetére
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... !!!
-
buherton
őstag
válasz ZTE_luky #5808 üzenetére
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... !!!
-
buherton
őstag
válasz ZTE_luky #5810 üzenetére
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
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!
-
Domonkos
Ármester
válasz ZTE_luky #5819 üzenetére
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
válasz Domonkos #5820 üzenetére
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
válasz ZTE_luky #5819 üzenetére
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
válasz ZTE_luky #5821 üzenetére
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
válasz ZTE_luky #5824 üzenetére
Najah - vannak itt gondok.
Egy csomo helyenint
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 nalam13 utan jobban raerek.
Gender of electrical connectors is defined by the pins.
-
#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? -
kispx
addikt
válasz #29810176 #5827 üzenetére
Offline könyv: Programozzunk C nyelven!
-
#29810176
törölt tag
válasz DrojDtroll #5828 üzenetére
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
válasz #29810176 #5830 üzenetére
[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
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 ]
-
Domonkos
Ármester
válasz #29810176 #5834 üzenetére
>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.
-
Domonkos
Ármester
válasz #29810176 #5837 üzenetére
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.
-
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
válasz szombatitomi #5840 üzenetére
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.
-
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
válasz Milgram1 #5843 üzenetére
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.
-
kispx
addikt
válasz Milgram1 #5845 üzenetére
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 azuj
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 ]
-
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 0x00000000Ha 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... !!!
Ú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!