- Hamarosan megkezdődik a nubia 2,8K-s táblagépének szállítása
- Barátokká váltak az eddig rivális AI-óriások
- ASUS blog: Ideális olcsó utazós gép lett az új Vivobook S14
- Az Aura Displays hordozható monitorhármasa jól felturbózhatja a produktivitást
- Dual Mode-os IPS monitorral adott magáról életjelet a Gigabyte
- Radeon RX 9060 XT: Ezt aztán jól meghúzták
- Epson nyomtatók
- AMD Ryzen 9 / 7 / 5 7***(X) "Zen 4" (AM5)
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- NVIDIA GeForce RTX 3080 / 3090 / Ti (GA102)
- Everest / AIDA64 topik
- Milyen billentyűzetet vegyek?
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Gaming notebook topik
Új hozzászólás Aktív témák
-
buherton
őstag
Ez így biztosan nem jó:
printf("%d/%d",sorok8/jo8);
, ezt próbáld helyette:printf("%d/%d",sorok8, jo8);
. Ascanf
helyett használd azfgets
függvényt. Osztást érdemes elkerülni ha lehet, mert erőforrás igényes.A legfontosabb soha ne adj ki úgy kezedből progamot, hogy előtte nem próbáltad. 99,99999% az esély arra, hogy rossz
.
Tegyél fel Cygwint gcc-vel, vagy virtuális gépre rakj fel egy Linuxot.
-
Dinter
addikt
válasz
buherton #5898 üzenetére
Az a környezet, ahol le kell futtatni a programot az, csak így nem tudom letesztelni akkor.
A program a következő: kapom a sorokat standard inputról, amiről el kell dönteni, hogy illeszkedik-e vagy nem a regex mintára. Majd fájl vége jelnél kiiírni az összes/jó sort 8-as számrendszerben. Ez így működik elvileg?
#include <regex.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int convertDecimalToOctal(int decimalNumber)
{
int octalNumber = 0, i = 1;
while (decimalNumber != 0)
{
octalNumber += (decimalNumber % 8) * i;
decimalNumber /= 8;
i *= 10;
}
return octalNumber;
}
bool reg_matches(const char *str, const char *pattern)
{
regex_t re;
int ret;
if (regcomp(&re, pattern, REG_EXTENDED) != 0)
return false;
ret = regexec(&re, str, (size_t) 0, NULL, 0);
regfree(&re);
if (ret == 0)
return true;
return false;
}
int main()
{
char sor[1000];
int sorok=0;
int jo=0;
const char* pattern="^[^#]_*(0x)?[0-9]*V6.+[A-Z]*.*mmese(B|a)";
while(scanf("%s[^\n]",&sor)!=EOF){
sorok++;
if(reg_matches(sor,pattern)) jo++;
}
int jo8=convertDecimalToOctal(jo);
int sorok8=convertDecimalToOctal(sorok);
printf("%d/%d",sorok8/jo8);
return(0);
} -
Dinter
addikt
Sziasztok.
Regex.h-t honnan tudok szerezni? A CodeBlocks azt írja, hogy nem található.
-
kispx
addikt
válasz
atkamaly #5893 üzenetére
A elkezded debuggolni az alkalmazást, akkor látszik a colour változóba az előző sor '\n' kódját rakja bele. Számot pedig nem olvasott be. If-ek nem futnak le, viszont kiírja az előző állapotot. Majd a rákövetkező ciklusban sikeresen beolvassa az adatot.
Érdemes a bemenő adatok számát ellenőrizni.
if (scanf("%c%d", &colour, &number) == 2)
{
// A program többi része
} -
kovisoft
őstag
válasz
atkamaly #5893 üzenetére
A második bekérést úgy érted, hogy amikor a J-s ciklusban másodszor (amikor J=1) kerül a vezérlés a scanf-re? Mert ebben az esetben azért írja ki az előző (J=0) lépésben megváltoztatott értékeket, mert nem állítod vissza a cikluson belül a red/yellow/blue tömb eredeti állapotát. Tedd be a cikluson belülre a red/yellow/blue inicializálását.
-
atkamaly
újonc
Sziasztok! Nem tudom hogy jó helyre írom-e, de remélem tudtok segíteni.
Egy olyan problémám lenne az alábbi egyszerű programmal, hogy valamiért a program kétszer írja ki a jelenlegi állást. Amikor bekérek egy új szín-szám kombinációt mindig kiírja az előzőt, majd a megváltoztatottat... Kezdő programozó vagyok, nagy segítség lenne ha valaki röviden el tudná magyarázniForráskód:
#include <stdio.h>
int main() {
int red[8];
int yellow[8];
int blue[8];
for (int i = 0; i < 8; i++) {
red[i] = i + 1;
yellow[i] = i + 1;
blue[i] = i + 1;
}
for (int J = 0; J < 10; J++){
char colour;
int number;
scanf("%c%d", &colour, &number);
if ( colour == 'R' ) { red[number - 1] = 0; }
else if ( colour == 'Y' ) { yellow[number - 1] = 0; }
else if ( colour == 'B' ) { blue[number - 1] = 0; }
for (int i = 0; i < 8; i++) { printf("%d ", red[i]);
printf("%d ", yellow[i]);
printf("%d \n", blue[i]); }
putchar('\n');
}
return 0;
}Előre is köszönöm a segítséget!
-
kovisoft
őstag
Nem világos számomra, hogy minek van és minek nincs visszatérési értéke (pl. a cut ad vissza valamit vagy nem, és ha igen, akkor mit?). De ha ettől eltekintünk, akkor mi van, ha eleve 4-nél kevesebb elemű tömbre hívod meg? Akkor a cut végtelen ciklusba kerül, mert folyamatosan a felezős ágba kerül a vezérlés, és egy idő után a 0 méretű intervallumot felezgeti.
-
Gyb001
senior tag
Sziasztok.
Szerintetk ez így logikailag jól műküdik?
cut( float a[],int e,int i)
{int j;
if (abs(e-i)==4)
{
for (j = e; j < i; j += 1)
{
valami
}
return ...
}
else
{
return függvén2(cut(a,e,(e+i)/2), cut(a,(i+e)/2,i));
}
}
main()
{
cut(a,0,64);
}Egy tömböt akarok bejárni, úgy hogy amikor már csak 4 elem van akkor másik függvényt hív.
-
kovisoft
őstag
Milyen hosszú sorok vannak a file-ban, aminek a sorait olvasod? Mert a char sor[128] tömbbe fgets(sor,255,fajl) utasítással 255 karaktert is beolvashatsz, ami aztán felülírhatja a stacket, és lehet ettől is az elszállás. Ill. hány sorból áll a file, mi van, ha nincs benne a szükséges 4 sor?
Másik megjegyzés: ebben a sorban sizeof(Kerdes*) kellene, mert pointer-tömböt foglalsz le. Persze gondot nem fog okozni, ha fölöslegesen foglalsz több memóriát, csak pazarlás:
Kerdes **tomb=(Kerdes**) malloc(15*sizeof(Kerdes));
Egyebek: nincs felszabadítva a lefoglalt memória, nincs lezárva a megnyitott file, de elszállást ezek sem okoznak, csak ha már túl sok leff foglalva/megnyitva.
Szerk: jól látom, közben megoldódott a probléma?
-
Dinter
addikt
-
-
Domonkos
addikt
Par ellenorzes azert elkene a kodba. Pl hogy sikerult-e egyaltalan megnyitni a filet, vogy hogy mit sikerul belole kiolvasni stb.
Fel tudnad valahova tolteni az egesz kodreszletet? Ugy egy fokkal konnyebb lenne ertelmezni.btw.
void *
-ot nem kell castolnod, az megy implicit -
Dinter
addikt
Sziasztok. SDL-ben csinálnám a dolgom, eddig tök jól működött, aztán most valamitől megrákosodott.
Minden lefordul ezen kívül tökéletesen, csak itt a végén jön elő ez a hiba. Az alap mintaprogramnál is kiírja. Már az egészet is megpróbáltam újrarakni. Illetve van még egy olyan hiba is, hogy az n értékét növelve 7 után hirtelen 170ezerre ugrik. Mit tudnék vele kezdeni?
-
Livius
őstag
Akit esetleg érdekel, az ELTE-éről Porkoláb Zoltán C Programozás egyetemi előadása itt elérhető, folyamatosan kerülnek fel az új részek ebből a félévből! Elég sok link halott már a bevezetőben, ha esetleg frissíti majd valaki, talán ez is jó helyen lenne ott.
-
zenwalk
senior tag
sziasztok
Tudnatok segiteni? -
ampulla
aktív tag
válasz
alapz@j #5867 üzenetére
Sajnos nem működik úgy sem azért kezdtem el paraméterezni. Azonban ha hozzáadom a path environment variable-hez, akkor működik. Ez mitől van?
A codeblocks siman lefordítja azzal a paranccsal, hogy:Gcc main.c -o hello
Egy sima hello world programot akarok lefordítani.
Másreszt azért mutat a bin-re mert a mingw install manager oda tette a dll fájlokat.
-
ampulla
aktív tag
Hello.
Letöltöttem egy MinGW és szertnék lefordítani egy hello.c programot, azonban a compiler állandóan hibát dob, hogy hiányzik neki pár DLL. Már az összes cikket elolvastam és kipróbáltam de egyikkel sem ment. Továbbra is hiányzik neki. Az alábbi módon próbáltam fordítani:
gcc -c main.c -o test -LC:\Programming\Compiler\MinGW\bin -static -llibmingwex-0.dll -llibiconv-2.dll -llibgmp-10.dll -llibisl-15.dll
-
buherton
őstag
válasz
dabadab #5857 üzenetére
Gonosz
, de nem tudok ezzel vitatkozni.
Porkoláb Zoltán neve nemzetközileg is bejáratott a C++ témában, és a C-hez is ért.
-
MATEO6600
őstag
Sziasztok!
Ide is beírom a kér(d)ésemet:
Adott egy komoly és alapos C# tudás, viszont C-ből teljesen 0-án állok, és szeretném megtanulni a nyelvet.
Tudnátok nekem valami javasolt könyvet / weboldalt / pluralsight tutorialt adni, aminek érdemes nekiállnom?
Rengeteg oktató anyag van, de általában 0 programozási tudásról indítanak, viszont nekem itt van a C# tudásom. -
buherton
őstag
Nekem eddig egyszer sikerült két csillagos pointert leírnom a saját kódban, mert azzal volt a leghatékonyabb. Különben mindig kerülöm a használatát, mert az ember gyorsan bele tud zavarodni. Ezt javaslom neked is. A Linux függvényei közül is eddig csak eggyel találkoztam, amit két csillagot várt: scandir
u8b data[] -> ez nagyon csúnya.
Mitől csúnya? Inkább u8b* data legyen? Még előnybe részesítem a tömböket a pointerekkel szemben, mivel azokat könnyebben kezelem. 8bites uC-n is könnyebben nyomon tudom követni, hogy mennyi RAM-ot is használok...u8b data[] -> ezzel fölöslegesen foglalsz 512 bájtot a stacken, ami ugye még processzor idő is. Használj pointert. (Egy ilyen miatt én simán buktatnék egyetemen.)
A fordítótól függ, hogy hogyan align-olja a structúra változóit. Bár ez 8 bites, így nem valószínű, hogy máshogy align-olna, de a hordozhatóságot javítja.
, majd ha másolom/küldöm az adatcsomagot akkor a b[]-t használom.
Másolás ->memcpy, küldés bájtonként pedig char*-al tudsz küldeni. Ergo nem kell a union. Nem is értettem az elején, hogy miért is kellett.
dns_answer*& dns_response
Szerintem így sokkal olvashatóbb és nem utolsó sorban sokkal helytakarékosabb és gyorsabb.
void get_data_from_dns_reply(u8b* data, dns_header* dns_resp_header, dns_answer*& dns_response)
{
memcpy(dns_resp_header, data, 12);
dns_response = (dns_answer*)malloc(htons(dns_resp_header->answer_rrs.i) * sizeof(dns_answer));
for(; data[i] != 0; i++)
{
i += data[i];
}
i += 5;
for(u16b j = 0; j < htons(dns_resp_header->answer_rrs.i); j++)
{
i += 12;
memcpy(dns_response[j].data, &data[i], 4);
i++;
}
}MOD: ezen a kódon még bőven lehetne optimalizálni, csak nem látom a többi részt.
MOD2: jah és igen. Malloc + 8 bites MCU? Remélem fut valamilyen OS ezen program alatt, ami a fizikai memóriát rendezi, mert az ilyen malloc-olás magában hordozza azt, hogy a kész programod egyszer beáll, mint a szög. A beágyazott rendszerben alapvetően tiltott a malloc használata.
-
G.A.
aktív tag
válasz
buherton #5850 üzenetére
Köszönöm a gyors választ.
dns_answer local_answer -> ez nincs használva.
dns_response -> nincs deklarálva.
local_dns_resp -> nincs deklarálva.
...
dns_answer** answer -> ezt nem használod semmire.A problémás kódrészt próbáltam leegyszerűsítve a hozzászólásba beírni, közben sikerült nekem is belezavarodnom és elírnom.
dns_answer local_answer = local_dns_resp
dns_answer** answer = *dns_responseu8b data[] -> ez nagyon csúnya.
Mitől csúnya? Inkább u8b* data legyen? Még előnybe részesítem a tömböket a pointerekkel szemben, mivel azokat könnyebben kezelem. 8bites uC-n is könnyebben nyomon tudom követni, hogy mennyi RAM-ot is használok...A struct-hoz erősen javaslok egy packed attribute-omot.
Hobbi programozóként nem tudom mit jelent... mire használható.Minek union?
Megint uC-re hivatkozok. Anno #define-t használtam egy tömb változóinak az azonosításához. Ezt cseréltem le unionba ágyazott struktúrákkal. Így értem:typedef union udpv4_header
{
struct
{
my_16b src_port;
my_16b dst_port;
my_16b length;
my_16b checksum;
};
u8b b[8];
}udpv4_header;
A struktúrát használom egy konkrét változó módosításához, majd ha másolom/küldöm az adatcsomagot akkor a b[]-t használom.miért is nem memcpy-k?
Szintén egy hiányosságom. Még nem tanultam meg a használatát...Közben szerintem meglett a megoldás(működik). Ez lett a function() módosított kódja:
void get_data_from_dns_reply(u8b* data, dns_header* dns_resp_header, dns_answer*& dns_response)
{
u8b i = 0;
for (; i < 12; i++)
{
dns_resp_header->b[i] = data[i];
}
dns_response = (dns_answer*)malloc(htons(dns_resp_header->answer_rrs.i) * sizeof(dns_answer));
for(; data[i] != 0; i++)
{
i += data[i];
}
i += 5;
for(u16b j = 0; j < htons(dns_resp_header->answer_rrs.i); j++)
{
i += 12;
for (u8b x = 0; x < 4; x++, i++)
{
dns_response[j].data.b[x] = data[i];
}
}
} -
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. -
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?
-
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);
}
} -
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. -
-
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] -
Domonkos
addikt
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
. -
szombatitomi
senior 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
addikt
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. -
-
#29810176
törölt tag
Sziasztok!
Már most elakadtam
A conio.h nem nagyon ANSILinux 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);
} -
#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ösziEz jó kezdőknek is? Nem igényel más nyelv ismeretét?
-
kispx
addikt
válasz
#29810176 #5827 üzenetére
Offline könyv: Programozzunk C nyelven!
-
#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? -
Domonkos
addikt
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.
-
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;
} -
Domonkos
addikt
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! -
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?
-
Domonkos
addikt
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! -
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!
-
-
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) -
axioma
veterán
-
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?
-
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 ?
Ú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!
- Milyen légkondit a lakásba?
- Radeon RX 9060 XT: Ezt aztán jól meghúzták
- Teljes verziós játékok letöltése ingyen
- Mobil flották
- Epson nyomtatók
- Path of Exile (ARPG)
- Kazy Computers - Fehérvár - Megbízható?
- Yettel topik
- AMD Ryzen 9 / 7 / 5 7***(X) "Zen 4" (AM5)
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- További aktív témák...
- RTX 4080 SUPER,16GB. Ryzen 7 7800X3D, 32 RAM Fury RGB! Garancia!
- Asztali PC , i7 9700K , RX 5700 XT , 32GB DDR4 , 500GB NVME , 1TB HDD
- Dell Inspiron 5406 2-in-1i5-1135G7 16GB DDR4 3200 512GB NVME 14" FHD Érintőkijelző W11Pro
- Eladó MacBook Pro 14" M1 Pro (2021) 16/512 99% akku Makulátlan állapotban!
- Újszeru GIGABYTE G5 - 15.6" FullHD 144Hz - i7-13620H - 48GB - 1TB - RTX 4050 - Win11 - 1,5 év gari
- iKing.Hu - Motorola Edge 50 Ultra - Nordic Wood - Használt, karcmentes
- TELJES KÖRŰ IT BESZERZÉS
- Telefon felvásárlás!! Samsung Galaxy A70/Samsung Galaxy A71/Samsung Galaxy A72
- Csere-Beszámítás! AMD Számítógép PC Játékra! R5 5500 / RX 5700XT / 32GB DDR4 / 256SSD+1TB HDD
- MacBook felvásárlás!! Macbook, Macbook Air, Macbook Pro
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: PC Trade Systems Kft.
Város: Szeged