Új hozzászólás Aktív témák
-
stepboy
csendes tag
válasz
CPT.Pirk #5799 üzenetére
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
válasz
stepboy #5791 üzenetére
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
válasz
BTminishop #5797 üzenetére
Értem, köszönöm!
-
BTminishop
aktív tag
válasz
Milgram1 #5796 üzenetére
Ha feltételt vizsgálsz, akkor a te esetedben
if (letezik==false)
helyett írhatnálif (!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. -
Domonkos
addikt
válasz
Milgram1 #5794 üzenetére
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 ellenorzesi
-re is.Progteteleket nem tanitanak nektek?
-
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
válasz
CPT.Pirk #5790 üzenetére
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.
-
stepboy
csendes tag
válasz
CPT.Pirk #5787 üzenetére
esetleg, próbáld ki ezt:
http://stackoverflow.com/questions/12114019/g-and-attribute-optimize-not-changing-debugger-behavioritt 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
válasz
CPT.Pirk #5785 üzenetére
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
válasz
dabadab #5786 üzenetére
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.
-
CPT.Pirk
Jómunkásember
válasz
stepboy #5784 üzenetére
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.
-
CPT.Pirk
Jómunkásember
válasz
dabadab #5781 üzenetére
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á.
-
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
Tipp:
Ha aboole
valtozot csak logikai ertekek tarolasara haszanlod, akkor folosleges az==1
vizsgalat. A nem 0int
az mindig igazra ertekelodik ki. Ha ott van egy redundans ertekvizsgalat, akkor az sokaknak megteveszto lehet.
Hogy olvashatobb legyen a kod, definialhatsz egy sajat tipust azint
re 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. -
Gyb001
senior tag
válasz
jattila48 #5777 üzenetére
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
Ú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
Üdv.
Sajnos nem vagyok teljesen képben a memóriakezeléssel. Egy kis segítségre lenne szükségem.
PastebinLé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
Üdv.
Vajon mi lehet a baj? NEm tudok rájönnistruct 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
válasz
alapz@j #5768 üzenetére
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.
-
alapz@j
tag
válasz
DasBoot #5764 üzenetére
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:
-
alapz@j
tag
válasz
DasBoot #5758 üzenetére
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
válasz
Milgram1 #5755 üzenetére
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ábbfor(int j=0; j<db-i-1; j++)
-
Milgram1
aktív tag
Szoktam, csak ez a beillesztés most nem jött össze.
-
kispx
addikt
válasz
DasBoot #5758 üzenetére
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) -
Karma
félisten
válasz
DasBoot #5756 üzenetére
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:
locks 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] -
kispx
addikt
válasz
Milgram1 #5752 üzenetére
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
válasz
DasBoot #5749 üzenetére
Első program ami épp egy szöveget ír ki.
-
kispx
addikt
válasz
DasBoot #5747 üzenetére
#include <stdio.h>
A fájl elejérekií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
-
XharX
aktív tag
Köszönöm!
-
-
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
).
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
válasz
kpisti1990 #5741 üzenetére
hát windows.h-val csak windows-on működik a kód, de jó nyomon jársz.
-
kpisti1990
csendes tag
válasz
stepboy #5737 üzenetére
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
-
stepboy
csendes tag
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
válasz
kpisti1990 #5734 üzenetére
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.
-
Bigro
újonc
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. -
kpisti1990
csendes tag
válasz
stepboy #5733 üzenetére
Szia! Köszönöm a választ! SIkerült!
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
válasz
kpisti1990 #5732 üzenetére
Í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
válasz
stepboy #5731 üzenetére
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
válasz
kpisti1990 #5730 üzenetére
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 állapotbaElé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 futviszont 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).
-
alapz@j
tag
válasz
dobragab #5728 üzenetére
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
válasz
alapz@j #5727 üzenetére
Vagy elolvasod ezt és lenyúlod a függvényeit. Mindenképpen utf-8-ként érdemes kezelni a szövegeket.
-
alapz@j
tag
válasz
llaszlo #5726 üzenetére
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
válasz
alapz@j #5725 üzenetére
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? -
alapz@j
tag
válasz
llaszlo #5724 üzenetére
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
válasz
dabadab #5721 üzenetére
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
válasz
llaszlo #5720 üzenetére
"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
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
válasz
llaszlo #5715 üzenetére
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
stbA 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
válasz
llaszlo #5711 üzenetére
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
-
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
válasz
don_peter #5708 üzenetére
Amúgy ez a c# topicba való volna, ott válaszoltam.
-
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.
-
sztanozs
veterán
-
axioma
veterán
válasz
Neil Watts #5701 üzenetére
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
válasz
Neil Watts #5701 üzenetére
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_sA 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
.
-
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
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Mibe tegyem a megtakarításaimat?
- AMD vs. INTEL vs. NVIDIA
- OLED TV topic
- Milyen videókártyát?
- Kerékpárosok, bringások ide!
- Túra és kirándulás topic
- Vélemény: nem úgy tűnik, de Lip-Bu Tan most menti meg az Intelt
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Okosóra és okoskiegészítő topik
- Milyen TV-t vegyek?
- További aktív témák...
- Dell Latitude 5450 Intel Core Ultra 5 135U 4nm 32GB DDR5 érintőképernyős laptop Dell gari 2027.09.hó
- PlayStation 4/5 kontroller analóg cseréje HALL TMR érzékelősre, 1 év garancia!!! Nincs többé drift!!
- PlayStation 5/4 kontroller analóg cseréje HALL TMR érzékelősre, 1 év garancia!!! Nincs többé drift!!
- XBOX ONE/Series kontroller analóg cseréje HALL TMR érzékelősre, 1 év garancia!!! Nincs többé drift!!
- XBOX Series S 512GB, 6 hó garanciával Bp-i üzletből eladó!
- AKCIÓ! ASUS Z97-A Z97 chipset alaplap garanciával hibátlan működéssel
- AKCIÓ! Lenovo Legion Slim 5 16AHP9 notebook - R7 8845HS 16GB RAM 512GB SSD RTX 4060 8GB Win11
- AKCIÓ! Acer Predator Triton Neo 16 15 notebook - Ultra 9 185H 32GB RAM 2TB SSD RTX 4070 WIN11
- Dell Latitude 8-11. gen i5, i7, 2-in-1 szinte minden típus csalódásmentes, jó ár, garancia
- Telefon felvásárlás!! Samsung Galaxy A14/Samsung Galaxy A34/Samsung Galaxy A54
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest