Hirdetés
-
AMD Radeon undervolt/overclock
lo Minden egy hideg, téli estén kezdődött, mikor rájöttem, hogy már kicsit kevés az RTX2060...
-
Mobvoi TicWatch Pro 5 Enduro - kitartás kartárs?
ma WearOS 3.5, két kijelző, hosszú üzemidő, és zavaró apróságok a legújabb TicWatch modellben.
-
EU: a bankoké a felelősség, ha AI-t használnak
it Az EU tőzsdefelügyelete szerint ha AI-t használnak a bankok és befektetési cégek, akkor övék a felelősség.
Új hozzászólás Aktív témák
-
Peter789
senior tag
válasz sztanozs #4350 üzenetére
Persze, a példaprogram pár csak azt passzolgatja egymásnak, ami benne van a kódban, nem randomot... De ebben ahhoz hogy a szerver képes legyen küldeni, először mindenképpen érkeznie kell min 1 byte-nak a klienstől. Nekem ez nem jó, mert a kliens programok amelyekkel működnie kellene nem nagyon küldenek semmit a csatlakozás után... Pl a ser2net is képes arra hogy mindenféle beérkező byte nélkül is közvetíti a rácsatlakozó kliensnek azt, ami beérkezik a másik oldalán (megnyitott sorosport). Ezt hogyan oldják meg? Erre tudtok valami rövid példát mutatni?
----------------------------------------------------------------------------------------------------------------- AquAgorA ...Pál apostol nyomában: http://fleettracker.eu/index.php/component/aquagora
-
sztanozs
veterán
válasz Peter789 #4351 üzenetére
nem. nem fogad semmit küldés előtt... amúgy ha a szerver fogadna küldés előtt, akkor meg a kliensnek kellene küldenie 1 byte-ot fogadás előtt, nem?
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Peter789
senior tag
válasz sztanozs #4353 üzenetére
Az udp-recv.c -t nézem mert mint írtam nekem a szerver oldalra lenne szükségem, az udp-send.c pedig a kliens lenne ami rácsatlakozik - nálam a kliens az a GPSGate, TCP-Com vagy hasonló lesz aminek megadom a szerver IP címét és portját.
A gondom az a példával, hogy a szerver addig nem képes küldeni semmit a kliens felé amíg nem kap tőle legalább 1 byte-ot, hiába csatlakozott be előtte sikeresen. Ezt a byte-ot viszont nem várhatom el a GPSGate-től és barátaitól - mint ahogy pl a ser2net nem is vár semmit, azonnal képes küldeni ahogy rácsatlakozott a kliens. Valami ehhez hasonló példát keresek, csak eddig még nem találtam...
----------------------------------------------------------------------------------------------------------------- AquAgorA ...Pál apostol nyomában: http://fleettracker.eu/index.php/component/aquagora
-
Peter789
senior tag
Még mindig reménykedek hogy valaki tud segíteni... Az udp-recv hiába bi-dir, ez így nem jó nekem hogy először az udp-send -nek meg kell szólítania őt, hogy tudjon küldeni. Valaki tud egy egyszerű példával szolgálni arra, hogy hogyan lehet küldeni a rácsatlakozó GPSGate-nek tetszőleges sorokat?
[ Szerkesztve ]
----------------------------------------------------------------------------------------------------------------- AquAgorA ...Pál apostol nyomában: http://fleettracker.eu/index.php/component/aquagora
-
sztanozs
veterán
válasz Peter789 #4356 üzenetére
UDP-nél nincs kapcsolat felépítés. Csak listener meg sender van és kész...
Ha pedig a listenerre nem kapsz adatot, akkor nem tudsz küldeni sem semmit - mivel nincs hova.Szerintem a GPSGate oldalon egy listener van (adott porton) és csak küldeni kell rá az adatot...
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
oli717
csendes tag
Sziasztok ezzel a progival az a probléma, hogy szépen működik addig amíg a fájlba ki nem írja az időt, mert azt rosszul teszi.
Valakinek valami ötlet
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{int i;clock_t start, stop;
double eltelt_ido;
start = clock();
srand(time(NULL));
for (i=1 ; i < 1000 ; i++)
{
printf ("%d\n", rand ()%99);
}
stop = clock();
eltelt_ido=(double)(stop-start)/CLOCKS_PER_SEC;
printf("%g sec\n",eltelt_ido);
FILE *f;
f = fopen("tablazatt.txt", "a");fprintf(f, "%g sec\n" );
fclose(f);
system("PAUSE");
return 0;
} -
oli717
csendes tag
válasz Ereshkigal #4359 üzenetére
uhh kösziiiii
-
peterszky
őstag
Lenne egy OpenSSL kérdésem:
$ openssl cms -verify -in signed_file -inform DER -CAfile key.pem > plain_file
Verification successfulEzt próbálom a C-s library segítségével egy programba átültetni, de nem igazán sikerült eddig megoldást találnom. A parancssori jól működik.
Az alap példából indultam ki, unable to get local issuer certificate hibával jön vissza.
/* Simple S/MIME verification example */
#include <openssl/pem.h>
#include <openssl/cms.h>
#include <openssl/err.h>
int main(int argc, char **argv)
{
BIO *in = NULL, *out = NULL, *tbio = NULL, *cont = NULL;
X509_STORE *st = NULL;
X509 *cacert = NULL;
CMS_ContentInfo *cms = NULL;
int ret = 1;
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
/* Set up trusted CA certificate store */
st = X509_STORE_new();
/* Read in CA certificate */
tbio = BIO_new_file(argv[1], "r");
if (!tbio)
goto err;
cacert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
if (!cacert)
goto err;
if (!X509_STORE_add_cert(st, cacert))
goto err;
/* Open message being verified */
in = BIO_new_file(argv[2], "r");
if (!in)
goto err;
/* parse message */
//cms = SMIME_read_CMS(in, &cont);
cms = d2i_CMS_bio(in, NULL);
if (!cms)
goto err;
/* File to output verified content to */
out = BIO_new_file(argv[3], "w");
if (!out)
goto err;
if (!CMS_verify(cms, NULL, st, cont, out, 0))
{
fprintf(stderr, "Verification Failure\n");
goto err;
}
fprintf(stderr, "Verification Successful\n");
ret = 0;
err:
if (ret)
{
fprintf(stderr, "Error Verifying Data\n");
ERR_print_errors_fp(stderr);
}
if (cms)
CMS_ContentInfo_free(cms);
if (cacert)
X509_free(cacert);
if (in)
BIO_free(in);
if (out)
BIO_free(out);
if (tbio)
BIO_free(tbio);
return ret;
}[ Szerkesztve ]
What else you gonna do on a Saturday?
-
axioma
veterán
Van egy modul C-ben, amit en mint java programozo kellett kulonbozo okokbol (matematikus hatter) megirjak egy beagyazott rendszerhez. Elso (masodik) kor utan kiderult, hogy alapvetoen siker, de sebesseg miatt ki kell hasznalni azt, hogy a celrendszer 32 bites big endian.
A problema ott van, hogy innentol kezdve nem tudok tesztelni plane debugolni a fejl.kornyezetemben (ecceru netbeans), a celhelyen meg "draga" (egyreszt m.tars es gepenek meg celhardvernek ideje, nalam nem rakhato ossze masik; masreszt meg maceras kinyerni adatot, nincs pl. konzol hogy oda menjen a dump.
Probaltam a guglit is kerdezni, egy feleslegesen nagy rendszert talaltam (Qemu), de azt meg nem sikerult a gepemen osszerakni, es ugyis verebre agyuval esete lenne. A kodomban sincs semmi trukk (valtozok, pointerek, bitmuveletek), nem kell periferia, kivulrol partiz byte-os memoriateruletre mutato parameterekkel meghivnak, en ugyanott valaszolok, es annyi. Mivel biztonsagi fejlesztes, az nem megoldas, hogy a kodot megirom little-re, majd "vigyazva" irjuk at a bigendian-ban mukodore.
Van barkinek otlete, hogy hogyan lehetne ezt valahogy pc-n emulacioval vagy mas modon megoldani? (OFF)Arra lehet szamitani, hogy egyszeri max. par oras feladat (zarojel, ++ es hasonlok elnezese peldaul, netto kodirasi pontatlansagok varhatoak). (/OFF) -
Karma
félisten
válasz Jester01 #4363 üzenetére
Na igen, a qemunál karcsúbban elég nehéz megúszni
Axioma, az hogy big endian valami, még nem sok mindent definiál szerintem. Kérdés az architektúra (ARM, MIPS, SuperH, MicroBlaze, stb.), meg a szoftverkörnyezet is (Linux, valamilyen RTOS, nyers kód a vason). Csak mert ettől is függ, hogy mit kéne emulálni vagy szimulálni.
Szerk.: na jó, második nekifutásra mégse olyan fontos kérdések, mert maga a program elmondásod szerint elég minimalista. Ettől függetlenül nem nagyon lehet megúszni a QEMU-t és a Limux telepítést, csak hogy legyen min futtatni.
Itt egy MIPS útmutató, és itt ugyanez SPARC-kal. Valamelyiket lenyomod, és kész is leszel
[ Szerkesztve ]
“All nothings are not equal.”
-
axioma
veterán
Koszi a valaszokat. Igen, a program a byte-ok bizergalasan kivul semmi kulonoset nem csinal (egy titkositast kell ratolni ill. leszedni a bytetombre mint uzenetre), amugy luminary.
Jo, akkor Qemu... azert gondoltam hogy tulzas, mert a manualjanak 90%-a a periferiak, a net, a kulonbozo mas eszkozok beallitasa, ami nekem mind nem kell. Elkezdtem a leiras szerint a ceges win7 64 bitesre felepiteni, de vagy rosszat toltottem le, vagy a korabban felpakolt mingw nem jo vagy nemtudom, a zlib helyrerakas es a .configure elnagyolt modositasi leirasa kornyeken adtam fel (a letoltott qemu-ban levo qemu-doc.html volt amit probaltam kovetni, lehet hoyg valami masik leirast kellett volna keresnem).
Vegulis linux is van keznel ha nagyon akarom (otthon legalabbis, bar egy oskovulet gepen es nem is a legfrissebb verzio), lehet hogy akkor majd azzal nekiallok, hatha egyszerubb (meg tudtak csinalni automatizaltabbra), mint windows alatt a sok szuttyoges. -
Karma
félisten
Most nézem, hogy a leírásom elavult, a benne lévő Debian letöltési linkek már nem aktuálisak. Így az kuka.
Viszont cserébe találtam aktuális image-eket, leírással, menetkészen Még telepíteni se kell.
[ Szerkesztve ]
“All nothings are not equal.”
-
don_peter
senior tag
Uraim, PIC programozásban jártas C-és emberkét kérdeznék, faggatnák ha segítene.
MPLAB C18 környezetben fejlesztenék, persze mint kezdő és segítségre lenne szükségem, hogy megértsem mit miért és hogyan lehet megoldani.
PIC18F4550-chipel Analóg és Digitálisan beküldött jeleket szeretnék fogadni és azok kiértékelése után egy LCD kijelzőre kiírni az eredményeket. (Analog jelet egy AD849x chip küldené a Digitálisat pedig egy MAX6675-ös. Ez mind kettő K típusú hőszenzor mérésére van.)
Van már sok próbálkozás mögöttem, de nem jutok előrébb és az angol dokumentációk sem tudtak kisegíteni.
Előre is köszönöm az esetleges segítséget.----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
Peter789
senior tag
válasz don_peter #4369 üzenetére
MPLAB-al zeró a tapasztalatom, a mikroe IDE-ket viszont nagyon tudom ajánlani! Van C, Pascal, Basic alapú is 8/16/32 bites PIC, AVR, 8051 és ARM procikhoz egyaránt. Maguk az IDE-k is tele vannak hasznos függvénykönyvtárakkal, valamint a libstock rendszerében is már rengeteg plussz anyagot töltöttek fel a lelkes felhasználók. A VisualTFT / VisualGLCD segítségével pedig egészen látványos grafikákat is össze lehet kalapálni viszonylag kevés tudással - jobban mondva segít elindulni, kitanulni az alapokat - később már nyilván egyre kevesebb dolognál fogja használni az ember a kész/félkész megoldásokat és egyre többet farag sajátokat...
Igazából nem tudom hogy mennyire fér bele az általános C programozásba az ilyen téma, de azért leírhatnád hogy egyáltalán meddig jutottál el az élesztéssel, teszteléssel... Megy már valami csak bugos és nem tudsz úrrá lenni rajta, vagy már a PIC élesztéséig sem jutottál el?
[ Szerkesztve ]
----------------------------------------------------------------------------------------------------------------- AquAgorA ...Pál apostol nyomában: http://fleettracker.eu/index.php/component/aquagora
-
don_peter
senior tag
válasz Peter789 #4370 üzenetére
Köszönöm az ajánlásokat, de én még az a programozó vagyok aki a kódokat szereti látni és megtanulni őket leírni
Természetesen megy az élesztés és kisebb programokat már írtam is mint pl.: while ciklusok számolása, nyomógombok használata magas és alacsony szintetek beállítása és kezelése, ledek villogtatása vagy éppen csak kapcsolgatása, és természetesen mindezek értékeit LCD-re kiíratom folyamatos frissítéssel.Alap programozói tapasztalataim a webes irányzatból vannak így némileg el tudok gravírozni az egyes főbb függvények közt. (HTML, CSS, JS, PHP SQL ismereteim vannak)
A gondom az hogy elakadtam az analóg jelek bekérésénél és azok feldolgozásánál.
Egyenlőre beállítom a PIC A0-ás lábára, hogy analóg bemenet legyen és a beépített ReadADC() függvénnyel próbálom kiolvasni a rákerülő jeleket.A fő program része:
#include <p18f4550.h> //chip beállítása
#include <stdio.h> //I/O portok beállítása
#include <delays.h> //Időzítő
#include <tesztheader.h>
#include "lcd.c"
#include <adc.h>
#define ANALOG_IN ADC_CH0 //a potméter AN0-ra csatlakozik
volatile unsigned char a;
void main(){
lcd_init(); // Az LCD modulinicializálása
lcd_init_cgram(); // Az ékezetes betűk feltöltése
stdout = _H_USER; // Az LCD legyen a standard kimenetnt
TRISAbits.TRISA0 = 1; //analog A0 láb legyen bemenet
ADCON0=0b00000001;
OpenADC(ADC_FOSC_64 | ADC_RIGHT_JUST | ADC_20_TAD, ANALOG_IN | ADC_INT_OFF | ADC_REF_VDD_VSS, ADC_2ANA);
TRISBbits.TRISB7 = 0;
LATBbits.LATB7 = 1;
while(1){
a=0L;
Delay10TCYx(80);
a = ReadADC();
printf("Valami %u", a);
lcd_write(0xC0,0,1,1);
}
}
Elviekben a header állományban minden deklarálva van ami szükséges lehet mivel a program nem figyelmeztet, hogy hiányolna valamit
Előre is köszi a segítséget.[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
Peter789
senior tag
válasz don_peter #4371 üzenetére
Az hogy deklarálva van minden, még nem feltétlenül jelenti azt hogy nincsen valami félredeklarálva
Az elakadás az analógnál mit jelent? Valami fix fals értéket sikerül olvasni róla, vagy le se tudod fordítani a programot?
"az a programozó vagyok aki a kódokat szereti látni és megtanulni őket leírni" - dehát itt használod a már kész ADC és egyéb függvényeket, nem magad piszkálod a regisztereket, tehát "csalsz" Amivel persze semmi gond egészen addig amíg a kész függvények megfelelnek a céljaidnak. Elször én is a mikroe rendszer beépített UART olvasó függvényeit használtam pl, de hamar rájöttem hogy sokkal többre képes a vas és utánatúrtam hogy hogyan tudok saját IRQ alapú feldolgozást írni. De pont ez tetszik a mikroe-ben hogy tengernyi a példa és kész/félkész megoldás, lelkes a közösség, így könnyű elindulni és fejlődni...
----------------------------------------------------------------------------------------------------------------- AquAgorA ...Pál apostol nyomában: http://fleettracker.eu/index.php/component/aquagora
-
don_peter
senior tag
válasz Peter789 #4372 üzenetére
Nah igen ha így vesszük, igazad van, de még sem egy drag-and-drop-os (fogd és húzd) megoldással dolgozom
Egy kezdőnek a C nyelvezet így is elég bonyolultnak tűnik, nem beszélve a mikroprocesszorok programozásáról és azok ismeretéről.
Természetesen minden lefut és lefordul, fel is égetem a PIC-et, de 0 értékkel jön vissza.Az A0-ás analóg bemeneten van egy 10K-os állítható értékű ellenállás vagy POTI és az 5v-ot szabályzom vele le s fel.
Reakció 0...[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
Peter789
senior tag
válasz don_peter #4373 üzenetére
A drag-and-drop csak a visual tft / glcd-re igaz - de így nagyon látványos kis GUI-t lehet hamar összeszórni egy kis LCD-re. Természetesen a lényegi funkcionalitáshoz már az alá is ugyanúgy kell programozni, ez csak a megjelenítés amit máshol is használsz (write parancs), legfeljebb kevésbé látványos az eredmény vagy sokkal többet kell érte izzadni. Az alap mikroe IDE-k rendes programozós környezetet adnak, csak sok az alapból beépített függvény (és az addon-ként elérhető plussz) aminek köszönhetően nem kell egyből a lowlevel hardver eléréssel bajlódni, ami hamar elriasztaná a kezdő érdeklődőt
Rámértél a lábra hogy valóban változik e rajta a feszosztó arányának megfelelően az érték? Ha nem, akkor félrekonfigolás miatt lehet erőszakkal lehúzza a lábat a földre... Ha ilyen gond nincsen, akkor próbáltál már az adc read helyett konkrét értéket adni a változódnak és azt kiiratni, hogy hátha ott a hiba?
A PORTA lábainak semmi extra konfig nem kell (mint a PBADEN a PORTB-n), elég csak analógnak és bemenetnek konfigolni. Viszont nem ismerem az adott IDE függvényeinek működését - lehet neked kell előre bekapcsolni az AD konvertert és kiválasztani a csatornát az ADCON0 regiszterben?
----------------------------------------------------------------------------------------------------------------- AquAgorA ...Pál apostol nyomában: http://fleettracker.eu/index.php/component/aquagora
-
don_peter
senior tag
-
don_peter
senior tag
válasz don_peter #4375 üzenetére
Bocs, de most meg a kijelző nem akart menni
Azt beizzítottam szóval le próbáltam a dolgot.
1K ellenállással rávittem az 5v-ot a PIC A0-ás lábára.
Analógra és bemenetre van állítva ezt lecsekkoltam szóval elvileg működnie kellene, de az érték 0 marad és nem változik ha rárakom és, ha leveszem akkor sem.----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
Peter789
senior tag
válasz don_peter #4376 üzenetére
sajnos így most nincsen több ötletem mert nagyon nem ismerem az MPLAB IDE-t és fordítóját... akkor ugye az esetleges kiiratásnál történő konvertálási, formázási hibát próbálgatással kizártad, nem lehet hogy ott válik 0-vá az akármilyen érték?
a hobbyelektronika fórumán biztosan találsz releváns témát, ott valószínűleg kapsz rá megoldást...
----------------------------------------------------------------------------------------------------------------- AquAgorA ...Pál apostol nyomában: http://fleettracker.eu/index.php/component/aquagora
-
don_peter
senior tag
válasz Peter789 #4377 üzenetére
Sajnos nem tudtak segíteni a hobbielektronikán, vagy csak azt akarták, hogy én kínlódjam ki a megoldást
Közben kiderült, hogy mindenképpen a bejövő analóg jelet konvertálni kell mert más ként nem lesz megjeleníthető formába így nem vált láthatóvá.
A program amit linkeltem részben jó volt, de a konverterek nem voltak benne így nem tudott vissza adni értéket.
Megkaptam 10-es számrendszerben a potméter jelét szóval faszányos a dolog.
Most már csak az alap matematikai műveleteket kell elvégezzem, csak még nem tudom, hogy kell ezeket deklarálni, mert simán beírva a műveletet 0-át ad vissza.
Köszi a segítséget.----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
don_peter
senior tag
válasz Peter789 #4377 üzenetére
Az előző hozzászólásomban rosszul írtam a 10-es számrendszert.
Helyesbítés: 10bit-es számot kapok vissza értékként 2-es számrendszerbenKözben megoldottam a feldolgozást és kiíratást.
A float mint lebegőpontos változó nem tetszett az LCD-t vezérlő driver-nek, így külön kellett hozzá írni egy rutint amely égésszámmá konvertálja a törtet majd egy long változóba tölti, ezek után utána összarakja beleírva a megfelelő helyre egy pontot (ez a pont lesz a tizedest elválasztó) és string-ként kiírja az LCD display-re.
Nem volt egyszerű, de kis segítséggel ez is megoldódott.
Jöhet a digitális bemenet és a digitális jelek feldolgozása[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
sanzi89
addikt
Valaki meg tudná mondani, hogy ezzel a kóddal mi a gond? Fordításnál nincs hiba, ellenben mikor futtatnám kifagy a program.
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
main () {
string sor;
int meret;
int sorszam=0;
ifstream inputfajl ("forrasfajl.txt");
getline (inputfajl, sor);
istringstream(sor)>>meret;
char **tabla;
tabla=new char *[meret];
while(getline (inputfajl,sor)) {
tabla[sorszam]=new char[meret];
strcpy(tabla [sorszam], sor.c_str());
sorszam++;
}
system("PAUSE");
return EXIT_SUCCESS;
}A program működése, hogy egy fájlból beolvas egy két dimenziós tömböt, ahol a sorok és oszlopok száma megegyezik, valamint a fájl legelső sora tartalmazza ezt az értékét. Pointerekkel kellene megoldani, mivel később a két dimenziós dinamikus tömböt át kell adni egy függvény paraméterének.
Annyira rájöttem, hogy ezzel a sorral van a gond:
strcpy(tabla [sorszam], sor.c_str());
Ha kikommentelem fut a program, csak értelem szerűen nem csinál semmi lényegeset.
[ Szerkesztve ]
"Mindent azért kell tudni mert kérdezik, nem azért mert hasznos."
-
dabadab
titán
-
TheProb
veterán
Sziasztok!
1 beadandót készítek ahol tömören annyi a lényeg, hogy excel-ből kiimportálunk 1 .csv fált, amit be kell olvastatni a programba és a megadott excell fv-et kell megvalósítani és meghívni c-ben. Többek közt egy arab-római alakító fv-t. Én ehhez szeretnék egy kis segítséget kérni, nagyjából már kész van, de vannak benne hibák, viszont nem találom, hogy mi. Pl. a vissatérési érték megadása nem hinném, hogy jó lenne. Mert jelenleg pl a return romai[20]; van megadva de ez (tudomásom szerint) csak a tömb 21. elemét adná vissza, de próbáltam már "romai[]" vagy "romai" verzióval is egyik se volt jó, el se tudtam ezekkel indítani a programot. A jelenlegi ...[20]-as verzióval meg lefagy a cmd futtatás után egyből. Tudnátok segíteni a finomhangolásban?
"Boba is Mickey, Mickey is Boba" - Finkle Einhorn | PC Rig: https://pcpartpicker.com/b/bBy48d
-
Karma
félisten
válasz TheProb #4385 üzenetére
Kapásból a char visszatérési érték helyett szerintem te char *-ot akartál inkább visszaadni -- a teljes számsort egyetlen karakter helyett.
Másrészt a stacken létrehozott char tömböt visszaadni öngyilkosság (a függvény végén megsemmisül -> érvénytelen pointer -> GAME OVER ☠).
Két lehetőséged van: vagy mallockal foglalsz egy dinamikus memóriaterületet, aminek a kezdőcímét adod vissza a függvény végén (és a hívónak fel kell majd szabadítania); vagy úgy írod át a függvényt, hogy bemenő paraméterként kapja meg azt a char tömböt (és annak max méretét), ahova az eredményt írhatja.
“All nothings are not equal.”
-
TheProb
veterán
A gond az, hogy dinamikus tömböket még nem tanultunk, mutatókat is még csak fogjuk. Azt a stackelős részt szintén nem értem :S Valamint, az miért jó ha bemenő paraméterként adom meg a char tömböt? egy részről, ha arab szám a bemenet akkor mért char? Másrészt meg a .csv fájlból való input, fv kérés és benne az érték is int lesz. (gondolom én)
"Boba is Mickey, Mickey is Boba" - Finkle Einhorn | PC Rig: https://pcpartpicker.com/b/bBy48d
-
Karma
félisten
válasz TheProb #4387 üzenetére
Az előző álláspontomat szem előtt tartva azért csak kifejtem egy kicsit.
Az alapprobléma az, hogy C-ben és más alacsonyabb szintű nyelveken a memóriakezelést tudatosan kell csinálni, mert nincs az ember alatt védőháló. Mindig tisztában kell lenned azzal, hogy egy adott változó, tömb, karaterlánc hol jön létre, és mikor, ki által fog megsemmisülni. Olyan meg soha nincs, hogy a semmiből memória fakad és pont azt csinálja amit szeretnél.
A mutatott kódodban a romai változódat úgy deklaráltad, hogy egy 20 karakteres tömb, ami a függvényen belül él csak, amint véget ér, felszabadul, te meg nem férhetsz hozzá többet. Ez a sorsa mindennek, ami a stacken jön létre. A befoglaló függvény végén kaputt.
Ilyen minden lokális változó függvényen belül, a függvényeknek átadott paraméterek, az egymás után láncolt függvényhívások köztes eredményei, stb.
Memóriafoglalás tekintetében még két lehetőséged van: a magyar oktatásban "dinamikus memóriának" csúfolt heap; illetve nagyon leegyszerűsítve a "globális változók", a static terület. Utóbbinak inkább ne játssz a gondolatával se.
A programodat azon a két módon lehet megjavítani, amit az előbb is írtam:
1) vagy behozod a heapkezelést és az eredményt oda mented (malloc/free);
2) vagy egy olyan függvényt írsz, mint például az snprintf: a hívó fél gondoskodik arról, hogy legyen hova tenni az eredményt. Javaslom, hogy nézd meg annak a függvénynek a leírását.Ez utóbbi azért különösen jó, mert maga a rómaira átalakító függvényednek nem kell törődnie a memóriakezeléssel egyáltalán. Nem érdekli, hogy a hívója hol foglalt memóriát (stack/heap/static), csak az átalakítással kell törődnie. Nem az ő felelőssége.
Az intes részre nem tudok válaszolni, mert nem sikerült értelmeznem a kérdést.
[ Szerkesztve ]
“All nothings are not equal.”
-
TheProb
veterán
"Boba is Mickey, Mickey is Boba" - Finkle Einhorn | PC Rig: https://pcpartpicker.com/b/bBy48d
-
dabadab
titán
válasz TheProb #4390 üzenetére
A fobb gondok:
1. A visszateresi ertek.
A char az egyetlen egy darab karakter. Ha tobb karakterre (stringre) van szukseged (marpedig itt arra van) akkor char*-ot kell visszaadnod, mert jelenleg a fuggveny csak a szam legelso karakteret adja vissza.
2. Memoriafoglalas
Annyi memoriat foglalsz a romai szamoknak, amennyibe pont belefer a szam arab szamokkal. Ezzel egyreszt ket gond is van:
1. a romai szamoknak jo esellyel tobb hely kell
2. a string vegere meg oda kellene fernie a lezaro nullanak. Ugyanis C-ben ugy neznek ki a stringek, hogy van a szoveg es a vegen ott ven egy 0 erteku byte (nem egy '0' karakter!), hogy lehessen tudni, hogy hol a vege3. Stringkezeles
Az elejen a nullat a legelso helyre kell beirni (romai[0]=0), onnan kezdve az strcat az gondjat viseli. A te megoldasodnal meg ott marad az elso n darab helyen valami memoriaszemet es az strcat az utan fogja irni a dolgait.
4. nullas szamjegyek
Gondold vegig, hogy mit ir ki ez az ezresnel kisebb helyiertekeken, ha mondjuk 1000-et konvertalsz at vele
5. Az else ag
Ha legalabb ketjegyu a szam, akkor nem fogja kiirni az egyes helyierteku szamokat
6. Memoriafelszabaditas
Ha azt akarod, hogy a hivo lassa is, hogy mit irtal, akkor semmikeppen se szabaditsd fel azt a memoriat, amit eppen vissza akarsz adni neki.
A freenek hiba eseten lenne ertelme (mivel akkor nem adnad neki vissza a romai pointert, igy "elveszne" az a memoria (memory leak)), de itt mondjuk jobb, ha csak akkor foglalod le, ha mar eldontotted, hogy at tudod konvertalni a szamot.Igy hirtelen ennyi.
DRM is theft
-
TheProb
veterán
válasz dabadab #4392 üzenetére
és
-Bele raktam a main-t is, hogy lássátok, hogyan akarom meghívni, valamint felszabadítani a fv-t (fv deklarációt most nem raktam bele..)
-az a (romai[0]=0) nem értem, hogy miért kell (?), ha string van benne, akkor miért legyen benne 0 az elején?
-megcsináltam a 0-ás karakterek gondját ha minde igaz."Boba is Mickey, Mickey is Boba" - Finkle Einhorn | PC Rig: https://pcpartpicker.com/b/bBy48d
-
Karma
félisten
válasz TheProb #4393 üzenetére
2) Mert amikor a malloc lefoglalja a területet, az még korábbi szeméttel van tele. Bármi lehet ott, beleértve a Shakespeare összest Azért kell a 0, hogy biztosan üres string legyen belőle.
Alternatívái a memset függvény (az egész területet egységesen nullázhatod vele, illetve a malloc helyett calloc fv. kapásból tiszta területet ad.
“All nothings are not equal.”
-
TheProb
veterán
válasz TheProb #4398 üzenetére
-átírva calloc-ra
- említett else-es gondok (elvileg) megoldva
= cmd továbbra is lefagyu.i.: Nem kéne a romai tömb-be az átalakított sztring után 1 lezáró nulla? Nekem azt mondták, ha az nincs a szting végén akkor szar a char tömb? (vagy ezt is orvosolja a calloc a kinullázott bitekkel?)
"Boba is Mickey, Mickey is Boba" - Finkle Einhorn | PC Rig: https://pcpartpicker.com/b/bBy48d
-
Karma
félisten
válasz TheProb #4399 üzenetére
Túl kevés memóriát foglalsz, ezért robban fel. n = 4, de az eredmény bőven hosszabb ennél
Ha azt nézzük, hogy egy számjegy római alakja maximum 4 karakter lehet, a 4*n+1 byte biztosan elég lesz. Arra átírtam a callocot, és ki is írta az eredményt hiba nélkül.
Egyébként megéri IDE-vel debuggolni a programot. Egyrészt menet közben látod hogy melyik változód milyen értéket vesz fel, másrészt egy kicsit több infód lesz az összeomlásról is, nem csak hogy "kifagy".
[ Szerkesztve ]
“All nothings are not equal.”
Ú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!
Állásajánlatok
Cég: Alpha Laptopszerviz Kft.
Város: Pécs
Cég: Ozeki Kft.
Város: Debrecen