Hirdetés

Új hozzászólás Aktív témák

  • stepboy
    csendes tag

    Hmm, annyi minden feldolgozni való tudás!

    Az assembly kódhoz ugyan nem értek, de kipróbáltam a te verziódat is, és azzal is ugyanazt tapasztaltam. Lehet majd nemsokára megpróbálom azt, hogy függvényenként külön bekapcsolom az O3-as optimalizálást, hátha úgy kibukik a gondunk forrása.

    Remélem nem túl nagy a kód, különben elég nagy szívás függvényenként végigmenni.
    Hátha ez egy kis segítség lehet: Options That Control Optimization

  • CPT.Pirk
    Jómunkásember

    Valószínű, hogy máshol van a hiba, ami kihatással van az USB működésére. A projekt többi része működik/meg lehet állapítani, hogy működik?

    Viszont a kódot biztosan rossz:
    __attribute __((naked))
    void delay_loop (unsigned n)
    {
    __asm volatile ("1: sub r0, #1");
    __asm volatile (" bne 1b");
    __asm volatile (" bx 1r");
    }

    [Itt találod a GCC Basic Asm leírását]

    Van benne néhány fontos megjegyzés:
    Do not expect a sequence of asm statements to remain perfectly consecutive after compilation. If certain instructions need to remain consecutive in the output, put them in a single multi-instruction asm statement. Note that GCC’s optimizers can move asm statements relative to other code, including across jumps.

    vagy ezek:
    GCC does not parse basic asm’s AssemblerInstructions, which means there is no way to communicate to the compiler what is happening inside them. GCC has no visibility of symbols in the asm and may discard them as unreferenced. It also does not know about side effects of the assembler code, such as modifications to memory or registers. Unlike some compilers, GCC assumes that no changes to general purpose registers occur. This assumption may change in a future release.

    For basic asm with non-empty assembler string GCC assumes the assembler block does not change any general purpose registers, but it may read or write any globally accessible variable.

    Megnéztem az optimalizációs leírást is, O3-mal jön az inline valóban, de azt ki lehet kapcsolni "noinline" attribute-tal (bár ez egy jó régi GCC: 4.7.4).

    Ami a megjegyzéseket illeti, az elsőt nem hiszem, hogy vonatkozik rád a volatile miatt, tehát a sorrend marad. Viszont az inline miatt előfordulhat, hogy nem az van az R0-ban, amire számítasz. Normál esetben a függvényhíváskor az első paraméter valóban oda kell, hogy kerüljön, de ha a függvényt inline-olja a fordító, akkor már nincs garantálva, hogy az R0-án keresztül ad át bármit is, mivel a fordító nem látja, hogy bármi is történik az "n" változóval és azt feltételezi, hogy a regisztereket nem módosítja az assembly kódod.

    Azt gondolom, hogyha már mindenképpen beágyazott assembly-t akarsz írni, akkor azt valahogy így kéne csinálni:

    void delay_loop (unsigned n)
    {
    __asm ("1: sub %0, #1 \n\t"
    " bne 1b \n\t"
    " bx 1r "
    :
    : "r" (n));
    }

    Mindezt az Extended-Asm leírás alapján (a fenti link következő oldala); itt már jelzed a fordítónak, hogy egy regisztert biztosan használsz és minden egy helyen van, ezért nem változhat meg a sorrend.

    Bár a legjobb mindenképpen az lenne, ha az egészet átrakod sima assemblyre és akkor a fordító számára egy függvényhívás lesz a kód, amivel már nem tud trükközni.

    Hmm, annyi minden feldolgozni való tudás!

    Az assembly kódhoz ugyan nem értek, de kipróbáltam a te verziódat is, és azzal is ugyanazt tapasztaltam. Lehet majd nemsokára megpróbálom azt, hogy függvényenként külön bekapcsolom az O3-as optimalizálást, hátha úgy kibukik a gondunk forrása.

  • Milgram1
    aktív tag

    Ha feltételt vizsgálsz, akkor a te esetedben if (letezik==false) helyett írhatnál if (!letezik), true-nál meg értelemszerűen nem kell a !, ez csak egy tipp.
    Lefordítottam a kódot és nekem tele volt errorral. C99-es szabványt nekem nem fordítja le a compilerom for(int i=0;....) miatt. Illetve még a struktúrából létrehozott példányt sem fogadta el. Ezt a javítást kellett megcsinálnom. typedef struct nevek{......}nevek;
    Ezek után letudtam fordítani a kódot hiba nélkül, és nekem teljesen jól működik, egyedül az a nem jó, hogy a db változónak 0-át adsz mert így csak az azonosítókat kéri be. Ezt javítsd ki valahogy.

    Értem, köszönöm! :R

  • BTminishop
    aktív tag

    Beraktam ciklusba feltételnek az i<db-ot de most is kifagy nem létező adatnál. Nem a legjobb tanárt kaptuk meg a suliban. :DDD

    Ha feltételt vizsgálsz, akkor a te esetedben if (letezik==false) helyett írhatnál if (!letezik), true-nál meg értelemszerűen nem kell a !, ez csak egy tipp.
    Lefordítottam a kódot és nekem tele volt errorral. C99-es szabványt nekem nem fordítja le a compilerom for(int i=0;....) miatt. Illetve még a struktúrából létrehozott példányt sem fogadta el. Ezt a javítást kellett megcsinálnom. typedef struct nevek{......}nevek;
    Ezek után letudtam fordítani a kódot hiba nélkül, és nekem teljesen jól működik, egyedül az a nem jó, hogy a db változónak 0-át adsz mert így csak az azonosítókat kéri be. Ezt javítsd ki valahogy.

  • Milgram1
    aktív tag

    Az adatmodositas fuggvenyben sem nez ki ez olyan jol:
    while(n[i].azon!=keres) {
    i++;
    }

    mi van ha olyan azonositot adok meg, ami nem letezik? Azt latom hogy mogotte raellenorzol hogy nem futott-e tul az index, de ha egyszer tulfut, akkor bennragad ebben a ciklusben. Vagy sigsegv-vel kivag... Kellene valami ellenorzes i-re is.

    Progteteleket nem tanitanak nektek? :U

    Beraktam ciklusba feltételnek az i<db-ot de most is kifagy nem létező adatnál. Nem a legjobb tanárt kaptuk meg a suliban. :DDD

  • Domonkos
    addikt

    Próbáltam azt is, de akkor kifagy. :(

    Az adatmodositas fuggvenyben sem nez ki ez olyan jol:
    while(n[i].azon!=keres) {
    i++;
    }

    mi van ha olyan azonositot adok meg, ami nem letezik? Azt latom hogy mogotte raellenorzol hogy nem futott-e tul az index, de ha egyszer tulfut, akkor bennragad ebben a ciklusben. Vagy sigsegv-vel kivag... Kellene valami ellenorzes i-re is.

    Progteteleket nem tanitanak nektek? :U

  • Milgram1
    aktív tag

    Szerintem a keresesnel csak siman tulfutsz az i indexeddel. Ha a programodban mindig pontosan db szamu rekordod van, akkor a kereses ciklusaban nem i<=db lesz a megallas, hanem i < db. Elso korben ezt nezd meg. :K

    Próbáltam azt is, de akkor kifagy. :(

  • Domonkos
    addikt

    Hali!
    Kaptam egy olyan házi feladatot, hogy egy korábbi adatnyilvántartó programomat kell átírnom úgy hogy rekordok tárolásához struktúrát használjak, és mindenhez függvényt kell. Ez meg is van viszont a problémám az, hogy a keresés, és módosítás rész sehogy sem akar össze jönni, vagyis ha olyan azonosítóra keresek ami nem létezik akkor vagy kifagy a program vagy pedig csak kiír valamit ami egyébként nincs benne. Próbáltam már több módot, a törlés részből másoltam akkor sem volt jó szóval nem nagyon tudok vele már mit kezdeni.

    más: Az miért van, hogy a code::blocks rendesen megjeleníti ahogy elterveztem, viszont nem működik a program? ez alatt azt értem, hogy amikor új adatot akarok megadni akkor folyamat csak új azonosítót kér, a devC++ meg fordítva.

    Szerintem a keresesnel csak siman tulfutsz az i indexeddel. Ha a programodban mindig pontosan db szamu rekordod van, akkor a kereses ciklusaban nem i<=db lesz a megallas, hanem i < db. Elso korben ezt nezd meg. :K

  • Milgram1
    aktív tag

    Hali!
    Kaptam egy olyan házi feladatot, hogy egy korábbi adatnyilvántartó programomat kell átírnom úgy hogy rekordok tárolásához struktúrát használjak, és mindenhez függvényt kell. Ez meg is van viszont a problémám az, hogy a keresés, és módosítás rész sehogy sem akar össze jönni, vagyis ha olyan azonosítóra keresek ami nem létezik akkor vagy kifagy a program vagy pedig csak kiír valamit ami egyébként nincs benne. Próbáltam már több módot, a törlés részből másoltam akkor sem volt jó szóval nem nagyon tudok vele már mit kezdeni.

    más: Az miért van, hogy a code::blocks rendesen megjeleníti ahogy elterveztem, viszont nem működik a program? ez alatt azt értem, hogy amikor új adatot akarok megadni akkor folyamat csak új azonosítót kér, a devC++ meg fordítva.

  • stepboy
    csendes tag

    Megpróbáltam, érdekes módon nem sikerült megtalálnom azt a részt, ami a gondot okozza. Se a delay, se az usb-s függvények O0-ra állított optimalizálása nem okozott eltérést. Majd még vizsgálódok tovább.

    Valószínű, hogy máshol van a hiba, ami kihatással van az USB működésére. A projekt többi része működik/meg lehet állapítani, hogy működik?

    Viszont a kódot biztosan rossz:
    __attribute __((naked))
    void delay_loop (unsigned n)
    {
    __asm volatile ("1: sub r0, #1");
    __asm volatile (" bne 1b");
    __asm volatile (" bx 1r");
    }

    [Itt találod a GCC Basic Asm leírását]

    Van benne néhány fontos megjegyzés:
    Do not expect a sequence of asm statements to remain perfectly consecutive after compilation. If certain instructions need to remain consecutive in the output, put them in a single multi-instruction asm statement. Note that GCC’s optimizers can move asm statements relative to other code, including across jumps.

    vagy ezek:
    GCC does not parse basic asm’s AssemblerInstructions, which means there is no way to communicate to the compiler what is happening inside them. GCC has no visibility of symbols in the asm and may discard them as unreferenced. It also does not know about side effects of the assembler code, such as modifications to memory or registers. Unlike some compilers, GCC assumes that no changes to general purpose registers occur. This assumption may change in a future release.

    For basic asm with non-empty assembler string GCC assumes the assembler block does not change any general purpose registers, but it may read or write any globally accessible variable.

    Megnéztem az optimalizációs leírást is, O3-mal jön az inline valóban, de azt ki lehet kapcsolni "noinline" attribute-tal (bár ez egy jó régi GCC: 4.7.4).

    Ami a megjegyzéseket illeti, az elsőt nem hiszem, hogy vonatkozik rád a volatile miatt, tehát a sorrend marad. Viszont az inline miatt előfordulhat, hogy nem az van az R0-ban, amire számítasz. Normál esetben a függvényhíváskor az első paraméter valóban oda kell, hogy kerüljön, de ha a függvényt inline-olja a fordító, akkor már nincs garantálva, hogy az R0-án keresztül ad át bármit is, mivel a fordító nem látja, hogy bármi is történik az "n" változóval és azt feltételezi, hogy a regisztereket nem módosítja az assembly kódod.

    Azt gondolom, hogyha már mindenképpen beágyazott assembly-t akarsz írni, akkor azt valahogy így kéne csinálni:

    void delay_loop (unsigned n)
    {
    __asm ("1: sub %0, #1 \n\t"
    " bne 1b \n\t"
    " bx 1r "
    :
    : "r" (n));
    }

    Mindezt az Extended-Asm leírás alapján (a fenti link következő oldala); itt már jelzed a fordítónak, hogy egy regisztert biztosan használsz és minden egy helyen van, ezért nem változhat meg a sorrend.

    Bár a legjobb mindenképpen az lenne, ha az egészet átrakod sima assemblyre és akkor a fordító számára egy függvényhívás lesz a kód, amivel már nem tud trükközni.

  • CPT.Pirk
    Jómunkásember

    esetleg, próbáld ki ezt:
    http://stackoverflow.com/questions/12114019/g-and-attribute-optimize-not-changing-debugger-behavior

    itt azt írja, hogy alapból O2-vel fordít, de egy függvényt ezzel az attribute-tal máshogy tud optimalizálni.

    #include <iostream>
    #include <vector>

    int MyNormalFunction();

    int MyDebugabbleFunction() __attribute__((optimize(0)));

    int MyNormalFunction()
    {
    int val = 0; // breakpoint here - debugger does NOT stop here
    val = 1;
    val = 2;
    return val;
    } // debugger stops here instead

    int MyDebugabbleFunction()
    {
    int val = 0; // breakpoint here - debugger stops here and steps through the next 3 lines as if it were built with only -g
    val = 1;
    val = 2;
    return val;
    }

    int main()
    {
    int a = MyNormalFunction();
    std::cout << a << std::endl;

    int b = MyDebugabbleFunction();
    std::cout << b << std::endl;

    return 0;
    }

    Megpróbáltam, érdekes módon nem sikerült megtalálnom azt a részt, ami a gondot okozza. Se a delay, se az usb-s függvények O0-ra állított optimalizálása nem okozott eltérést. Majd még vizsgálódok tovább.

  • stepboy
    csendes tag

    Nem rossz gondolat, csak nem tudom miként lehet ezt megcsinálni a CooCox ide-ben.

    stepboy: jó ötlet!

    Amúgy sokfelé van hívva, ez minden időzítésnek az alapja. Az inlineolás jó kérdés, ahogy olvastam a gcc doksikat, azt O2-nél már magától csinálja, valamilyen logika alapján, független a kézi inline deklarálástól.

    esetleg, próbáld ki ezt:
    http://stackoverflow.com/questions/12114019/g-and-attribute-optimize-not-changing-debugger-behavior

    itt azt írja, hogy alapból O2-vel fordít, de egy függvényt ezzel az attribute-tal máshogy tud optimalizálni.

    #include <iostream>
    #include <vector>

    int MyNormalFunction();

    int MyDebugabbleFunction() __attribute__((optimize(0)));

    int MyNormalFunction()
    {
    int val = 0; // breakpoint here - debugger does NOT stop here
    val = 1;
    val = 2;
    return val;
    } // debugger stops here instead

    int MyDebugabbleFunction()
    {
    int val = 0; // breakpoint here - debugger stops here and steps through the next 3 lines as if it were built with only -g
    val = 1;
    val = 2;
    return val;
    }

    int main()
    {
    int a = MyNormalFunction();
    std::cout << a << std::endl;

    int b = MyDebugabbleFunction();
    std::cout << b << std::endl;

    return 0;
    }

  • stepboy
    csendes tag

    Csak tapogatózunk. Annyit tudunk, hogy a port inicializálásakor egy nagyon pontos idejű delaynek kell ott lennie, mert különben a pc nem látja. Ezen a lenti kódon egyszer kellett módosítani, mikor átváltottunk a SourceryG++ fordítóról GCC-re. Azonos beállítások mellett a GCC-s kóddal nem működött az usb. Azt hiszem meg kellett növelni az egyik értéket egyel.

    Nem lenne gond a csak O2 használata, mert az O3-as optimalizáció már kódméret növekedéssel is jár, de az LTO is megöli az usb-t, miközben elég impresszív kódméret csökkentést lehet vele elérni.

    Ha lesz kis időm ezzel a viszonylag sürgős munkával, akkor majd végignézem egyenként azt a pár kapcsolót, amit az O3 hoz be, hogy melyiknél hal meg az usb.

    Ha van egy szabad portod, akkor tudnál port billegtetést csinálni és kívülről vizsgálni, hogy valóban annyi idő telik-e el mint amennyire számítasz:

    port_fel;
    delay();
    port_le;

    ezt megnézni O2-vel, O3-mal meg LTO-val. Ha igen, akkor nem ezzel a függvénnyel lesz baj.

    Nem tudom, lehet, hogy hülyeség - esetleg, nem inline-olja a függvényt és cseszi el a regisztereket az O3/LTO build? Sok helyről hívjátok ezt a függvényt? Ha nem, akkor gyorsan meg lehetne nézni azokat a területeket is egy disassemblyvel.

  • CPT.Pirk
    Jómunkásember

    Vagy esetleg azt is lehet, hogy a delayes részt kirakni egy külön .c file-ba és azt O2-vel fordítani, a tobbi meg mehet O3-mal.

    Nem rossz gondolat, csak nem tudom miként lehet ezt megcsinálni a CooCox ide-ben.

    stepboy: jó ötlet!

    Amúgy sokfelé van hívva, ez minden időzítésnek az alapja. Az inlineolás jó kérdés, ahogy olvastam a gcc doksikat, azt O2-nél már magától csinálja, valamilyen logika alapján, független a kézi inline deklarálástól.

  • dabadab
    titán

    Csak tapogatózunk. Annyit tudunk, hogy a port inicializálásakor egy nagyon pontos idejű delaynek kell ott lennie, mert különben a pc nem látja. Ezen a lenti kódon egyszer kellett módosítani, mikor átváltottunk a SourceryG++ fordítóról GCC-re. Azonos beállítások mellett a GCC-s kóddal nem működött az usb. Azt hiszem meg kellett növelni az egyik értéket egyel.

    Nem lenne gond a csak O2 használata, mert az O3-as optimalizáció már kódméret növekedéssel is jár, de az LTO is megöli az usb-t, miközben elég impresszív kódméret csökkentést lehet vele elérni.

    Ha lesz kis időm ezzel a viszonylag sürgős munkával, akkor majd végignézem egyenként azt a pár kapcsolót, amit az O3 hoz be, hogy melyiknél hal meg az usb.

    Vagy esetleg azt is lehet, hogy a delayes részt kirakni egy külön .c file-ba és azt O2-vel fordítani, a tobbi meg mehet O3-mal.

  • CPT.Pirk
    Jómunkásember

    Biztos, hogy itt van a hiba és nem máshol? Gondolom az egész kódot O3-ban fordítod.

    Csak tapogatózunk. Annyit tudunk, hogy a port inicializálásakor egy nagyon pontos idejű delaynek kell ott lennie, mert különben a pc nem látja. Ezen a lenti kódon egyszer kellett módosítani, mikor átváltottunk a SourceryG++ fordítóról GCC-re. Azonos beállítások mellett a GCC-s kóddal nem működött az usb. Azt hiszem meg kellett növelni az egyik értéket egyel.

    Nem lenne gond a csak O2 használata, mert az O3-as optimalizáció már kódméret növekedéssel is jár, de az LTO is megöli az usb-t, miközben elég impresszív kódméret csökkentést lehet vele elérni.

    Ha lesz kis időm ezzel a viszonylag sürgős munkával, akkor majd végignézem egyenként azt a pár kapcsolót, amit az O3 hoz be, hogy melyiknél hal meg az usb.

  • stepboy
    csendes tag

    Az attribute-os sort picit más formában kellett megadnom __attribute__ ((naked)), de a GCC és a none-eabi arm-es gcc is ugyanazt fordítja a különböző opt. módokban, beteszi ami ott áll.

    .cpu arm7tdmi
    .fpu softvfp
    .eabi_attribute 20, 1
    .eabi_attribute 21, 1
    .eabi_attribute 23, 3
    .eabi_attribute 24, 1
    .eabi_attribute 25, 1
    .eabi_attribute 26, 1
    .eabi_attribute 30, 6
    .eabi_attribute 34, 0
    .eabi_attribute 18, 4
    .file "delac.c"
    .text
    .align 2
    .global delay_loop
    .type delay_loop, %function
    delay_loop:
    @ Function supports interworking.
    @ Naked Function: prologue and epilogue provided by programmer.
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 1, uses_anonymous_args = 0
    @ 4 "delac.c" 1
    1: sub r0, #1
    @ 0 "" 2
    @ 5 "delac.c" 1
    bne 1b
    @ 0 "" 2
    @ 6 "delac.c" 1
    bx 1r
    @ 0 "" 2
    .size delay_loop, .-delay_loop
    .ident "GCC: (4.9.2-10+14~bpo8+1) 4.9.2"

    Hasonló a sima GCC kimenete is. Annyit még tudok mondani, hogy GCC4.8, 4.9 és 5.x alatt is azonos a helyzet azon a gépen, ahol dolgozom.

    EQMontoya: kellene valaki, aki ért hozzá. :)

    Biztos, hogy itt van a hiba és nem máshol? Gondolom az egész kódot O3-ban fordítod.

  • CPT.Pirk
    Jómunkásember

    Szerintem én első körben megnézném, hogy mit fordít belőle a gcc:
    gcc -S -O3 delay.c

    Az attribute-os sort picit más formában kellett megadnom __attribute__ ((naked)), de a GCC és a none-eabi arm-es gcc is ugyanazt fordítja a különböző opt. módokban, beteszi ami ott áll.

    .cpu arm7tdmi
    .fpu softvfp
    .eabi_attribute 20, 1
    .eabi_attribute 21, 1
    .eabi_attribute 23, 3
    .eabi_attribute 24, 1
    .eabi_attribute 25, 1
    .eabi_attribute 26, 1
    .eabi_attribute 30, 6
    .eabi_attribute 34, 0
    .eabi_attribute 18, 4
    .file "delac.c"
    .text
    .align 2
    .global delay_loop
    .type delay_loop, %function
    delay_loop:
    @ Function supports interworking.
    @ Naked Function: prologue and epilogue provided by programmer.
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 1, uses_anonymous_args = 0
    @ 4 "delac.c" 1
    1: sub r0, #1
    @ 0 "" 2
    @ 5 "delac.c" 1
    bne 1b
    @ 0 "" 2
    @ 6 "delac.c" 1
    bx 1r
    @ 0 "" 2
    .size delay_loop, .-delay_loop
    .ident "GCC: (4.9.2-10+14~bpo8+1) 4.9.2"

    Hasonló a sima GCC kimenete is. Annyit még tudok mondani, hogy GCC4.8, 4.9 és 5.x alatt is azonos a helyzet azon a gépen, ahol dolgozom.

    EQMontoya: kellene valaki, aki ért hozzá. :)

  • EQMontoya
    veterán

    Sziasztok!

    Mikrovezérlőben van egy delay függvényünk, ami asm-ben van írva és azt használjuk késleltetésre. Ez a függvény jól működik, viszont ha USB-t is használunk akkor a GCC O3-as optimalizációjával vagy bekapcsolt LTO-val nem jön létre az USB eszköz, míg minden más beállításban igen és jól is működik.

    Azt gyanítjuk, hogy az O3 optimalizálás csinál valamit ezzel az asm kóddal és az időzítés nem lesz kellően pontos, arra pedig érzékeny az USB.

    __attribute __((naked))
    void delay_loop (unsigned n)
    {
    __asm volatile ("1: sub r0, #1");
    __asm volatile (" bne 1b");
    __asm volatile (" bx 1r");
    }

    Szerintetek?

    Én már láttam ilyen compiler hibát x86->arm crosscompilernél, hogy -O3 esetén "túloptimalizált" (értsd: elb@szott) valamit, szóval mindenképp nézzétek meg az assemblyt, mert lehet, hogy egyszerűen hibás. :)

  • dabadab
    titán

    Sziasztok!

    Mikrovezérlőben van egy delay függvényünk, ami asm-ben van írva és azt használjuk késleltetésre. Ez a függvény jól működik, viszont ha USB-t is használunk akkor a GCC O3-as optimalizációjával vagy bekapcsolt LTO-val nem jön létre az USB eszköz, míg minden más beállításban igen és jól is működik.

    Azt gyanítjuk, hogy az O3 optimalizálás csinál valamit ezzel az asm kóddal és az időzítés nem lesz kellően pontos, arra pedig érzékeny az USB.

    __attribute __((naked))
    void delay_loop (unsigned n)
    {
    __asm volatile ("1: sub r0, #1");
    __asm volatile (" bne 1b");
    __asm volatile (" bx 1r");
    }

    Szerintetek?

    Szerintem én első körben megnézném, hogy mit fordít belőle a gcc:
    gcc -S -O3 delay.c

  • CPT.Pirk
    Jómunkásember

    Sziasztok!

    Mikrovezérlőben van egy delay függvényünk, ami asm-ben van írva és azt használjuk késleltetésre. Ez a függvény jól működik, viszont ha USB-t is használunk akkor a GCC O3-as optimalizációjával vagy bekapcsolt LTO-val nem jön létre az USB eszköz, míg minden más beállításban igen és jól is működik.

    Azt gyanítjuk, hogy az O3 optimalizálás csinál valamit ezzel az asm kóddal és az időzítés nem lesz kellően pontos, arra pedig érzékeny az USB.

    __attribute __((naked))
    void delay_loop (unsigned n)
    {
    __asm volatile ("1: sub r0, #1");
    __asm volatile (" bne 1b");
    __asm volatile (" bx 1r");
    }

    Szerintetek?

  • Domonkos
    addikt

    Köszönöm a választ.
    Igen, rátapintottál a lényegre, eléggé hadilábon állok a c-vel. De valahol el kell kezdenem.
    Linux Fstab-ját szeretném dekódolni, egy struktúrába,
    A tömbindex túllépést már kiküszöböltem. Hozzászoktam hogy az eclipse egyből sír ilyenkor.
    if(tmp == '#') boole=1;
    if(boole==1 && tmp!='\n') continue;
    if(boole==1 && tmp=='\n') {boole=0; continue;}

    Tipp:
    Ha a boole valtozot csak logikai ertekek tarolasara haszanlod, akkor folosleges az ==1 vizsgalat. A nem 0 int az mindig igazra ertekelodik ki. Ha ott van egy redundans ertekvizsgalat, akkor az sokaknak megteveszto lehet. :U
    Hogy olvashatobb legyen a kod, definialhatsz egy sajat tipust az intre amit logikaikent hasznalsz es tovabbi 2 konstanst az igazra es hamisra (pl.: 1, 0). Onnantol hasonlokepp hasznalhatod oket, mint a magasabb nyelvekben. Vagy ha nagyon kenyelmes vagy, akkor include-olhatod az stdbool.h-t ami lenyegeben az iment leirtakat tartalmazza. :K

  • Gyb001
    senior tag

    Úgy látom nagy a baj! Nem csak a memória kezeléssel, hanem úgy általában. Az fstab egy 1 byte (karakter mérete) hosszú memória terület kezdőcíme.
    fstab[i-1]=='\n'
    Ez mi? Inicializálatlanul használod az fstab memória területet, ráadásul rögtön -1 indexszel, ami egyébként is a lefoglalt memória területen kívül esik. Mivel nem írsz rá, hanem csak olvasod, jó eséllyel nem akad ki a program azonnal, de akár az is előfordulhat.
    Szerintem előbb gondold át mit is akarsz csinálni, mert nem csak a C nyelvvel állsz hadilábon. Ha lesz időm, válaszolok bővebben is.

    Köszönöm a választ.
    Igen, rátapintottál a lényegre, eléggé hadilábon állok a c-vel. De valahol el kell kezdenem.
    Linux Fstab-ját szeretném dekódolni, egy struktúrába,
    A tömbindex túllépést már kiküszöböltem. Hozzászoktam hogy az eclipse egyből sír ilyenkor.
    if(tmp == '#') boole=1;
    if(boole==1 && tmp!='\n') continue;
    if(boole==1 && tmp=='\n') {boole=0; continue;}

  • jattila48
    aktív tag

    Üdv.

    Sajnos nem vagyok teljesen képben a memóriakezeléssel. Egy kis segítségre lenne szükségem.
    Pastebin

    Létrehoztam egy struktúrát amiben char * mutatók vannak.
    Ebből létrehoztam egy tömböt.(később ezt is át akarom írni dinamikusra) Majd egy ciklusban az összes struktúra elemet mallocolom. és értéket adok neki.

    A problémám az hogy a cikluson belül amikor értéket adok a struktúra elemeinek akkor azok kiolvashatóak belőle. De amikor az egész struktúrát iratnám ki akkor Minden érték NULL :(

    Mit csinálok rosszul?

    Úgy látom nagy a baj! Nem csak a memória kezeléssel, hanem úgy általában. Az fstab egy 1 byte (karakter mérete) hosszú memória terület kezdőcíme.
    fstab[i-1]=='\n'
    Ez mi? Inicializálatlanul használod az fstab memória területet, ráadásul rögtön -1 indexszel, ami egyébként is a lefoglalt memória területen kívül esik. Mivel nem írsz rá, hanem csak olvasod, jó eséllyel nem akad ki a program azonnal, de akár az is előfordulhat.
    Szerintem előbb gondold át mit is akarsz csinálni, mert nem csak a C nyelvvel állsz hadilábon. Ha lesz időm, válaszolok bővebben is.

  • Gyb001
    senior tag

    :R
    Köszönöm, ez volt a gond.

    Üdv.

    Sajnos nem vagyok teljesen képben a memóriakezeléssel. Egy kis segítségre lenne szükségem.
    Pastebin

    Létrehoztam egy struktúrát amiben char * mutatók vannak.
    Ebből létrehoztam egy tömböt.(később ezt is át akarom írni dinamikusra) Majd egy ciklusban az összes struktúra elemet mallocolom. és értéket adok neki.

    A problémám az hogy a cikluson belül amikor értéket adok a struktúra elemeinek akkor azok kiolvashatóak belőle. De amikor az egész struktúrát iratnám ki akkor Minden érték NULL :(

    Mit csinálok rosszul?

  • Gyb001
    senior tag

    ASCII karakterkódolást használj.
    Gondolom valamit kimásoltál a böngészőből, és egy nyomtathatatlan/láthatatlan karakter bennmaradt.

    :R
    Köszönöm, ez volt a gond.

  • kispx
    addikt

    Üdv.
    Vajon mi lehet a baj? NEm tudok rájönni:(

    struct partition{
    char *path;
    char *mount;
    char *opt;
    char *num1;
    char *num2;
    } ;
    ...
    struct partition p;
    ...

    pch = strtok (fstab," ");
    int j=0;
    while (pch != NULL)
    {
    switch (j)
    ​ 46. sor {
    case 0:
    printf("asd");
    p.path=pch;
    break;
    case 1:
    p.mount=pch;
    break;
    case 2:
    p.opt=pch;
    break;
    case 3:
    p.num1=pch;
    break;
    case 4:
    p.num2=pch;
    break;

    }

    pch = strtok (NULL, " ");
    j++;
    }

    g++ split.c && ./a.out
    split.c:46:1: error: stray ‘\342’ in program
    ��� {
    ^
    split.c:46:2: error: stray ‘\200’ in program
    ��� {
    ^
    split.c:46:3: error: stray ‘\213’ in program
    ���

    ASCII karakterkódolást használj.
    Gondolom valamit kimásoltál a böngészőből, és egy nyomtathatatlan/láthatatlan karakter bennmaradt.

  • Gyb001
    senior tag

    Üdv.
    Vajon mi lehet a baj? NEm tudok rájönni:(

    struct partition{
    char *path;
    char *mount;
    char *opt;
    char *num1;
    char *num2;
    } ;
    ...
    struct partition p;
    ...

    pch = strtok (fstab," ");
    int j=0;
    while (pch != NULL)
    {
    switch (j)
    ​ 46. sor {
    case 0:
    printf("asd");
    p.path=pch;
    break;
    case 1:
    p.mount=pch;
    break;
    case 2:
    p.opt=pch;
    break;
    case 3:
    p.num1=pch;
    break;
    case 4:
    p.num2=pch;
    break;

    }

    pch = strtok (NULL, " ");
    j++;
    }

    g++ split.c && ./a.out
    split.c:46:1: error: stray ‘\342’ in program
    ��� {
    ^
    split.c:46:2: error: stray ‘\200’ in program
    ��� {
    ^
    split.c:46:3: error: stray ‘\213’ in program
    ���

  • DasBoot
    aktív tag

    A fenti oktatóanyagban az Environment Setup pontban részletesen leírja a telepítést, linkelve a mingw honlapját is.

    Ismét előjött az eredeti problémám, de valószínűleg formai hiba miatt, mert készítettem egy újat és minden működött. No, most már jöhet a programozás, aztán a mikrokontroller.

  • Gyakran jönnek ide (és nyilván más hasonló fórumokra is) olyan emberek, akik a tökéletesen nulla szintről (lásd: hová írjam a printf()-t) szeretnének megtanulni programozni és ezt úgy képzelik, hogy majd itt sorról sorra elmagyarázzák nekik a profik. Ez nem működik. Csak akkor tudunk segíteni, ha már legalább az olyan alapfogalmakkal tisztában vagy, mint forráskód, fordító, változó, stb. - és ezt nem lehet kérdezz-felelek formában elsajátítani.

    Itt van egy teljesen kezdőknek készített C tutorial (environment setup, basic syntax, stb.), innen el tudsz indulni, és ha valahol elakadtál, biztosan lesz valaki ebben a topikban, aki segíteni fog:

    https://www.tutorialspoint.com/cprogramming/index.htm

    A fenti oktatóanyagban az Environment Setup pontban részletesen leírja a telepítést, linkelve a mingw honlapját is.

  • DasBoot
    aktív tag

    Akkor manuálisan kell beállítanod a toolchain-t.

    Settings menu -> compiler menüpont -> Toolchain executables fül

    Felül válaszd ki a GNU GCC Compiler-t
    A legfelső szöveges mezőbe, add meg a Mingw gyökérkönyvtárát.
    Majd ellenőrizd le, hogy az alatta található exe-k megtalálhatóak a mingw\bin könyvtárban (kétfajta mingw van és a C/C++ compiler exe-jének a neve eltér)

    Igaz, hogy a .exe-k ugyanazok voltak, de egyesével kiválasztottam mindet. És hoppáááááá, helyreállt a világ. Első sikerélmény, köszönöm a segítséget. Üdv.: Joe

  • DasBoot
    aktív tag

    Gyakran jönnek ide (és nyilván más hasonló fórumokra is) olyan emberek, akik a tökéletesen nulla szintről (lásd: hová írjam a printf()-t) szeretnének megtanulni programozni és ezt úgy képzelik, hogy majd itt sorról sorra elmagyarázzák nekik a profik. Ez nem működik. Csak akkor tudunk segíteni, ha már legalább az olyan alapfogalmakkal tisztában vagy, mint forráskód, fordító, változó, stb. - és ezt nem lehet kérdezz-felelek formában elsajátítani.

    Itt van egy teljesen kezdőknek készített C tutorial (environment setup, basic syntax, stb.), innen el tudsz indulni, és ha valahol elakadtál, biztosan lesz valaki ebben a topikban, aki segíteni fog:

    https://www.tutorialspoint.com/cprogramming/index.htm

    Köszönöm! Nem is azzal van a probléma, mint kezdő, de nem a nulláról kezdő (nem írom le, hogy mi a munkám, de ilyen jellegű programozással először találkozom), hogy hová írjam, azt sok helyen leírják pl. könyvben ,és nem is a tutorial-lal van a gond, hanem mivel írjam oda, ahová kell! Ez volt az első kérdésem. Sajnos, akik válaszoltak itt éppen efölött siklottak el, persze később ez javításra került. Amint sikerül feltelepítenem és normálisan használatba vennem az adott programot, jöhet a link és a tutorial.

  • Telepítés során semmilyen anomáliát nem véltem felfedezni.Természetesen nem akarom beírni az MSExcel-be beírni, sőt a böngészőbe sem a printf()et. Sajnos a profi többség SOSEM segít az érdeklődő kezdőknek, néhány kivételtől eltekintve.

    Gyakran jönnek ide (és nyilván más hasonló fórumokra is) olyan emberek, akik a tökéletesen nulla szintről (lásd: hová írjam a printf()-t) szeretnének megtanulni programozni és ezt úgy képzelik, hogy majd itt sorról sorra elmagyarázzák nekik a profik. Ez nem működik. Csak akkor tudunk segíteni, ha már legalább az olyan alapfogalmakkal tisztában vagy, mint forráskód, fordító, változó, stb. - és ezt nem lehet kérdezz-felelek formában elsajátítani.

    Itt van egy teljesen kezdőknek készített C tutorial (environment setup, basic syntax, stb.), innen el tudsz indulni, és ha valahol elakadtál, biztosan lesz valaki ebben a topikban, aki segíteni fog:

    https://www.tutorialspoint.com/cprogramming/index.htm

  • DasBoot
    aktív tag

    Akkor manuálisan kell beállítanod a toolchain-t.

    Settings menu -> compiler menüpont -> Toolchain executables fül

    Felül válaszd ki a GNU GCC Compiler-t
    A legfelső szöveges mezőbe, add meg a Mingw gyökérkönyvtárát.
    Majd ellenőrizd le, hogy az alatta található exe-k megtalálhatóak a mingw\bin könyvtárban (kétfajta mingw van és a C/C++ compiler exe-jének a neve eltér)

    Mindent a leírtaknak ellenőriztem és ehhez képest nem találtam különbséget.

  • Milgram1
    aktív tag

    1)
    char * strcpy ( char * destination, const char * source );
    Paraméterek sorrendjére ügyelj. Így a csere így néz ki:

    strcpy(tmp1, nevek[j]);
    strcpy(nevek[j], nevek[j+1]);
    strcpy(nevek[j+1], tmp1);

    2) for ciklus feltétele rossz volt. A második részt nézd meg.
    for(int j=0; db-i-1; j++) helyen inkább
    for(int j=0; j<db-i-1; j++)

    Köszönöm a segítséget! :R Nem tudom hogy nem vettem észre. :DDD

  • sztanozs
    veterán

    Telepítés során semmilyen anomáliát nem véltem felfedezni.Természetesen nem akarom beírni az MSExcel-be beírni, sőt a böngészőbe sem a printf()et. Sajnos a profi többség SOSEM segít az érdeklődő kezdőknek, néhány kivételtől eltekintve.

    Konkrétan nem kellene a magas lóról (értsd arogánsan) kérdezni , és akkor nem menne fel a pumpa az itt tanyázó topiclakókban.

    Mert ha viccből kérdezted az MSExcel-t vagy Word-öt, akkor az nagyon nem jött le senkinek...

  • DasBoot
    aktív tag

    Emlékeim szerint a kompájlerrel egybecsomagolt CodeBlocks-ot nem kell tovább konfigurálni, hanem egyből érzékeli a mellé adott gcc-t.Biztosan jó volt a telepítésed?

    Egybként a CB+GCC kombót nem feltétlenül ajánlanám olyan kezdőnek, aki Excel-be akarta írni a printf() -et.Ha Windows-on programozol akkor a PellesC vagy az MS Visual Studio barátibb környezetet biztosít.

    Telepítés során semmilyen anomáliát nem véltem felfedezni.Természetesen nem akarom beírni az MSExcel-be beírni, sőt a böngészőbe sem a printf()et. Sajnos a profi többség SOSEM segít az érdeklődő kezdőknek, néhány kivételtől eltekintve.

  • Megtettem. Ugyanaz történt, mint eddig. Sőőőőt, olyannyira, hogy az előző is 16.01-es volt.

    Emlékeim szerint a kompájlerrel egybecsomagolt CodeBlocks-ot nem kell tovább konfigurálni, hanem egyből érzékeli a mellé adott gcc-t.Biztosan jó volt a telepítésed?

    Egybként a CB+GCC kombót nem feltétlenül ajánlanám olyan kezdőnek, aki Excel-be akarta írni a printf() -et.Ha Windows-on programozol akkor a PellesC vagy az MS Visual Studio barátibb környezetet biztosít.

  • kispx
    addikt

    Most már elindul a program,a törlés része jó is, viszont mikor listáznám akkor leáll a program.
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define max 100

    int main () {
    int azon[max];
    char nevek[max][100];
    int telszam[max];
    int menu;
    int db=0;
    int i,j;
    bool letezik;
    bool kesz;
    int a;
    int keres;
    char torol; //torles megerositesehez
    int tmp;//ideiglenes buborekos rendezeshez
    char tmp1[100];
    printf("\t\t\t\t\tAdatnyilvantarto program: \n");
    printf("Menupontok: \n");
    Menupontok:
    printf("Uj adat:(1), Kereses:(2), Adatmodositas:(3), Torles:(4), Listazas:(5), Kilepes:(6)\n");
    printf("valasz: ");scanf("%d",&menu);
    switch (menu) {
    case 1:
    printf("__________________________________\n");
    printf("Uj adat felvetele\n");
    do {
    azon_bekeres:
    printf("Adjon meg egy int tipusu azonositot: ");scanf("%d",&a);
    for(int i=0;i<db;i++){
    if(azon[I]==a) {
    printf("Ez az azonosito mar szerepel! Adjon meg masikat!");
    goto azon_bekeres;
    letezik=1;[/I]

    [I]}else {
    letezik=0;
    }
    }
    if (letezik==false) {
    azon[db]=a;
    printf("Adja meg a nevet: ");scanf("%s",&nevek[db]);
    printf("Adja meg a telefonszamot: ");scanf("%d",&telszam[db]);
    db++;
    printf("Uj adat felvetel: (0), Menupontok: (1): ");scanf("%d",&kesz);
    }
    }while(kesz!=true);
    goto Menupontok;
    case 2:
    printf("__________________________________\n");
    printf("Kereses:\n");
    printf("rekordok szama: %d\n",db);
    printf("Adja meg a keresendo rekord azonositojat: ");scanf("%d",&keres);
    i=0;
    while(azon(i)!=keres) {
    i++;
    }
    if (i==db+1) {
    printf("Nem letezik rekord a megadott azonositoval!");
    }else {
    printf("Azonosito: %d - Nev: %s - Telefonszam: %d\n",azon(i),nevek(i),telszam(i));
    }
    goto Menupontok;
    case 3:
    printf("__________________________________\n");
    printf("Adatmodositas:\n");
    printf("Adja meg a modositando rekord azonositojat: ");scanf("%d",&keres);
    i=0;
    while(azon(i)!=keres) {
    i++;
    }
    if (i==db+1) {
    printf("Nem letezik rekord a megadott azonositoval!");
    }else {
    printf("Uj nev: ");scanf("%s",&nevek(i));
    printf("Uj telefonszam: ");scanf("%d",&telszam(i));
    }
    printf("\nA modositas megtortent!\n");
    goto Menupontok;
    case 4:
    printf("__________________________________\n");
    printf("Rekord torlese:\n");
    printf("Adja meg a torlendo rekord azonositojat: ");scanf("%d",&keres);
    for(i=0;i<db;i++){
    if(keres==azon(i))break;
    }
    if(db==i)printf("Nem létezik a megadott azonosito!");
    else{
    printf("Biztos torlni akarja a megadott rekordot? (%d - %s - %d)(1-Igen/0-Nem)",azon(i),nevek(i),telszam(i));scanf("%d",&torol);
    if(torol==1) {
    for(;i<db;i++){
    strcpy(nevek(i), nevek[i+1]);
    telszam(i)=telszam[i+1];[/I]

    [I]}
    }else {
    break;
    }
    }
    db--;
    goto Menupontok;
    case 5:
    printf("__________________________________\n");
    printf("Listazas:\n");
    //Buborék rendezés
    for(int i=0;i<db-1;i++) {
    for(int j=0;db-i-1;j++) {
    if(azon[j]<azon[j+1]) {
    tmp=azon[j];
    azon[j]=azon[j+1];
    azon[j+1]=tmp;
    strcpy(tmp1, nevek[j+1]);
    strcpy(nevek[j], nevek[j+1]);
    strcpy(nevek[j+1], tmp1);
    tmp=telszam[j];
    telszam[j]=telszam[j+1];
    telszam[j+1]=tmp;[/I]

    [I]}
    }
    }
    printf("Azonostio - Nev - Telefonszam\n");
    for(int i=0;i<db;i++) {
    printf("%d - %s - %d\n",azon(i),nevek(i),telszam(i));[/I]

    [I]}
    goto Menupontok;
    case 6:
    break;
    }
    }[/I]

    [I]A cserével lenne valami gond?[/I]

    1)
    char * strcpy ( char * destination, const char * source );
    Paraméterek sorrendjére ügyelj. Így a csere így néz ki:

    strcpy(tmp1, nevek[j]);
    strcpy(nevek[j], nevek[j+1]);
    strcpy(nevek[j+1], tmp1);

    2) for ciklus feltétele rossz volt. A második részt nézd meg.
    for(int j=0; db-i-1; j++) helyen inkább
    for(int j=0; j<db-i-1; j++)

  • EQMontoya
    veterán

    Most már elindul a program,a törlés része jó is, viszont mikor listáznám akkor leáll a program.
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define max 100

    int main () {
    int azon[max];
    char nevek[max][100];
    int telszam[max];
    int menu;
    int db=0;
    int i,j;
    bool letezik;
    bool kesz;
    int a;
    int keres;
    char torol; //torles megerositesehez
    int tmp;//ideiglenes buborekos rendezeshez
    char tmp1[100];
    printf("\t\t\t\t\tAdatnyilvantarto program: \n");
    printf("Menupontok: \n");
    Menupontok:
    printf("Uj adat:(1), Kereses:(2), Adatmodositas:(3), Torles:(4), Listazas:(5), Kilepes:(6)\n");
    printf("valasz: ");scanf("%d",&menu);
    switch (menu) {
    case 1:
    printf("__________________________________\n");
    printf("Uj adat felvetele\n");
    do {
    azon_bekeres:
    printf("Adjon meg egy int tipusu azonositot: ");scanf("%d",&a);
    for(int i=0;i<db;i++){
    if(azon[I]==a) {
    printf("Ez az azonosito mar szerepel! Adjon meg masikat!");
    goto azon_bekeres;
    letezik=1;[/I]

    [I]}else {
    letezik=0;
    }
    }
    if (letezik==false) {
    azon[db]=a;
    printf("Adja meg a nevet: ");scanf("%s",&nevek[db]);
    printf("Adja meg a telefonszamot: ");scanf("%d",&telszam[db]);
    db++;
    printf("Uj adat felvetel: (0), Menupontok: (1): ");scanf("%d",&kesz);
    }
    }while(kesz!=true);
    goto Menupontok;
    case 2:
    printf("__________________________________\n");
    printf("Kereses:\n");
    printf("rekordok szama: %d\n",db);
    printf("Adja meg a keresendo rekord azonositojat: ");scanf("%d",&keres);
    i=0;
    while(azon(i)!=keres) {
    i++;
    }
    if (i==db+1) {
    printf("Nem letezik rekord a megadott azonositoval!");
    }else {
    printf("Azonosito: %d - Nev: %s - Telefonszam: %d\n",azon(i),nevek(i),telszam(i));
    }
    goto Menupontok;
    case 3:
    printf("__________________________________\n");
    printf("Adatmodositas:\n");
    printf("Adja meg a modositando rekord azonositojat: ");scanf("%d",&keres);
    i=0;
    while(azon(i)!=keres) {
    i++;
    }
    if (i==db+1) {
    printf("Nem letezik rekord a megadott azonositoval!");
    }else {
    printf("Uj nev: ");scanf("%s",&nevek(i));
    printf("Uj telefonszam: ");scanf("%d",&telszam(i));
    }
    printf("\nA modositas megtortent!\n");
    goto Menupontok;
    case 4:
    printf("__________________________________\n");
    printf("Rekord torlese:\n");
    printf("Adja meg a torlendo rekord azonositojat: ");scanf("%d",&keres);
    for(i=0;i<db;i++){
    if(keres==azon(i))break;
    }
    if(db==i)printf("Nem létezik a megadott azonosito!");
    else{
    printf("Biztos torlni akarja a megadott rekordot? (%d - %s - %d)(1-Igen/0-Nem)",azon(i),nevek(i),telszam(i));scanf("%d",&torol);
    if(torol==1) {
    for(;i<db;i++){
    strcpy(nevek(i), nevek[i+1]);
    telszam(i)=telszam[i+1];[/I]

    [I]}
    }else {
    break;
    }
    }
    db--;
    goto Menupontok;
    case 5:
    printf("__________________________________\n");
    printf("Listazas:\n");
    //Buborék rendezés
    for(int i=0;i<db-1;i++) {
    for(int j=0;db-i-1;j++) {
    if(azon[j]<azon[j+1]) {
    tmp=azon[j];
    azon[j]=azon[j+1];
    azon[j+1]=tmp;
    strcpy(tmp1, nevek[j+1]);
    strcpy(nevek[j], nevek[j+1]);
    strcpy(nevek[j+1], tmp1);
    tmp=telszam[j];
    telszam[j]=telszam[j+1];
    telszam[j+1]=tmp;[/I]

    [I]}
    }
    }
    printf("Azonostio - Nev - Telefonszam\n");
    for(int i=0;i<db;i++) {
    printf("%d - %s - %d\n",azon(i),nevek(i),telszam(i));[/I]

    [I]}
    goto Menupontok;
    case 6:
    break;
    }
    }[/I]

    [I]A cserével lenne valami gond?[/I]

    Légyszi szokj rá a kódformázásra (tabulálás, változók felvétele abban a blokkban, amelyikben használatban vannak, stb), mert ezt így borzalmas olvasni!

  • kispx
    addikt

    Megtettem. Ugyanaz történt, mint eddig. Sőőőőt, olyannyira, hogy az előző is 16.01-es volt.

    Akkor manuálisan kell beállítanod a toolchain-t.

    Settings menu -> compiler menüpont -> Toolchain executables fül

    Felül válaszd ki a GNU GCC Compiler-t
    A legfelső szöveges mezőbe, add meg a Mingw gyökérkönyvtárát.
    Majd ellenőrizd le, hogy az alatta található exe-k megtalálhatóak a mingw\bin könyvtárban (kétfajta mingw van és a C/C++ compiler exe-jének a neve eltér)

  • DasBoot
    aktív tag

    Ha egyszerűen akarsz működő eredményt, töröld le a mostani telepítésedet, és helyette a codeblocks-16.01mingw-setup.exe-t szedd le és telepítsd. Ebben benne van az a GCC fordító, amit hiányol.

    Megtettem. Ugyanaz történt, mint eddig. Sőőőőt, olyannyira, hogy az előző is 16.01-es volt.

  • Karma
    félisten

    Code Blocks-ra esett a választásom. Bele is kerültem az első akadályba, program begépelése után nem írja ki a megfelelő sort, szerintem el sem indul , mert a "Build log"-ban ezt írja:

    ""Rookie3 - Debug": The compiler's setup (GNU GCC Compiler) is invalid, so Code::Blocks cannot find/run the compiler.
    Probably the toolchain path within the compiler options is not setup correctly?! (Do you have a compiler installed?)
    Goto "Settings->Compiler...->Global compiler settings->GNU GCC Compiler->Toolchain executables" and fix the compiler's setup.
    Skipping...
    Nothing to be done (all items are up-to-date).
    "

    Kérdésem az lenne, hogy mi kell még ahhoz, hogy elinduljon? Köszönöm a választ.

    Ha egyszerűen akarsz működő eredményt, töröld le a mostani telepítésedet, és helyette a codeblocks-16.01mingw-setup.exe-t szedd le és telepítsd. Ebben benne van az a GCC fordító, amit hiányol.

  • DasBoot
    aktív tag

    Code Blocks-ra esett a választásom. Bele is kerültem az első akadályba, program begépelése után nem írja ki a megfelelő sort, szerintem el sem indul , mert a "Build log"-ban ezt írja:

    ""Rookie3 - Debug": The compiler's setup (GNU GCC Compiler) is invalid, so Code::Blocks cannot find/run the compiler.
    Probably the toolchain path within the compiler options is not setup correctly?! (Do you have a compiler installed?)
    Goto "Settings->Compiler...->Global compiler settings->GNU GCC Compiler->Toolchain executables" and fix the compiler's setup.
    Skipping...
    Nothing to be done (all items are up-to-date).
    "

    Kérdésem az lenne, hogy mi kell még ahhoz, hogy elinduljon? Köszönöm a választ.

  • Milgram1
    aktív tag

    Most már elindul a program,a törlés része jó is, viszont mikor listáznám akkor leáll a program.
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define max 100

    int main () {
    int azon[max];
    char nevek[max][100];
    int telszam[max];
    int menu;
    int db=0;
    int i,j;
    bool letezik;
    bool kesz;
    int a;
    int keres;
    char torol; //torles megerositesehez
    int tmp;//ideiglenes buborekos rendezeshez
    char tmp1[100];
    printf("\t\t\t\t\tAdatnyilvantarto program: \n");
    printf("Menupontok: \n");
    Menupontok:
    printf("Uj adat:(1), Kereses:(2), Adatmodositas:(3), Torles:(4), Listazas:(5), Kilepes:(6)\n");
    printf("valasz: ");scanf("%d",&menu);
    switch (menu) {
    case 1:
    printf("__________________________________\n");
    printf("Uj adat felvetele\n");
    do {
    azon_bekeres:
    printf("Adjon meg egy int tipusu azonositot: ");scanf("%d",&a);
    for(int i=0;i<db;i++){
    if(azon[I]==a) {
    printf("Ez az azonosito mar szerepel! Adjon meg masikat!");
    goto azon_bekeres;
    letezik=1;[/I]

    [I]}else {
    letezik=0;
    }
    }
    if (letezik==false) {
    azon[db]=a;
    printf("Adja meg a nevet: ");scanf("%s",&nevek[db]);
    printf("Adja meg a telefonszamot: ");scanf("%d",&telszam[db]);
    db++;
    printf("Uj adat felvetel: (0), Menupontok: (1): ");scanf("%d",&kesz);
    }
    }while(kesz!=true);
    goto Menupontok;
    case 2:
    printf("__________________________________\n");
    printf("Kereses:\n");
    printf("rekordok szama: %d\n",db);
    printf("Adja meg a keresendo rekord azonositojat: ");scanf("%d",&keres);
    i=0;
    while(azon(i)!=keres) {
    i++;
    }
    if (i==db+1) {
    printf("Nem letezik rekord a megadott azonositoval!");
    }else {
    printf("Azonosito: %d - Nev: %s - Telefonszam: %d\n",azon(i),nevek(i),telszam(i));
    }
    goto Menupontok;
    case 3:
    printf("__________________________________\n");
    printf("Adatmodositas:\n");
    printf("Adja meg a modositando rekord azonositojat: ");scanf("%d",&keres);
    i=0;
    while(azon(i)!=keres) {
    i++;
    }
    if (i==db+1) {
    printf("Nem letezik rekord a megadott azonositoval!");
    }else {
    printf("Uj nev: ");scanf("%s",&nevek(i));
    printf("Uj telefonszam: ");scanf("%d",&telszam(i));
    }
    printf("\nA modositas megtortent!\n");
    goto Menupontok;
    case 4:
    printf("__________________________________\n");
    printf("Rekord torlese:\n");
    printf("Adja meg a torlendo rekord azonositojat: ");scanf("%d",&keres);
    for(i=0;i<db;i++){
    if(keres==azon(i))break;
    }
    if(db==i)printf("Nem létezik a megadott azonosito!");
    else{
    printf("Biztos torlni akarja a megadott rekordot? (%d - %s - %d)(1-Igen/0-Nem)",azon(i),nevek(i),telszam(i));scanf("%d",&torol);
    if(torol==1) {
    for(;i<db;i++){
    strcpy(nevek(i), nevek[i+1]);
    telszam(i)=telszam[i+1];[/I]

    [I]}
    }else {
    break;
    }
    }
    db--;
    goto Menupontok;
    case 5:
    printf("__________________________________\n");
    printf("Listazas:\n");
    //Buborék rendezés
    for(int i=0;i<db-1;i++) {
    for(int j=0;db-i-1;j++) {
    if(azon[j]<azon[j+1]) {
    tmp=azon[j];
    azon[j]=azon[j+1];
    azon[j+1]=tmp;
    strcpy(tmp1, nevek[j+1]);
    strcpy(nevek[j], nevek[j+1]);
    strcpy(nevek[j+1], tmp1);
    tmp=telszam[j];
    telszam[j]=telszam[j+1];
    telszam[j+1]=tmp;[/I]

    [I]}
    }
    }
    printf("Azonostio - Nev - Telefonszam\n");
    for(int i=0;i<db;i++) {
    printf("%d - %s - %d\n",azon(i),nevek(i),telszam(i));[/I]

    [I]}
    goto Menupontok;
    case 6:
    break;
    }
    }[/I]

    [I]A cserével lenne valami gond?[/I]

  • dobragab
    addikt

    Hali!
    Kellene egy eleg egyszeru adatnyilvantarto programot csinalnom. Annyit kell tudnia, hogy adatokat bekerni, listazni, modositani, torolni es a listazasnal elotte rendezni is kell a tombbot. Annyi meg a kikotes, hogy nem lehet strukturat es dinamukus memoriat hasznalni. A következot alkottam eddig: [link] Egy kis segitsegre lenne szuksemem vele kapcsolatban, a torles es buborekos rendezesnel nem tudom, hogy mit kellene kezdenem vele.

    Valaszoakt elore is koszonom!

    C-ben a sztringek karaktertömbök, és azokat nem lehet csak úgy értékül adni egymásnak. Erre találták fel az strcpy függvényt. Tehát pl. ehelyett:

    nevek[i]=nevek[i+1];

    Ez fog kelleni:

    strcpy(nevek[i], nevek[i+1]);

  • kispx
    addikt

    Hali!
    Kellene egy eleg egyszeru adatnyilvantarto programot csinalnom. Annyit kell tudnia, hogy adatokat bekerni, listazni, modositani, torolni es a listazasnal elotte rendezni is kell a tombbot. Annyi meg a kikotes, hogy nem lehet strukturat es dinamukus memoriat hasznalni. A következot alkottam eddig: [link] Egy kis segitsegre lenne szuksemem vele kapcsolatban, a torles es buborekos rendezesnel nem tudom, hogy mit kellene kezdenem vele.

    Valaszoakt elore is koszonom!

    C != C++ :)

    Tömböt nem tudsz értékadó utasítással másolni.

    char tmp1[100];
    char nevek[max][100];

    tmp1=nevek[j];

    for ciklussal a tömb egyes elemeit másold a a másik tömb megfelelő elemei közé. (Szerk.: bamba voltam; használd a beépített stringkezelő fv-eket.)
    Előtte olvasd át ezt.

  • Milgram1
    aktív tag

    Hali!
    Kellene egy eleg egyszeru adatnyilvantarto programot csinalnom. Annyit kell tudnia, hogy adatokat bekerni, listazni, modositani, torolni es a listazasnal elotte rendezni is kell a tombbot. Annyi meg a kikotes, hogy nem lehet strukturat es dinamukus memoriat hasznalni. A következot alkottam eddig: [link] Egy kis segitsegre lenne szuksemem vele kapcsolatban, a torles es buborekos rendezesnel nem tudom, hogy mit kellene kezdenem vele.

    Valaszoakt elore is koszonom!

  • kispx
    addikt

    Köszönöm. Nem a printf()-ről szeretnék kérdezni, hanem pl. hová írjam: printf(), MSExcel-be, MSWord-be, Notepad-ba ... stb.

    Code Block telepítése

    Első program ami épp egy szöveget ír ki.

  • dabadab
    titán

    Szép napot, Mindenkinek! Tudom, sok a kezdő kérdés, Én is ide tartozom, és leegyszerűsítve: mi kell ahhoz, hogy kiírjam az adott szöveget a képernyőre? Konkrét válaszokat szeretnék, részletesen. Köszönöm a válaszokat. Üdv.: Joe

    10 PRINT "HELLO"

    Egészen konkrétan milyen környezetben, milyen nyelven, hol, hová akarsz kiírni valamit? A fenti pl. Commodore C64-en működik.

  • DasBoot
    aktív tag

    #include <stdio.h>
    A fájl elejére

    kiírni pedig printf("Szoveg"); utasítással tudsz;
    A printfről egy kicsit részletesebben.

    Köszönöm. Nem a printf()-ről szeretnék kérdezni, hanem pl. hová írjam: printf(), MSExcel-be, MSWord-be, Notepad-ba ... stb.

  • kispx
    addikt

    Szép napot, Mindenkinek! Tudom, sok a kezdő kérdés, Én is ide tartozom, és leegyszerűsítve: mi kell ahhoz, hogy kiírjam az adott szöveget a képernyőre? Konkrét válaszokat szeretnék, részletesen. Köszönöm a válaszokat. Üdv.: Joe

    #include <stdio.h>
    A fájl elejére

    kiírni pedig printf("Szoveg"); utasítással tudsz;
    A printfről egy kicsit részletesebben.

  • DasBoot
    aktív tag

    Szép napot, Mindenkinek! Tudom, sok a kezdő kérdés, Én is ide tartozom, és leegyszerűsítve: mi kell ahhoz, hogy kiírjam az adott szöveget a képernyőre? Konkrét válaszokat szeretnék, részletesen. Köszönöm a válaszokat. Üdv.: Joe

  • buherton
    őstag

    Sziasztok!

    A kérdéseim nagyon amatőrek lesznek tudom, de a programozással csak most ismerkedem egy alapozó tárgy keretében és átfutva az elmélet vizsgatémaköröket egyedül a bitműveletekből nincs megfelelő anyagom(ha esetleg valaki tud ilyet és linkelné egy hős lenne :R ).
    Szóval a következő pár feladat nem egyértelmű:

    "Hogyan kell egy unsigned char típusú változóban egy bit értékét lekérdezni? Milyen maszkot készít és milyen operátort használ?"

    "Mutassa be, hogyan készít olyan unsigned char típusú maszkot, amelyben a 2., 3., és a 6. indexű bit egyes, a többi viszont nulla."

    "Írjon példákat a kizáró vagy operátor gyakori alkalmazásaira!"

    Természetesen alap dolgok azért megvannak, mint a maszkolás stb.

    Házi feladatként találd ki és írd meg ide, hogy kispx első feladatra adott két megoldása minben különbözik egymástól. :D

  • kispx
    addikt

    Sziasztok!

    A kérdéseim nagyon amatőrek lesznek tudom, de a programozással csak most ismerkedem egy alapozó tárgy keretében és átfutva az elmélet vizsgatémaköröket egyedül a bitműveletekből nincs megfelelő anyagom(ha esetleg valaki tud ilyet és linkelné egy hős lenne :R ).
    Szóval a következő pár feladat nem egyértelmű:

    "Hogyan kell egy unsigned char típusú változóban egy bit értékét lekérdezni? Milyen maszkot készít és milyen operátort használ?"

    "Mutassa be, hogyan készít olyan unsigned char típusú maszkot, amelyben a 2., 3., és a 6. indexű bit egyes, a többi viszont nulla."

    "Írjon példákat a kizáró vagy operátor gyakori alkalmazásaira!"

    Természetesen alap dolgok azért megvannak, mint a maszkolás stb.

    1) bitenkénti ÉS művelettel

    if ((value & MASK) == MASK) {
    // Egyes értékű bit van a megadott helyen
    } else {
    // Nulla van ott
    }

    Vagy
    if((value & MASK) != 0)

    2) a kettes számrendszerbeli váltsd át 10-es (vagy 16-os) számrendszerbeli számmá

    3) XOR titkosítás

  • XharX
    aktív tag

    Sziasztok!

    A kérdéseim nagyon amatőrek lesznek tudom, de a programozással csak most ismerkedem egy alapozó tárgy keretében és átfutva az elmélet vizsgatémaköröket egyedül a bitműveletekből nincs megfelelő anyagom(ha esetleg valaki tud ilyet és linkelné egy hős lenne :R ).
    Szóval a következő pár feladat nem egyértelmű:

    "Hogyan kell egy unsigned char típusú változóban egy bit értékét lekérdezni? Milyen maszkot készít és milyen operátort használ?"

    "Mutassa be, hogyan készít olyan unsigned char típusú maszkot, amelyben a 2., 3., és a 6. indexű bit egyes, a többi viszont nulla."

    "Írjon példákat a kizáró vagy operátor gyakori alkalmazásaira!"

    Természetesen alap dolgok azért megvannak, mint a maszkolás stb.

  • stepboy
    csendes tag

    Találtam egy nagyon egyszerű megoldást, beírom mert elég jó (szerintem).

    #include <windows.h>
    Sleep(5000) //vár 5 másodpercet.

    ennél nem lehet egyszerűbb, de biztos van buktatója :D

    hát windows.h-val csak windows-on működik a kód, de jó nyomon jársz.

  • kpisti1990
    csendes tag

    A "while( 1 )" az végtelen ciklust jelent, mindig fut a kód amíg nem lépsz ki a ciklusból (például egy "break"-kel). A return-t el sem éri.
    Amire gondolni tudok, hogy ez a ciklus a gépeden natívan fut, ergo nagyon gyors - az egyetlen hely ahol várakozik, az a billentyű lenyomása. Tehát amikor lenyomod a billentyűt, azt gyorsan kiértékeli és végig pörög a statemachine-en végül minden kezdődik elölről; de te még mindig ugyanazt a billentyűt nyomod, ezért úgy tűnik, mintha ismételné magát a program, pedig csak többször lefutott. Ez csak egy tipp, sajnos nem ismerem a stdio-t annyira, hogy megtudjam mondani valóban ez történik a te esetedben is.

    Úgyhogy, lehet hogy érdemes lenne valami lassítást rakni az állapotgépedbe:
    - ALAP: ide nem kell, mert itt várakozik egy billentyű lenyomásra
    - FIZETETT: ide valamilyen késleltető függvény, ami érzékelhetően feltartatja a programfutást (~1s kb.), tehát kiírja a szöveget, majd várakozik és utána lép a következő állapotba
    - KESZ: itt ezt írod "-végén (ital elvételekor) álljon vissza alap állapotba", ebből nekem úgy tűnik, hogy valamilyen gombbal kell jelezni, hogy elvetted az italt, tehát az is billentyű beolvasás kell, hogy legyen.

    case FIZETETT:
    {
    printf( "valami szöveg\n" );
    kesleltet_ms( 1000 );
    state = KESZ;
    break;
    }

    A "kesleltet_ms()" pedig egy nagyon hosszú ciklus, ami a megadott milliszekundumnyi ideig várakozik:

    void kesleltet_ms ( int ms )
    {
    while ( ms )
    {
    ms--;
    for ( int c = 0; c < 65535; c++ )
    {
    /* ez itt ures */
    }
    }
    }

    Ez egy nagyon kezdetleges megoldás, a belső "for" ciklust úgy kell tuningolni, hogy nagyjából 1 milliszekundum alatt érjen végig, szóval a c-t addig kell növelni.
    Két nagyon fontos dolog:
    - fordítás mindenféle optimalizáció nélkül (hogy biztosan benne legyen a lefordított kódban a ciklus és végig is menjen rendesen)
    - a típusod olyan legyen, amibe a szám amit vizsgálni akarsz még elfér (tehát ha csak 16bites "int"-ed van, abba értelemszerűen 65535-nél nagyobb szám nem fér bele)

    Itt egy profibb megoldás: [The delay() Function]

    A kilépésre meg azt javasolnám, hogy a while( 1 ) helyett legyen valami ilyesmi:

    int bentmarad = 1;
    while ( bentmarad )
    {
    switch ( state )
    {
    case ALAP:
    {
    printf( "szöveg\n" );
    char c = getchar();
    if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) || ( c != 'q' ) )
    {
    printf( "rossz billentyű\n" );
    }
    else if ( c == 'k' )
    {
    printf( "jó betű 1.\n" );
    state = FIZETETT;
    }
    else if ( c == 't' )
    {
    printf( "jó betű 2.\n" );
    state = FIZETETT;
    }
    else if ( c == 'q' )
    {
    printf( "viszlát\n" );
    bentmarad = 0;
    }
    ...

    Tehát egy külön billentyűvel megszakítod az egész ciklust - persze, ha a feladatkiírás ezt nem teszi lehetővé, akkor nem kell belerakni a végleges kódba.

    Találtam egy nagyon egyszerű megoldást, beírom mert elég jó (szerintem).

    #include <windows.h>
    Sleep(5000) //vár 5 másodpercet.

    ennél nem lehet egyszerűbb, de biztos van buktatója :D

  • kpisti1990
    csendes tag

    A "while( 1 )" az végtelen ciklust jelent, mindig fut a kód amíg nem lépsz ki a ciklusból (például egy "break"-kel). A return-t el sem éri.
    Amire gondolni tudok, hogy ez a ciklus a gépeden natívan fut, ergo nagyon gyors - az egyetlen hely ahol várakozik, az a billentyű lenyomása. Tehát amikor lenyomod a billentyűt, azt gyorsan kiértékeli és végig pörög a statemachine-en végül minden kezdődik elölről; de te még mindig ugyanazt a billentyűt nyomod, ezért úgy tűnik, mintha ismételné magát a program, pedig csak többször lefutott. Ez csak egy tipp, sajnos nem ismerem a stdio-t annyira, hogy megtudjam mondani valóban ez történik a te esetedben is.

    Úgyhogy, lehet hogy érdemes lenne valami lassítást rakni az állapotgépedbe:
    - ALAP: ide nem kell, mert itt várakozik egy billentyű lenyomásra
    - FIZETETT: ide valamilyen késleltető függvény, ami érzékelhetően feltartatja a programfutást (~1s kb.), tehát kiírja a szöveget, majd várakozik és utána lép a következő állapotba
    - KESZ: itt ezt írod "-végén (ital elvételekor) álljon vissza alap állapotba", ebből nekem úgy tűnik, hogy valamilyen gombbal kell jelezni, hogy elvetted az italt, tehát az is billentyű beolvasás kell, hogy legyen.

    case FIZETETT:
    {
    printf( "valami szöveg\n" );
    kesleltet_ms( 1000 );
    state = KESZ;
    break;
    }

    A "kesleltet_ms()" pedig egy nagyon hosszú ciklus, ami a megadott milliszekundumnyi ideig várakozik:

    void kesleltet_ms ( int ms )
    {
    while ( ms )
    {
    ms--;
    for ( int c = 0; c < 65535; c++ )
    {
    /* ez itt ures */
    }
    }
    }

    Ez egy nagyon kezdetleges megoldás, a belső "for" ciklust úgy kell tuningolni, hogy nagyjából 1 milliszekundum alatt érjen végig, szóval a c-t addig kell növelni.
    Két nagyon fontos dolog:
    - fordítás mindenféle optimalizáció nélkül (hogy biztosan benne legyen a lefordított kódban a ciklus és végig is menjen rendesen)
    - a típusod olyan legyen, amibe a szám amit vizsgálni akarsz még elfér (tehát ha csak 16bites "int"-ed van, abba értelemszerűen 65535-nél nagyobb szám nem fér bele)

    Itt egy profibb megoldás: [The delay() Function]

    A kilépésre meg azt javasolnám, hogy a while( 1 ) helyett legyen valami ilyesmi:

    int bentmarad = 1;
    while ( bentmarad )
    {
    switch ( state )
    {
    case ALAP:
    {
    printf( "szöveg\n" );
    char c = getchar();
    if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) || ( c != 'q' ) )
    {
    printf( "rossz billentyű\n" );
    }
    else if ( c == 'k' )
    {
    printf( "jó betű 1.\n" );
    state = FIZETETT;
    }
    else if ( c == 't' )
    {
    printf( "jó betű 2.\n" );
    state = FIZETETT;
    }
    else if ( c == 'q' )
    {
    printf( "viszlát\n" );
    bentmarad = 0;
    }
    ...

    Tehát egy külön billentyűvel megszakítod az egész ciklust - persze, ha a feladatkiírás ezt nem teszi lehetővé, akkor nem kell belerakni a végleges kódba.

    Szia!

    Igen, leírásban IR szenzor ad jelet ha elvették az italt, itt én arra gondoltam, hogy egy számláló leszámol pár secundumot és akkor visszaáll. Másként nem igazán lehet szerintem szimulálni. Köszönöm a részletes választ :) kipróbálom, próba cseresznye ahogy egy ősi kínai mondás tartja :D

  • kpisti1990
    csendes tag

    Sziasztok!
    Az alábbi problémához szeretnék segítséget kérni tőletek.
    Szeretnék egy olyan számlálót létrehozni, ami hozzáad az előző értékhez. Tehát 0-val kezd, ha beírom, hogy 10 akkor 10 lesz, ha beírom, hogy 20 akkor már 30 stb. És ez menjen el egy értékekig. Mondjuk ertek_max>=200. Ha átlépi vagy egyenlő 200-el a számláló, akkor írjon ki egy üzenetet.

    int ertek=0 //szerintem switch szerkezet
    switch(ertek)
    {
    case 10:
    ertek += 10;
    break;
    case 20:
    ertek += 20;
    break;
    case 50:
    ertek += 50;
    break;
    case 100:
    ertek += 100;
    break;
    default:
    printf("Hibas érték!\n");

    Én valami ilyesmire gondoltam,remélem jó úton indultam el :), de nem tudok tovább jutni :/(sajnos elég kezdő vagyok még)
    Köszönöm a segítséget előre is. :B :B

    Szia!
    Én egy ilyet találtam ki, haználni is fogom :D

    {
    int n, x, p;
    printf("szoveg\n");
    n=200;
    x = 0;
    while (x < n) {
    scanf("%d",&p);
    x+=p;
    if (x<n)
    printf("Adjon meg hozza\n");
    else
    printf("Sikerult\n");
    }

    remélem segít

  • stepboy
    csendes tag

    Sziasztok!
    Az alábbi problémához szeretnék segítséget kérni tőletek.
    Szeretnék egy olyan számlálót létrehozni, ami hozzáad az előző értékhez. Tehát 0-val kezd, ha beírom, hogy 10 akkor 10 lesz, ha beírom, hogy 20 akkor már 30 stb. És ez menjen el egy értékekig. Mondjuk ertek_max>=200. Ha átlépi vagy egyenlő 200-el a számláló, akkor írjon ki egy üzenetet.

    int ertek=0 //szerintem switch szerkezet
    switch(ertek)
    {
    case 10:
    ertek += 10;
    break;
    case 20:
    ertek += 20;
    break;
    case 50:
    ertek += 50;
    break;
    case 100:
    ertek += 100;
    break;
    default:
    printf("Hibas érték!\n");

    Én valami ilyesmire gondoltam,remélem jó úton indultam el :), de nem tudok tovább jutni :/(sajnos elég kezdő vagyok még)
    Köszönöm a segítséget előre is. :B :B

    Rossz úton indultál el; mert a switch szerkezeted csak véges értéket fogad el - a 0-t például hibásnak vesz, pedig azt akarod alapértéknek.

    Amire szükséged lesz:
    1. szám beolvasás
    2. számok összeadása
    3. feltétel vizsgálat (igaz, akkor kiír egy üzenetet, ha nem akkor vissza az 1.-es pontra)

    Ha így nézed, ez egy ciklus. Tehát neked valamilyen ciklusra lesz szükséged. Ciklus: működés

  • stepboy
    csendes tag

    Szia! Köszönöm a választ! SIkerült! :D
    int main()
    {
    typedef enum {ALAP,FIZETETT,KESZ}STATE_t;
    STATE_t state;

    state=ALAP;
    while (1)
    {
    switch(state){
    case ALAP:
    {
    printf("Udvozlom. Kerem valasszon italt!\n");
    char c = getchar();
    if (c=='k')
    {printf("Kave 100Ft\n");
    state=FIZETETT;}
    else if (c=='t')
    {printf("Tea 150Ft\n");
    state=FIZETETT;}
    else if (c=='c')
    {printf("Forrocsoki 200Ft\n");
    state=FIZETETT;}
    else if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) )
    printf("rossz\n");
    break;
    }
    case FIZETETT:
    {
    printf( "valami szoveg\n" );
    state = KESZ;
    break;
    }
    case KESZ:
    {
    printf( "megint szoveg\n" );
    state = ALAP;
    break;
    }

    }
    }
    return 0;
    }

    Egyet nem értek, ha lefuttatom, magától lefut még1x vagy 2x. return-t kéne átírni? 0-val kezdi előlről az egészet? Mintha tárolná valahol azt, hogy előző körben mit adtanm meg neki.

    A "while( 1 )" az végtelen ciklust jelent, mindig fut a kód amíg nem lépsz ki a ciklusból (például egy "break"-kel). A return-t el sem éri.
    Amire gondolni tudok, hogy ez a ciklus a gépeden natívan fut, ergo nagyon gyors - az egyetlen hely ahol várakozik, az a billentyű lenyomása. Tehát amikor lenyomod a billentyűt, azt gyorsan kiértékeli és végig pörög a statemachine-en végül minden kezdődik elölről; de te még mindig ugyanazt a billentyűt nyomod, ezért úgy tűnik, mintha ismételné magát a program, pedig csak többször lefutott. Ez csak egy tipp, sajnos nem ismerem a stdio-t annyira, hogy megtudjam mondani valóban ez történik a te esetedben is.

    Úgyhogy, lehet hogy érdemes lenne valami lassítást rakni az állapotgépedbe:
    - ALAP: ide nem kell, mert itt várakozik egy billentyű lenyomásra
    - FIZETETT: ide valamilyen késleltető függvény, ami érzékelhetően feltartatja a programfutást (~1s kb.), tehát kiírja a szöveget, majd várakozik és utána lép a következő állapotba
    - KESZ: itt ezt írod "-végén (ital elvételekor) álljon vissza alap állapotba", ebből nekem úgy tűnik, hogy valamilyen gombbal kell jelezni, hogy elvetted az italt, tehát az is billentyű beolvasás kell, hogy legyen.

    case FIZETETT:
    {
    printf( "valami szöveg\n" );
    kesleltet_ms( 1000 );
    state = KESZ;
    break;
    }

    A "kesleltet_ms()" pedig egy nagyon hosszú ciklus, ami a megadott milliszekundumnyi ideig várakozik:

    void kesleltet_ms ( int ms )
    {
    while ( ms )
    {
    ms--;
    for ( int c = 0; c < 65535; c++ )
    {
    /* ez itt ures */
    }
    }
    }

    Ez egy nagyon kezdetleges megoldás, a belső "for" ciklust úgy kell tuningolni, hogy nagyjából 1 milliszekundum alatt érjen végig, szóval a c-t addig kell növelni.
    Két nagyon fontos dolog:
    - fordítás mindenféle optimalizáció nélkül (hogy biztosan benne legyen a lefordított kódban a ciklus és végig is menjen rendesen)
    - a típusod olyan legyen, amibe a szám amit vizsgálni akarsz még elfér (tehát ha csak 16bites "int"-ed van, abba értelemszerűen 65535-nél nagyobb szám nem fér bele)

    Itt egy profibb megoldás: [The delay() Function]

    A kilépésre meg azt javasolnám, hogy a while( 1 ) helyett legyen valami ilyesmi:

    int bentmarad = 1;
    while ( bentmarad )
    {
    switch ( state )
    {
    case ALAP:
    {
    printf( "szöveg\n" );
    char c = getchar();
    if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) || ( c != 'q' ) )
    {
    printf( "rossz billentyű\n" );
    }
    else if ( c == 'k' )
    {
    printf( "jó betű 1.\n" );
    state = FIZETETT;
    }
    else if ( c == 't' )
    {
    printf( "jó betű 2.\n" );
    state = FIZETETT;
    }
    else if ( c == 'q' )
    {
    printf( "viszlát\n" );
    bentmarad = 0;
    }
    ...

    Tehát egy külön billentyűvel megszakítod az egész ciklust - persze, ha a feladatkiírás ezt nem teszi lehetővé, akkor nem kell belerakni a végleges kódba.

  • EQMontoya
    veterán

    Sziasztok!
    Az alábbi problémához szeretnék segítséget kérni tőletek.
    Szeretnék egy olyan számlálót létrehozni, ami hozzáad az előző értékhez. Tehát 0-val kezd, ha beírom, hogy 10 akkor 10 lesz, ha beírom, hogy 20 akkor már 30 stb. És ez menjen el egy értékekig. Mondjuk ertek_max>=200. Ha átlépi vagy egyenlő 200-el a számláló, akkor írjon ki egy üzenetet.

    int ertek=0 //szerintem switch szerkezet
    switch(ertek)
    {
    case 10:
    ertek += 10;
    break;
    case 20:
    ertek += 20;
    break;
    case 50:
    ertek += 50;
    break;
    case 100:
    ertek += 100;
    break;
    default:
    printf("Hibas érték!\n");

    Én valami ilyesmire gondoltam,remélem jó úton indultam el :), de nem tudok tovább jutni :/(sajnos elég kezdő vagyok még)
    Köszönöm a segítséget előre is. :B :B

    Hol terveztél beolvasni? A kódnak semmi köze a fölötte lévő leíráshoz. Vagy Te most az előző kolléga switches megoldásán trollkodsz?

  • Bigro
    csendes tag

    Sziasztok!
    Az alábbi problémához szeretnék segítséget kérni tőletek.
    Szeretnék egy olyan számlálót létrehozni, ami hozzáad az előző értékhez. Tehát 0-val kezd, ha beírom, hogy 10 akkor 10 lesz, ha beírom, hogy 20 akkor már 30 stb. És ez menjen el egy értékekig. Mondjuk ertek_max>=200. Ha átlépi vagy egyenlő 200-el a számláló, akkor írjon ki egy üzenetet.

    int ertek=0 //szerintem switch szerkezet
    switch(ertek)
    {
    case 10:
    ertek += 10;
    break;
    case 20:
    ertek += 20;
    break;
    case 50:
    ertek += 50;
    break;
    case 100:
    ertek += 100;
    break;
    default:
    printf("Hibas érték!\n");

    Én valami ilyesmire gondoltam,remélem jó úton indultam el :), de nem tudok tovább jutni :/(sajnos elég kezdő vagyok még)
    Köszönöm a segítséget előre is. :B :B

  • kpisti1990
    csendes tag

    Így már jobban látom a kódod.
    Miért van két "getchar()" ?

    Igen, úgy értettem, hogy csak akkor adhatsz a "state" változónak új értéket, ha a beolvasott karakter megfelelő, valahogy így:

    while ( 1 )
    {
    switch ( state )
    {
    case ALAP:
    {
    printf( "szöveg\n" );
    char c = getchar();
    if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) )
    {
    printf( "rossz betű\n" );
    }
    else if ( c == 'k' )
    {
    printf( "jó betű 1.\n" );
    state = FIZETETT;
    }
    else if ( c == 't' )
    {
    printf( "jó betű 2.\n" );
    state = FIZETETT;
    }
    else
    {
    printf( "jó betű 3.\n" );
    state = FIZETETT;
    }
    break;
    }
    case FIZETETT:
    {
    printf( "valami szöveg\n" );
    state = KESZ;
    break;
    }
    case KESZ:
    {
    printf( "megint szöveg\n" );
    state = ALAP;
    break;
    }
    }
    }

    Ez nem egy szép kód, de kezdetnek megteszi.

    Szia! Köszönöm a választ! SIkerült! :D
    int main()
    {
    typedef enum {ALAP,FIZETETT,KESZ}STATE_t;
    STATE_t state;

    state=ALAP;
    while (1)
    {
    switch(state){
    case ALAP:
    {
    printf("Udvozlom. Kerem valasszon italt!\n");
    char c = getchar();
    if (c=='k')
    {printf("Kave 100Ft\n");
    state=FIZETETT;}
    else if (c=='t')
    {printf("Tea 150Ft\n");
    state=FIZETETT;}
    else if (c=='c')
    {printf("Forrocsoki 200Ft\n");
    state=FIZETETT;}
    else if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) )
    printf("rossz\n");
    break;
    }
    case FIZETETT:
    {
    printf( "valami szoveg\n" );
    state = KESZ;
    break;
    }
    case KESZ:
    {
    printf( "megint szoveg\n" );
    state = ALAP;
    break;
    }

    }
    }
    return 0;
    }

    Egyet nem értek, ha lefuttatom, magától lefut még1x vagy 2x. return-t kéne átírni? 0-val kezdi előlről az egészet? Mintha tárolná valahol azt, hogy előző körben mit adtanm meg neki.

  • stepboy
    csendes tag

    Szia!

    Köszönöm a választ:) Hasonlóval próbálkoztam, de valamiért nem akar működni :/

    int main()
    {
    typedef enum STATE_t {ALAP,FIZETETT,KESZ}STATE_t;
    STATE_t state;

    state=ALAP;
    while (1)
    {
    switch(state){
    case ALAP:
    printf("Udvozlom!Kerem valasszon italt\n");
    {
    char c;
    c=getchar();
    getchar();
    if (c=='k')
    printf("Kave 100Ft\n");
    if (c=='t')
    printf("Tea 150Ft\n");
    if (c=='c')
    printf("Forrocsoki 200Ft\n");
    }
    state=FIZETETT;
    break;

    case FIZETETT:

    Talán rosszul értelmezem neki a state-t? Vagy "csak a megfelelő karakter beolvasása után lehet "FIZETETT" érték" ezt úgy értetted, hogy erre is kéne írni egy if-es szerkezetet? if (valami==true) state=FIZETETT;?

    Így már jobban látom a kódod.
    Miért van két "getchar()" ?

    Igen, úgy értettem, hogy csak akkor adhatsz a "state" változónak új értéket, ha a beolvasott karakter megfelelő, valahogy így:

    while ( 1 )
    {
    switch ( state )
    {
    case ALAP:
    {
    printf( "szöveg\n" );
    char c = getchar();
    if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) )
    {
    printf( "rossz betű\n" );
    }
    else if ( c == 'k' )
    {
    printf( "jó betű 1.\n" );
    state = FIZETETT;
    }
    else if ( c == 't' )
    {
    printf( "jó betű 2.\n" );
    state = FIZETETT;
    }
    else
    {
    printf( "jó betű 3.\n" );
    state = FIZETETT;
    }
    break;
    }
    case FIZETETT:
    {
    printf( "valami szöveg\n" );
    state = KESZ;
    break;
    }
    case KESZ:
    {
    printf( "megint szöveg\n" );
    state = ALAP;
    break;
    }
    }
    }

    Ez nem egy szép kód, de kezdetnek megteszi.

  • kpisti1990
    csendes tag

    hahó;

    a switch-el a "state" változó értékét vizsgálod, ezért ha az állapotgépet léptetni akarod, akkor annak kell egy új értéket adni.
    valahogy így:
    {
    switch(state)
    case ALAP:
    ...
    state = FIZETETT;
    break;
    case FIZETETT:
    ...
    state = KESZ;
    break;
    case KESZ:
    ...
    state = ALAP;
    break;
    }

    Persze ez csak egy váz. A "state" értéke mindig attól függ, hogy a következő állapotba lépés engedélyezett-e; például az "ALAP" értéknél, csak a megfelelő karakter beolvasása után lehet "FIZETETT" érték, de remélem, hogy a lényeg megvan!

    Ha még nem olvastad, akkor hasznos: [Állapotgépek]

    Legközelebb használd a "Programkód" formázást, hogy olvasható legyen a kód amit beírsz.

    Szia!

    Köszönöm a választ:) Hasonlóval próbálkoztam, de valamiért nem akar működni :/

    int main()
    {
    typedef enum STATE_t {ALAP,FIZETETT,KESZ}STATE_t;
    STATE_t state;

    state=ALAP;
    while (1)
    {
    switch(state){
    case ALAP:
    printf("Udvozlom!Kerem valasszon italt\n");
    {
    char c;
    c=getchar();
    getchar();
    if (c=='k')
    printf("Kave 100Ft\n");
    if (c=='t')
    printf("Tea 150Ft\n");
    if (c=='c')
    printf("Forrocsoki 200Ft\n");
    }
    state=FIZETETT;
    break;

    case FIZETETT:

    Talán rosszul értelmezem neki a state-t? Vagy "csak a megfelelő karakter beolvasása után lehet "FIZETETT" érték" ezt úgy értetted, hogy erre is kéne írni egy if-es szerkezetet? if (valami==true) state=FIZETETT;?

  • stepboy
    csendes tag

    Sziasztok!
    A segítségeteket szeretném kérni. Adott egy állapotgépes feladat:

    -alap állapotban üdvözlő szöveg
    -a user 3 különböző ital közül választhat
    -ital kiválasztása után jelenlen meg az ital neve és ára
    -sikertelen fizetés vagy törlés esetén térjen vissza alap állapotba
    -sikeres fizetés esetén kezdje elkészíteni az italt
    -mikor kész, üzenetben jelezze
    -végén (ital elvételekor) álljon vissza alap állapotba

    Eléggé nagyon kezdő vagyok, most próbálkozok a "hello world"nél komolyabb kóddal először ;) Átrágva a jegyzetetek/fórumokat arra jutottam hogy ez egy switch-case-es eset. Sikerült elérnem, hogy egy adott betű lenyomására egy adott szöveget írjon ki.
    char c;
    c=getchar();
    getchar();
    if (c=='k')
    printf("Kave 100Ft\n");
    if (c=='t')
    printf("Tea 150Ft\n");
    if (c=='c')
    printf("Forrocsoki 200Ft\n");

    valahogy így. Ezt betettem a case ALAP esetbe, eddig rendben van, viszont sehogyse tudom átugrasztani a következő stádiumra. a break; miatt ugyebár kilép az egészből, de én úgy tudom, valahogy mégiscsak átlehete ugrasztani a következő case-re. Remélem érthetően fogalmaztam, segítségeket köszönöm előre is .
    int main()
    {
    typedef enum state {ALAP,FIZETETT,KESZ};
    enum state state=ALAP;
    while (1)
    {
    switch(state){
    case ALAP:
    printf("Udvozlom!Kerem valasszon italt\n");
    {
    char c;
    c=getchar();
    getchar();
    if (c=='k')
    printf("Kave 100Ft\n");
    if (c=='t')
    printf("Tea 150Ft\n");
    if (c=='c')
    printf("Forrocsoki 200Ft\n");
    }
    break;

    case FIZETETT:
    printf("Ital keszitese folyamatban....\n");
    break;

    case KESZ:
    printf("Kesz!Kerem vegye el az italt.Koszonom!\n");
    break;
    default: printf("Sikertelen fizetes vagy torles.\n");
    }

    return 0;

    }
    }
    Itt a teljes. Feltételezem kismillió hiba van benne, de fut :D viszont amit el szeretnék érni hogy miután pl a "k" betűt lenyomtam és kiírta az árát meg a nevét, ne lépjen ki, hanem térjen rá a FIZETETT állapotra(ott természetesen más lesz, csak bírtam neki valamit, hogy lássam átugrik-e). :DD

    hahó;

    a switch-el a "state" változó értékét vizsgálod, ezért ha az állapotgépet léptetni akarod, akkor annak kell egy új értéket adni.
    valahogy így:
    {
    switch(state)
    case ALAP:
    ...
    state = FIZETETT;
    break;
    case FIZETETT:
    ...
    state = KESZ;
    break;
    case KESZ:
    ...
    state = ALAP;
    break;
    }

    Persze ez csak egy váz. A "state" értéke mindig attól függ, hogy a következő állapotba lépés engedélyezett-e; például az "ALAP" értéknél, csak a megfelelő karakter beolvasása után lehet "FIZETETT" érték, de remélem, hogy a lényeg megvan!

    Ha még nem olvastad, akkor hasznos: [Állapotgépek]

    Legközelebb használd a "Programkód" formázást, hogy olvasható legyen a kód amit beírsz.

  • kpisti1990
    csendes tag

    Sziasztok!
    A segítségeteket szeretném kérni. Adott egy állapotgépes feladat:

    -alap állapotban üdvözlő szöveg
    -a user 3 különböző ital közül választhat
    -ital kiválasztása után jelenlen meg az ital neve és ára
    -sikertelen fizetés vagy törlés esetén térjen vissza alap állapotba
    -sikeres fizetés esetén kezdje elkészíteni az italt
    -mikor kész, üzenetben jelezze
    -végén (ital elvételekor) álljon vissza alap állapotba

    Eléggé nagyon kezdő vagyok, most próbálkozok a "hello world"nél komolyabb kóddal először ;) Átrágva a jegyzetetek/fórumokat arra jutottam hogy ez egy switch-case-es eset. Sikerült elérnem, hogy egy adott betű lenyomására egy adott szöveget írjon ki.
    char c;
    c=getchar();
    getchar();
    if (c=='k')
    printf("Kave 100Ft\n");
    if (c=='t')
    printf("Tea 150Ft\n");
    if (c=='c')
    printf("Forrocsoki 200Ft\n");

    valahogy így. Ezt betettem a case ALAP esetbe, eddig rendben van, viszont sehogyse tudom átugrasztani a következő stádiumra. a break; miatt ugyebár kilép az egészből, de én úgy tudom, valahogy mégiscsak átlehete ugrasztani a következő case-re. Remélem érthetően fogalmaztam, segítségeket köszönöm előre is .
    int main()
    {
    typedef enum state {ALAP,FIZETETT,KESZ};
    enum state state=ALAP;
    while (1)
    {
    switch(state){
    case ALAP:
    printf("Udvozlom!Kerem valasszon italt\n");
    {
    char c;
    c=getchar();
    getchar();
    if (c=='k')
    printf("Kave 100Ft\n");
    if (c=='t')
    printf("Tea 150Ft\n");
    if (c=='c')
    printf("Forrocsoki 200Ft\n");
    }
    break;

    case FIZETETT:
    printf("Ital keszitese folyamatban....\n");
    break;

    case KESZ:
    printf("Kesz!Kerem vegye el az italt.Koszonom!\n");
    break;
    default: printf("Sikertelen fizetes vagy torles.\n");
    }

    return 0;

    }
    }
    Itt a teljes. Feltételezem kismillió hiba van benne, de fut :D viszont amit el szeretnék érni hogy miután pl a "k" betűt lenyomtam és kiírta az árát meg a nevét, ne lépjen ki, hanem térjen rá a FIZETETT állapotra(ott természetesen más lesz, csak bírtam neki valamit, hogy lássam átugrik-e). :DD

  • Vagy elolvasod ezt és lenyúlod a függvényeit. Mindenképpen utf-8-ként érdemes kezelni a szövegeket.

    Már fentebb is linkelte valaki, de nekem több gondom is van ezzel a cikkel.

    Egyrészt hibás nevezéktant használ, mert azt mondja, hogy van az UNICODE kódolás és az UTF8, holott az UTF8 az egy unicode kódolás.

    Másrészt nincs olyan, hogy UNICODE kódolás - a cikk - pontos megnevezése nélkül - az UCS2-t mutatja be, illetve az UCS2-UTF8 konverziók egy részét.

    Harmadrészt a cikkben szereplő függvények pont nem segítenek a kérdezőnek, mert neki az ASCII-UTF8 konverziókra van szüksége.

  • dobragab
    addikt

    Fogsz egy text editor, beleírod, hogy áÁ éÉ ... az összes ékezetes magyar betűt, kimented UTF8 kódolással, megnyitod egy hex editorral és már meg is vannak a bájtsorozataid a karakterekhez. Ha jól emlékszem, az összes magyar ékezetes karakter kódpontja két bájtosra kódolódik UTF8-ban, ez könnyít a munkán. Ezután írsz egy függvényt, ami unsigned char-ként végigmegy a sztringed bájtjain - ha az adott char < 128, akkor hagyományos módon kisbetűsítesz, ha pedig >= 128, akkor a fenti bájtsorozatokat cseréled.

    Vagy elolvasod ezt és lenyúlod a függvényeit. Mindenképpen utf-8-ként érdemes kezelni a szövegeket.

  • Ok, de honnét tudom, hogy milyen bytesorozat kell nekem? Ilyet még nem csináltam korábban.
    Kiolvasok 16 bitet/2 byte-ot és azt ellenőrzöm/hasonlítom?
    Viszont ha a sima betűk meg csak 1 byte-ot foglalnak.
    Esetleg kiolvasok 1 byte-ot, ellenőrzöm, hogyha van egyezés, akkor meg van a betű, hogyha nincs, akkor hozzá olvasom a következő byteot is és így hasonlítok?

    Fogsz egy text editor, beleírod, hogy áÁ éÉ ... az összes ékezetes magyar betűt, kimented UTF8 kódolással, megnyitod egy hex editorral és már meg is vannak a bájtsorozataid a karakterekhez. Ha jól emlékszem, az összes magyar ékezetes karakter kódpontja két bájtosra kódolódik UTF8-ban, ez könnyít a munkán. Ezután írsz egy függvényt, ami unsigned char-ként végigmegy a sztringed bájtjain - ha az adott char < 128, akkor hagyományos módon kisbetűsítesz, ha pedig >= 128, akkor a fenti bájtsorozatokat cseréled.

  • llaszlo
    veterán

    Szerintem ne erőltesd a wchar-t, mert nagyon sötét erdőbe visz. Ha a bemeneti szövegeid sima ASCII kódolásúak, akkor a használt kódtábla szerint cserélgetheted a nagy- és kisbetűk bájtjait. Ha UTF8 kódolásúak, akkor írj egy olyan függvényt, ami nem csak egy bájtot, hanem egy bájtsorozatot cserél: pl. Á - d0 91 / á - d0 b1.

    Ok, de honnét tudom, hogy milyen bytesorozat kell nekem? Ilyet még nem csináltam korábban.
    Kiolvasok 16 bitet/2 byte-ot és azt ellenőrzöm/hasonlítom?
    Viszont ha a sima betűk meg csak 1 byte-ot foglalnak.
    Esetleg kiolvasok 1 byte-ot, ellenőrzöm, hogyha van egyezés, akkor meg van a betű, hogyha nincs, akkor hozzá olvasom a következő byteot is és így hasonlítok?

  • Erről a wchar-ról hol találok részletes leírást? Mert eddig nem találtam hozzá olyat ahol minden le van írva, hogy hogyan működik. Ez sima C-ben linux alatt is használható?

    Szerintem ne erőltesd a wchar-t, mert nagyon sötét erdőbe visz. Ha a bemeneti szövegeid sima ASCII kódolásúak, akkor a használt kódtábla szerint cserélgetheted a nagy- és kisbetűk bájtjait. Ha UTF8 kódolásúak, akkor írj egy olyan függvényt, ami nem csak egy bájtot, hanem egy bájtsorozatot cserél: pl. Á - d0 91 / á - d0 b1.

  • llaszlo
    veterán

    "Még mindig ott tartok, hogy az ékezetes karaktereket két helyen tárolja a tömbben."

    Mert UTF-8, ott meg csak az első 128 karakter fér el egy byte-ban.

    Ha rendesen akarsz ASCII-n túli karakterekkel dolgozni, akkor nézd meg a wchar-t, de ott meg a tömb inicializálása lesz némileg munkás, mert ott kénytelen leszel a konkrét számértékeket bepötyögni, vagy kódból inicializálni.

    Erről a wchar-ról hol találok részletes leírást? Mert eddig nem találtam hozzá olyat ahol minden le van írva, hogy hogyan működik. Ez sima C-ben linux alatt is használható?

  • bucsupeti
    senior tag

    Köszi

    A wchar-ral már találkoztam valahol.

    Mi a helyzet ezzel?
    Nem pont ez az ami nekem kéne? Csak még nem értettem meg a működését és, hogy melyik kellene nekem innét. Mert itt van olyan amikor az ékezetes karaktert ékezet nélkülire kódolja. Hogyha jól értek mindent.
    [link]

    ...

  • llaszlo
    veterán

    "Még mindig ott tartok, hogy az ékezetes karaktereket két helyen tárolja a tömbben."

    Mert UTF-8, ott meg csak az első 128 karakter fér el egy byte-ban.

    Ha rendesen akarsz ASCII-n túli karakterekkel dolgozni, akkor nézd meg a wchar-t, de ott meg a tömb inicializálása lesz némileg munkás, mert ott kénytelen leszel a konkrét számértékeket bepötyögni, vagy kódból inicializálni.

    Köszi

    A wchar-ral már találkoztam valahol.

    Mi a helyzet ezzel?
    Nem pont ez az ami nekem kéne? Csak még nem értettem meg a működését és, hogy melyik kellene nekem innét. Mert itt van olyan amikor az ékezetes karaktert ékezet nélkülire kódolja. Hogyha jól értek mindent.
    [link]

  • dabadab
    titán

    Még mindig ott tartok, hogy az ékezetes karaktereket két helyen tárolja a tömbben.
    Egyébként linux alatt csinálom. De a karakter kódolást itt is be lehet állítani. Csak még nem tudom, hogy hogyan.

    Akkor most, hogyan tovább?

    "Még mindig ott tartok, hogy az ékezetes karaktereket két helyen tárolja a tömbben."

    Mert UTF-8, ott meg csak az első 128 karakter fér el egy byte-ban.

    Ha rendesen akarsz ASCII-n túli karakterekkel dolgozni, akkor nézd meg a wchar-t, de ott meg a tömb inicializálása lesz némileg munkás, mert ott kénytelen leszel a konkrét számértékeket bepötyögni, vagy kódból inicializálni.

  • llaszlo
    veterán

    Azt hiszem ez kell nekem.
    [link]

    Még mindig ott tartok, hogy az ékezetes karaktereket két helyen tárolja a tömbben.
    Egyébként linux alatt csinálom. De a karakter kódolást itt is be lehet állítani. Csak még nem tudom, hogy hogyan.

    Akkor most, hogyan tovább?

  • llaszlo
    veterán

    Ezt a -1-es dolgot nem értem.
    Én azt logikáztam ki, hogy kiolvasom a bevitt karaktersor adott elemét 'x'. Aztán összehasonlítom a fent elkészített tömb elemeivel. Ekkor ugye mindegy, hogy kis vagy nagybetű. Mindegy, hogy A, a, Á, á stb van.
    Ha egyezés van, akkor a másik tömb (ami a számokat tartalmazza) adott elemével növelem a változó értékét.
    Amikor elfogytak a karakterek, akkor pedig kész, kilép.

    Viszont az ékezetes karakterek több helyet foglalnak a tömbben. Most ez a gondom.

    Az is megfelel, hogyha az á-t átalakítja a-ra, vagy az Ű-t U-ra, és csak az alap angol karakterek maradnak.
    Azzal is tudok tovább dolgozni.

    Most így néz ki a két tömb

    char betu []="AaÁáBbCcDdEeÉéFfGgHhIiJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz";
    unsigned short szam []= {1,1,1,1,2,2,11,11,4,4,5,5,5,5,17,17,3,3,8,8,10,10,10,10,11,11,12,12,13,13,14,14,16,16,16,16,16,16,16,16,17,17,19,19,20,20,21,21,9,9,6,6,6,6,6,6,6,6,6,6,6,6,15,15,10,10,7,7};

    Azt hiszem ez kell nekem.
    [link]

  • llaszlo
    veterán

    Szia, hát igen, az ékezetes karaktereket nem nagyon támogatják a fordítók. Tudod, van több száz kódlap, és egy toupper-hez nem biztos hogy megérné mindegyiket beletenni, mert nem csak magyarok használják a fordítóprogramokat. Csak megjegyzem, hogy magyar kódlapból is van több tucat... melyiket szeretnéd használni? Az UTF-8 pl két vagy több karakteren ábrázolja az ékezetes betűket...

    Ha neked megfelel pl. a Windows 1250-es vagy az ISO-8859, akkor egyszerű lesz a dolgod:

    Nem kell külön vizsgálnod semmi, csinálsz egy 256 elemű tömböt, amiben 0 értéke van az egyéb karaktereknek, és a kis és nagybetűkhöz (amennyiben nem különbözteted meg őket) ugyan azokat az értékeket írod be. Ha szükséges a hiba kiírása ha egyéb karaktert kapsz, akkor az egyéb karaktereknek adsz pl. -1 értéket, és mielőtt hozzáadod az eredményhez, ezt figyeled.

    Ezt a -1-es dolgot nem értem.
    Én azt logikáztam ki, hogy kiolvasom a bevitt karaktersor adott elemét 'x'. Aztán összehasonlítom a fent elkészített tömb elemeivel. Ekkor ugye mindegy, hogy kis vagy nagybetű. Mindegy, hogy A, a, Á, á stb van.
    Ha egyezés van, akkor a másik tömb (ami a számokat tartalmazza) adott elemével növelem a változó értékét.
    Amikor elfogytak a karakterek, akkor pedig kész, kilép.

    Viszont az ékezetes karakterek több helyet foglalnak a tömbben. Most ez a gondom.

    Az is megfelel, hogyha az á-t átalakítja a-ra, vagy az Ű-t U-ra, és csak az alap angol karakterek maradnak.
    Azzal is tudok tovább dolgozni.

    Most így néz ki a két tömb

    char betu []="AaÁáBbCcDdEeÉéFfGgHhIiJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz";
    unsigned short szam []= {1,1,1,1,2,2,11,11,4,4,5,5,5,5,17,17,3,3,8,8,10,10,10,10,11,11,12,12,13,13,14,14,16,16,16,16,16,16,16,16,17,17,19,19,20,20,21,21,9,9,6,6,6,6,6,6,6,6,6,6,6,6,15,15,10,10,7,7};

  • zka67
    őstag

    Kipróbáltam a toupper-t és az ékezetes karakterek nem lesznek nagybetűk.

    Szia, hát igen, az ékezetes karaktereket nem nagyon támogatják a fordítók. Tudod, van több száz kódlap, és egy toupper-hez nem biztos hogy megérné mindegyiket beletenni, mert nem csak magyarok használják a fordítóprogramokat. Csak megjegyzem, hogy magyar kódlapból is van több tucat... melyiket szeretnéd használni? Az UTF-8 pl két vagy több karakteren ábrázolja az ékezetes betűket...

    Ha neked megfelel pl. a Windows 1250-es vagy az ISO-8859, akkor egyszerű lesz a dolgod:

    Nem kell külön vizsgálnod semmi, csinálsz egy 256 elemű tömböt, amiben 0 értéke van az egyéb karaktereknek, és a kis és nagybetűkhöz (amennyiben nem különbözteted meg őket) ugyan azokat az értékeket írod be. Ha szükséges a hiba kiírása ha egyéb karaktert kapsz, akkor az egyéb karaktereknek adsz pl. -1 értéket, és mielőtt hozzáadod az eredményhez, ezt figyeled.

  • llaszlo
    veterán

    A következő ötletem támadt. Két tömböt hozok létre az egyik tartalmazza a karaktereket kis- és nagybetűkkel a másik pedig az ezekhez tartozó számokat.

    Viszont
    Miért foglalnak két helyet egy tömbben az ékezetes karakterek?

    int x=0;
    unsigned char betu []="AaÁáBbCcDdEeÉéFfGgHhIiJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz";

    Kiíratáskor, viszont ez fogad

    while (betu[x])
    {
    printf ("x=%d %c ", x, betu [x]);
    x++;
    }

    x=0 A x=1 a x=2 � x=3 � x=4 � x=5 � x=6 B x=7 b x=8 C x=9 c x=10 D x=11 d x=12 E x=13 e x=14 � x=15 � x=16 � x=17 � x=18 F x=19 f x=20 G x=21 g x=22 H x=23 h x=24 I x=25 i x=26 J x=27 j x=28 K x=29 k x=30 L x=31 l x=32 M x=33 m x=34 N x=35 n x=36 O x=37 o x=38 � x=39 � x=40 � x=41 � x=42 � x=43 � x=44 � x=45 � x=46 � x=47 � x=48 � x=49 � x=50 P x=51 p x=52 Q x=53 q x=54 R x=55 r x=56 S x=57 s x=58 T x=59 t x=60 U x=61 u x=62 � x=63 � x=64 � x=65 � x=66 � x=67 � x=68 � x=69 � x=70 � x=71 � x=72 � x=73 � x=74 V x=75 v x=76 W x=77 w x=78 X x=79 x x=80 Y x=81 y x=82 Z x=83 z

    Az ékezetes karakterek helyén ?-ek vannak.

    Így látszólag jó, viszont az x értéke mutatja, hogy mégsem egy 69-es tömböt, hanem egy 85-ös tömböt foglal le a \0-val együtt.

    while (betu[x])
    {
    printf ("x=%d %c ", x, betu [x]);
    x++;
    }

    printf ("%d", x);

    AaÁáBbCcDdEeÉéFfGgHhIiJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz84

    Az ékezetes karaktereket 16 biten tárolná és nem 8-on, a char pedig csak 8-cal dolgozik?
    Ez lenne a hiba oka?
    Mi lehet a megoldás?

    Szerk: Visszaolvastam a fórumot is az ékezetes karakterekkel kapcsolatban és láttam, hogy másnál is gondot okoz. Melyik megoldás lenne ebben az esetben a legcélszerűbb?

  • llaszlo
    veterán

    Köszi. Igaz, a space-t nem vettem figyelembe.

    Példa
    Dr Kiss József Géza
    Ez így jó.
    De pl a
    Dr. Kiss József Géza-ban a pont karakter már felesleges, vagy bármi más pl: , ; számok stb.

    A táblázatra fejből nem emlékszem de valahogy így néz ki
    A, Á = 1
    B = 5
    C = 7
    D = 11
    stb

    A bevitt szövegből pedig karakterenként kiolvasom az elemeket és ha A van, akkor ugye 1-el növelve az értéket ha B, akkor 5-tel stb. A space és minden egyéb, viszont 0 kell, hogy legyen, vagy nem is ad hozzá semmit sem. Mert ha eleve nincs egyezés a táblázat elemeivel, akkor mehet tovább a következő karakterre.

    Megnéztem az isalpha függvényt. Ha jól értem a működését, akkor azzal ellenőrizni tudom, hogy betű vagy más karakter van-e. Ha igen, akkor mehet a táblázattal való összehasonlítás, hogyha nem, akkor beolvassa a következő karaktert. Ha így oldom meg, akkor az isspace nem is kell. Viszont a toupper-t le kell futtatnom előtte.

    Azt hiszem, vissza kell mennem az alapokhoz, olyan régen írtam már programot. Viszont jó kis hobbi ez nekem :)

    buherton: Ezt nagyon jó, hogy leírtad. Az alap cézár kódolás feladat amikor egy szöveget a betű eltolással titkosítottunk. Hú de rég volt 99. :)

    Kipróbáltam a toupper-t és az ékezetes karakterek nem lesznek nagybetűk.

  • llaszlo
    veterán

    Szia, van egy kis ellentmondás a feladatodban:

    Ebben csakis betűk szerepelhetnek. Ha más karakter is van, akkor hibaüzenet.
    A space-t ne vegye figyelembe.

    Ha feltételezzük, hogy betűk és szóközök lehetnem az inputban, akkor az isalpha és az isspace lesznek a barátaid.

    Utána már csak egy táblázatra lesz szükséged, amit csinálhatsz akár úgy is, hogy 256 elemű, vagy úgy is, hogy 64 elemű. Az első változat előnye, hogy ott meg tudod adni a space karakternek a 0 értéket, nem kell kétszer vizsgálnod a karaktert. A második változatnál pedig kivonsz 0x40-et a karakter kódjából és azt használod a tömb indexekét, ekkor az 'A'-1 karakter értéke lesz a tömb első eleme.

    Ha a kisbetű és a nagybetű nincs megkülönböztetve, akkor elég egy 26 elemű tömb is a betűk értékeinek, ebben az esetben még a toupper-re is szükséged lesz, és 'A'-t vonsz ki a karaktered értékéből az indexhez.

    Ha nem 256 elemű a tömböd, akkor kétszer is meg kell vizsgálnod a karaktert, hogy valóban betű-e.

    Köszi. Igaz, a space-t nem vettem figyelembe.

    Példa
    Dr Kiss József Géza
    Ez így jó.
    De pl a
    Dr. Kiss József Géza-ban a pont karakter már felesleges, vagy bármi más pl: , ; számok stb.

    A táblázatra fejből nem emlékszem de valahogy így néz ki
    A, Á = 1
    B = 5
    C = 7
    D = 11
    stb

    A bevitt szövegből pedig karakterenként kiolvasom az elemeket és ha A van, akkor ugye 1-el növelve az értéket ha B, akkor 5-tel stb. A space és minden egyéb, viszont 0 kell, hogy legyen, vagy nem is ad hozzá semmit sem. Mert ha eleve nincs egyezés a táblázat elemeivel, akkor mehet tovább a következő karakterre.

    Megnéztem az isalpha függvényt. Ha jól értem a működését, akkor azzal ellenőrizni tudom, hogy betű vagy más karakter van-e. Ha igen, akkor mehet a táblázattal való összehasonlítás, hogyha nem, akkor beolvassa a következő karaktert. Ha így oldom meg, akkor az isspace nem is kell. Viszont a toupper-t le kell futtatnom előtte.

    Azt hiszem, vissza kell mennem az alapokhoz, olyan régen írtam már programot. Viszont jó kis hobbi ez nekem :)

    buherton: Ezt nagyon jó, hogy leírtad. Az alap cézár kódolás feladat amikor egy szöveget a betű eltolással titkosítottunk. Hú de rég volt 99. :)

  • zka67
    őstag

    Hali

    Ezt, hogy a legegyszerűbb megoldani?
    Van egy karakterlánc több karakterből, amit a user ad meg. Ebben csakis betűk szerepelhetnek. Ha más karakter is van, akkor hibaüzenet.
    A betűknek számértéket kell adni egy meghatározott táblázat szerint, és ezeket a számokat összeadni. A space-t ne vegye figyelembe.

    Az elgondolásom.
    fgets-szel beolvastatom a szöveget, majd karakterenként kiolvasom. Aztán ezt a karaktert összehasonlítom a táblázat karaktereivel és a hozzárendelt számmal növelem egy változó értékét, amíg el nem fogynak a karakterek.

    Nagyon régen csináltam ilyet emlékszem rá, hogy a szövegből szám lett. De már nem emlékszem arra, hogy hogyan.

    Szia, van egy kis ellentmondás a feladatodban:

    Ebben csakis betűk szerepelhetnek. Ha más karakter is van, akkor hibaüzenet.
    A space-t ne vegye figyelembe.

    Ha feltételezzük, hogy betűk és szóközök lehetnem az inputban, akkor az isalpha és az isspace lesznek a barátaid.

    Utána már csak egy táblázatra lesz szükséged, amit csinálhatsz akár úgy is, hogy 256 elemű, vagy úgy is, hogy 64 elemű. Az első változat előnye, hogy ott meg tudod adni a space karakternek a 0 értéket, nem kell kétszer vizsgálnod a karaktert. A második változatnál pedig kivonsz 0x40-et a karakter kódjából és azt használod a tömb indexekét, ekkor az 'A'-1 karakter értéke lesz a tömb első eleme.

    Ha a kisbetű és a nagybetű nincs megkülönböztetve, akkor elég egy 26 elemű tömb is a betűk értékeinek, ebben az esetben még a toupper-re is szükséged lesz, és 'A'-t vonsz ki a karaktered értékéből az indexhez.

    Ha nem 256 elemű a tömböd, akkor kétszer is meg kell vizsgálnod a karaktert, hogy valóban betű-e.

  • buherton
    őstag

    Hali

    Ezt, hogy a legegyszerűbb megoldani?
    Van egy karakterlánc több karakterből, amit a user ad meg. Ebben csakis betűk szerepelhetnek. Ha más karakter is van, akkor hibaüzenet.
    A betűknek számértéket kell adni egy meghatározott táblázat szerint, és ezeket a számokat összeadni. A space-t ne vegye figyelembe.

    Az elgondolásom.
    fgets-szel beolvastatom a szöveget, majd karakterenként kiolvasom. Aztán ezt a karaktert összehasonlítom a táblázat karaktereivel és a hozzárendelt számmal növelem egy változó értékét, amíg el nem fogynak a karakterek.

    Nagyon régen csináltam ilyet emlékszem rá, hogy a szövegből szám lett. De már nem emlékszem arra, hogy hogyan.

    Az ASCII betűkből kivonsz ha nagy betű akkor 65-t, ha kis betű, akkor 71-t. A kapott értékkel egy tömböt címzel (LUT).

    A betű már magában egy számként van értelmezve. Gyakorlatilag a karakterlánc egyet elemeit is össze lehetne adni csak ugye nem ez a feladat.

  • llaszlo
    veterán

    Hali

    Ezt, hogy a legegyszerűbb megoldani?
    Van egy karakterlánc több karakterből, amit a user ad meg. Ebben csakis betűk szerepelhetnek. Ha más karakter is van, akkor hibaüzenet.
    A betűknek számértéket kell adni egy meghatározott táblázat szerint, és ezeket a számokat összeadni. A space-t ne vegye figyelembe.

    Az elgondolásom.
    fgets-szel beolvastatom a szöveget, majd karakterenként kiolvasom. Aztán ezt a karaktert összehasonlítom a táblázat karaktereivel és a hozzárendelt számmal növelem egy változó értékét, amíg el nem fogynak a karakterek.

    Nagyon régen csináltam ilyet emlékszem rá, hogy a szövegből szám lett. De már nem emlékszem arra, hogy hogyan.

  • sztanozs
    veterán


    Sajnos nem ennyire egyszerű a dolog.
    Sokat kínlódtam már vele, de valamiért hibás..

    Amúgy ez a c# topicba való volna, ott válaszoltam.

  • don_peter
    senior tag

    vesszőt, space-t és kettőspontot inkább felejtsd el:
    const string fileName = "dptpsmfdcartridge_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".bin";


    Sajnos nem ennyire egyszerű a dolog.
    Sokat kínlódtam már vele, de valamiért hibás..

  • sztanozs
    veterán

    Kedves fórumtársak!

    Írtam egy kis programot mellyel egy általam épített hardverből tölti le a teljes NorFlash (8MB) tartamát.
    Mind ezt bináris állományba.
    Sajnos minden letöltés után törölnöm kell az előzőleg letöltött állományt, továbbá szeretném valahogy a fájlnevében jelölni az időt, hogy mikor lett letöltve.

    A kérdésem az, hogy ezt hogy tudnám megtenni.?

    A kód rész amellyel az állomány nevét létrehozom:
    const string fileName = "dptpsmfdcartridge.bin";
    Próbáltam már pár módon módosítottam, de nem sikerült.
    A fáj nevébe a dátumot is szeretném eltárolni pl így:
    const string fileName = "dptpsmfdcartridge_20161118.bin";
    Ezzel próbálkoztam, csak hogy érthetőbb legyen a dolog:
    const string fileName = "dptpsmfdcartridge_" + DateTime.Now.ToString("y-M-d, H:m:s") + ".bin";
    Utóbbira sajnos hibát dob.
    Létrehozás pedig így:
    string pathString = System.IO.Path.Combine(folderName, fileName);
    csharp 2012-essel próbálkozgatom..

    Előre is köszönöm a segítséget.

    vesszőt, space-t és kettőspontot inkább felejtsd el:
    const string fileName = "dptpsmfdcartridge_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".bin";

  • don_peter
    senior tag

    Kedves fórumtársak!

    Írtam egy kis programot mellyel egy általam épített hardverből tölti le a teljes NorFlash (8MB) tartamát.
    Mind ezt bináris állományba.
    Sajnos minden letöltés után törölnöm kell az előzőleg letöltött állományt, továbbá szeretném valahogy a fájlnevében jelölni az időt, hogy mikor lett letöltve.

    A kérdésem az, hogy ezt hogy tudnám megtenni.?

    A kód rész amellyel az állomány nevét létrehozom:
    const string fileName = "dptpsmfdcartridge.bin";
    Próbáltam már pár módon módosítottam, de nem sikerült.
    A fáj nevébe a dátumot is szeretném eltárolni pl így:
    const string fileName = "dptpsmfdcartridge_20161118.bin";
    Ezzel próbálkoztam, csak hogy érthetőbb legyen a dolog:
    const string fileName = "dptpsmfdcartridge_" + DateTime.Now.ToString("y-M-d, H:m:s") + ".bin";
    Utóbbira sajnos hibát dob.
    Létrehozás pedig így:
    string pathString = System.IO.Path.Combine(folderName, fileName);
    csharp 2012-essel próbálkozgatom..

    Előre is köszönöm a segítséget.

  • dabadab
    titán

    Irsz egy BCD-s aritmetikat :) De reg lattam, me'g IBM4361-nel emlegette'k... jo, javitok: a BCD az ket felbyte-on 1-1 tizes szamjegy, de utana az osszeadasa ugyanaz.
    Amugy megteheted, hogy egyszerre x decimalis szamjegyet konvertalsz... osszeadsz, maradekot kepzel. Ekkor mondjuk 2^30-ba belefer 10^9, 9 szamjegyenkent egy darab egeszet tarolsz, amit nem is kell igy ascii kavarassal konvertalni, minimum masolassal (bocs, en regen hasznaltam C-t, lehet hogy kozvetlen indexek megadasaval) beolvastathatod szamkent.

    A MOS6502 CPU-n (C64, Apple II, NES, Atari 2600, stb) volt BCD üzemmód :)

  • axioma
    veterán

    Sziasztok!

    Egy olyan problémám lenne, hogy van egy fájlom, benne jó nagy számokkal, melyek előjellel együtt 100 karakternél nem hosszabbak, ám így az összes, C-ben előforduló default típusnál nagyobbak. A sorok végét végjel (gondolom \n) jelzi.

    A fájlban egy sorban egy érték szerepel. Újabb sorban a műveleti (összeadás vagy kivonás) jel. Előjeltelenül szerepelnek a pozitiv számok, illetve előjelesen a negatívak. A műveletsor végét egy = jel zárja.

    Ami hirtelen eszembe jutott a megoldást illetően:

    Karaktertömbben tárolni a számjegyeket, ám ekkor azzal a problémával találtam szembe magam, hogy a karakterek ASCII kódja tárolódik, magyarán ha jól gondolom el kell az egészet tolnom 48-cal, hogy megkapjam a valódi számokat.

    Összeadás: Tfh. fel van töltve a két karaktertömböm. Hogyan tovább? Félreértés ne essék, tudok írásban összeadni és kivonni, ám még ez a mezei C kissé új nekem. Valami olyat gondoltam ki, hogy indítok egy for-t a 100-as sorhossztól 0-ig, majd ött jegyenként összeadom őket. Ha nagyobb mint 10 akkor letárolom az utolsó jegyet, a maradékot meg továbbviszem.

    Kivonás: -||-

    Nyilvánvalóan a teljesen saját megoldás a célom, csupán egy kis gondolatébresztőt kérnék, hogy miként kezdenétek neki. Ez annyira alap, hogy félek túlkomplikálom.

    Köszi!

    Üdv. core2

    Irsz egy BCD-s aritmetikat :) De reg lattam, me'g IBM4361-nel emlegette'k... jo, javitok: a BCD az ket felbyte-on 1-1 tizes szamjegy, de utana az osszeadasa ugyanaz.
    Amugy megteheted, hogy egyszerre x decimalis szamjegyet konvertalsz... osszeadsz, maradekot kepzel. Ekkor mondjuk 2^30-ba belefer 10^9, 9 szamjegyenkent egy darab egeszet tarolsz, amit nem is kell igy ascii kavarassal konvertalni, minimum masolassal (bocs, en regen hasznaltam C-t, lehet hogy kozvetlen indexek megadasaval) beolvastathatod szamkent.

  • buherton
    őstag

    Sziasztok!

    Egy olyan problémám lenne, hogy van egy fájlom, benne jó nagy számokkal, melyek előjellel együtt 100 karakternél nem hosszabbak, ám így az összes, C-ben előforduló default típusnál nagyobbak. A sorok végét végjel (gondolom \n) jelzi.

    A fájlban egy sorban egy érték szerepel. Újabb sorban a műveleti (összeadás vagy kivonás) jel. Előjeltelenül szerepelnek a pozitiv számok, illetve előjelesen a negatívak. A műveletsor végét egy = jel zárja.

    Ami hirtelen eszembe jutott a megoldást illetően:

    Karaktertömbben tárolni a számjegyeket, ám ekkor azzal a problémával találtam szembe magam, hogy a karakterek ASCII kódja tárolódik, magyarán ha jól gondolom el kell az egészet tolnom 48-cal, hogy megkapjam a valódi számokat.

    Összeadás: Tfh. fel van töltve a két karaktertömböm. Hogyan tovább? Félreértés ne essék, tudok írásban összeadni és kivonni, ám még ez a mezei C kissé új nekem. Valami olyat gondoltam ki, hogy indítok egy for-t a 100-as sorhossztól 0-ig, majd ött jegyenként összeadom őket. Ha nagyobb mint 10 akkor letárolom az utolsó jegyet, a maradékot meg továbbviszem.

    Kivonás: -||-

    Nyilvánvalóan a teljesen saját megoldás a célom, csupán egy kis gondolatébresztőt kérnék, hogy miként kezdenétek neki. Ez annyira alap, hogy félek túlkomplikálom.

    Köszi!

    Üdv. core2

    Szia!

    Jó gondolat a karaktertömb és jó a probléma felvetés! Fél siker. :)

    Egy struktúrát használnék pl.:
    typedef struct
    {
    char isMinus;
    unsigned int len;
    char *number;
    } number_s

    A fájlban ASCII-ként van letárolva, így amikor letárolnám a struktúrámba, akkor kivonnám az offsetet és egyszerű számként tárolnám, hogy később a műveletek során már ne kelljen ezzel foglalkozni.

    A műveletek kicsit összetettebbek, de valóban a papíron való számolásra érdemes visszavezetni. Amiből kindulhatsz, hogy összeadásnál a leghosszabb szám hossza vagy plusz egy lesz az összeg hossza. Kivonásnál maximum a leghosszabb szám hossza.

    Amit viszont ne kövess el, hogy konstans értékeket használsz! Ha ismerkedsz még csak a nyelvvel, akkor a prototípus lehet fix számú és akkor a logikát ki lehet próbálni, de utána illik generálissá tenni. Ehhez pedig melegen ajánlom a malloc/free függvényt. A struktúrában sem véletlenül van tömb pointer :P .

  • Neil Watts
    veterán

    Sziasztok!

    Egy olyan problémám lenne, hogy van egy fájlom, benne jó nagy számokkal, melyek előjellel együtt 100 karakternél nem hosszabbak, ám így az összes, C-ben előforduló default típusnál nagyobbak. A sorok végét végjel (gondolom \n) jelzi.

    A fájlban egy sorban egy érték szerepel. Újabb sorban a műveleti (összeadás vagy kivonás) jel. Előjeltelenül szerepelnek a pozitiv számok, illetve előjelesen a negatívak. A műveletsor végét egy = jel zárja.

    Ami hirtelen eszembe jutott a megoldást illetően:

    Karaktertömbben tárolni a számjegyeket, ám ekkor azzal a problémával találtam szembe magam, hogy a karakterek ASCII kódja tárolódik, magyarán ha jól gondolom el kell az egészet tolnom 48-cal, hogy megkapjam a valódi számokat.

    Összeadás: Tfh. fel van töltve a két karaktertömböm. Hogyan tovább? Félreértés ne essék, tudok írásban összeadni és kivonni, ám még ez a mezei C kissé új nekem. Valami olyat gondoltam ki, hogy indítok egy for-t a 100-as sorhossztól 0-ig, majd ött jegyenként összeadom őket. Ha nagyobb mint 10 akkor letárolom az utolsó jegyet, a maradékot meg továbbviszem.

    Kivonás: -||-

    Nyilvánvalóan a teljesen saját megoldás a célom, csupán egy kis gondolatébresztőt kérnék, hogy miként kezdenétek neki. Ez annyira alap, hogy félek túlkomplikálom.

    Köszi!

    Üdv. core2

Új hozzászólás Aktív témák

Hirdetés