- Motorola Razr 60 Ultra - ez a kagyló könnyen megfő
- Milyen okostelefont vegyek?
- Yettel topik
- Egyszerre legnagyobb és legkisebb is a Garmin Venu X1
- Samsung Galaxy A54 - türelemjáték
- Mobil flották
- Redmi Note 13 Pro 5G - nem százas, kétszázas!
- Apple iPhone 16 Pro - rutinvizsga
- Samsung Galaxy A55 - új év, régi stratégia
- Karaktere biztos lesz az első Nothing fejhallgatónak
Új hozzászólás Aktív témák
-
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.
-
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?
-
CPT.Pirk
Jómunkásember
2 nxp proci totál meghalt az LTO-s kód rátöltése után, újraprogramozni sem lehetett őket. Mondjuk ez lehet más körülmények összjátéka is.
Nuvoton procikon használjuk még, nekem van egy nagyobb projectem amit ha LTO-val fordítok akkor elő tud állni olyan állapot, amikor befagy a cucc, de nem minden fordításkor.
Volt, hogy nyomtam egy "clear"-t az IDE-ben, újrafordítottam ugyanazt a kódot az LTO-val, erre megjavult. Ma fordítottam a tegnapi kódot, tegnap délután nem fagyott, erre ma reggel meg igen. Kivettem az LTO-t, azóta nincs fagyás.Viszont az LTO-val fordított bootloaderben meg egyszer sem tapasztaltam hibát, igaz az csak 4k, nem pedig 80 mint a főprogram.
-
CPT.Pirk
Jómunkásember
LTO - link time optimailzation tapasztalata van valakinek?
CooCox alatt friss GCC mellett próbálgatjuk, jelentős méret csökkenést okoz a kódban, de nem vagyunk meggyőződve a fordított kód stabilitásáról.
-
CPT.Pirk
Jómunkásember
válasz
buherton #5101 üzenetére
Teljesítmény mérő lesz, de egyébként csak annyi, hogy hőkompenzált az AD rész és nem neked kell a számításokat megcsinálni.
Nem bízok benne annyira, mert ezeket a funkciókat már megvalósítottuk nuvotonban. Nekünk igazából a bemeneti szűréssel és az áram felharmonikusokkal volt bajunk, mikor a mérendő áramjel olyan szőrös volt a szkópon, mint a jeti talpa.- no meg nem volt mihez viszonyítani a mérésünket, így a pontosság kérdése függőben maradt.
-
CPT.Pirk
Jómunkásember
válasz
tototos #5097 üzenetére
EM783-as prociról van szó, ami kb. az nxp 11-es szériás procijainak felel meg, kiegészítve a mérő résszel. Mi is próbáltuk az expresso-t, de nem találtuk meg benne ezt a procit, pedig 2012 decembere óta támogatja. Egyébként java részt nuvotonban nyomulunk, coocox alatt.
Szóval azt mondod, hogy feltétlen lib-el kell kezdődjön a lib? Kíváncsi leszek rá mire jutunk hétfőn ezzel.
buherton: sajnos nem Linux alatt dolgozunk, de a coocoxnak nincs is Linuxos verziója, hiába Eclipse alapú. A linkernél -DEM783.lib lesz a paraméter, amit átad a környezet. Próbáltuk megadni neki a teljes utat kézzel is több módon, de minden esetben az volt, hogy nem találja.
-
CPT.Pirk
Jómunkásember
Talán itt a legaktuálisabb a kérdésem. Van egy problémám:
CooCox IDE (ARM-es fejlesztő környezet) alatt egy hivatalosan nem támogatott nxp procit kell életre keltenem, amiben van egy különleges mérő rész, aminek nincs nyilvános C forrása csak egy header fájl, meg .lib formában a forrás.
Ez a .lib library a KEIL környezet alá lett csinálva és ha beadom a "link library" menüben a coocoxnak, akkor csak annyit mond rá, hogy nem nem található. Szerintetek mit lehet ezzel kezdeni? A boot és egyéb fájlokat már bereszeltem, kód is fordul, ez lenne már csak vissza. -
CPT.Pirk
Jómunkásember
Tesztelném assertel a kódot, amiben segítettetek, de valamiért állandó segmentation faultot kapok, akármit írok a kódba, és mindig ugyanaz a szöveg teljesen.
Codeblocks-ot használok Debianon.
Ez van a main.c-ben:
void utiltest(){
printf("Util tesztelés");
assert(strChomp(NULL)==NULL);
assert(strcmp(strChomp(""),"")==0);
assert(strcmp(strChomp("abc"),"abc")==0);
assert(strcmp(strChomp("\n"),"")==0);
}
int main()
{
utiltest();
return 0;
}Akkor van még egy util.h-m:
#define UTIL_H_INCLUDED
char *strChomp(char *buffer);Valamint az util.c-ben a kód az includok után.
#include <stdlib.h>
#include "macros.h"
#include "util.h"
...Error nincs, és korábban, mikor még elég vacak kód volt bent, akkor működött a teszt.
-
CPT.Pirk
Jómunkásember
válasz
Gyuri16 #2598 üzenetére
Hú köszi, végre egy érthető példában láttam a pointer működését.
Anno bugyi, bugyis polc, meg bugyis polcra mutató valami közti kapcsolattal magyarázták a pointert, amikor nem sikerült megértenem. Később meg csak használtuk, de mivel nekünk nem fő profilunk (heti 1 órában hogy is lehetne) a C programozás, így érdemi pointer magyarázás a későbbiekben sem valósult meg, vagy én nem fogtam fel...Köszi nektek a segítségért.
Segfaulttal majd kezdek valamit, mert assertes test meg van csinálva hozzá, szerintem csak a codeblocks szórakozik velem.
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #2592 üzenetére
Uhh tényleg.
char *strChomp(char *buffer)
{
if (buffer && *buffer) {
while (*buffer != '\0') {
buffer++;
}
if (*buffer-- == '\n'){
*buffer = '\0';
}
return buffer;
}
return NULL;
}Most ha minden igaz, elmegy a végére, ha odaért, megnézi a lezáró nulla előtti karaktert, és ha az \n, akkor átírja \0-ra.
Nekem csak vissza kell adni a módosított, vagy az eredeti stringet, ha nem volt \n a végén. Ilyenkor a *buffer-t hogyan viszem vissza a kezdeti pozícióba? Ez most elég amatőr kérdés lesz, de gondolom nem egy "ellenkező irányú" while ciklussal lépdeljek vissza.
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #2590 üzenetére
Kezdem felfogni.
if (buffer && *buffer) {
while (*buffer != '\0') {
if (*buffer-- == '\n') {
*buffer = '\0';
}
buffer++;
}
return buffer;
}
return NULL;Viszont azt nem tudom, hogy ez a felülírás amit mondtál, ez mit csinál. Mivel ha felülírjuk, akkor mindenképpen 2 darab \0 lesz a stringben. Ilyenkor magától levágódik a második \0?
Valamint hogy van ez a visszatérési érték helyreállítása?
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #2588 üzenetére
No alakítottam rajta egy kicsit.
char *strChomp(char *buffer)
{
if (buffer && *buffer) {
while (*buffer != '\0') {
if (*buffer == '\n') {
if (*buffer++ == '\0') {
*buffer = '\0';
return buffer;
}
}
buffer++;
}
return buffer;
}
return NULL;
}Így most elvileg végigmegy a sztringen karakterenként a lezáró nulláig. Közben ha talál \n-et, akkor megnézi, hogy a rá következő karakter lezáró 0-e.
Egyébként van valami ordító hibám? Mert eddig csak és kizárólag segfaultot kaptam az assert teszteknél.
-
CPT.Pirk
Jómunkásember
Van nekem egy kódom, ami ránézésre nekem tetszik, de assertes teszten mindig elbukik. Mi a gáz vele?
char *strChomp(char *buffer)
{
char c;
if (buffer && *buffer)
while (*buffer++){
c = buffer;
if (c == "\n")
*buffer = *(buffer--);
return *buffer;
}
return NULL;
}Annyit kell csinálnia, hogy leszedi a sorvégi új sor jelet, ha van.
-
CPT.Pirk
Jómunkásember
Figyelj, nem állok neki kommentezni, ezt a progit nem látom át. Pár hsz-el arrébb írtam egy strlen-t, ami nem tökéletes, a több szóközt is egynek számolja, de attól független működik, és érthető.
Azt esetleg kommentezhetem, csak aztán Zamek kérdez egyet keresztbe, és hopp... Ráadásul azt a kódot is egy sorstársadnak írtam, jobbat per pill nem tudok.Szal azt mondom, ha át akarsz menni a tárgyból, akkor a C könyvet olvasd el, aztán googlere fel, for ciklus, string műveletek, stb.
-
CPT.Pirk
Jómunkásember
Hmm, milyen ismerős ez a feladat a villany karról.
Az első csak annyit csinál, hogy kiírja, amit a program kapott a standard input bemenetére, szavanként.
A második egy pointerrel dolgozik, de ezeket így egy fájlba kellene tenni, hogy a standard inputra érkező szöveget megszámolja karakterenként. Egyébként nem tudom, hogy a prog1-eseknek kell-e pointerrel dolgozniuk, mintha az a prog2 anyaga lenne, már régen volt. Ilyen megoldást a prog3-ban használtunk stringek nézegetésére.
Egyrészt használd a programkód gombot kód beillesztésekor, másrészt picit olvass vissza pár hozzászólást, ha már az strLen()-t írod.
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #2220 üzenetére
Linux alatt (mint10, Ubuntu alapú) a gcc hiba nélkül megcsinálja az a.out fájlt, csak mikor futtatnám ./a.out, akkor kiírja, hogy hozzáférés megtagadva. Sudo meg sh, stb.-vel futtatva meg azt írja, hogy egy ")" hiányzik, de nem írja honnan. Az biztos, h. nem az én kódomból, mert akármit fordítok le, mindig ezt hiányolja. A 9-es mintel még simán forítottam gcc-vel.
Egyébként igen, 1szóközt feltételez a dolog, ha jól néztem, win alatt a több szóköz is csak egynek számít a cmd-ben.
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #2216 üzenetére
Az a gond, hogy az egyszerű dolgokhoz bevált linuxos gcc-s fordítás nem akar menni nálam, vagyis a lefordított fájlt nem engedi futtatni, hozzáférés megtagadva hibát kapok, aztán emelt hozzáféréssel meg valami ) zárójelet hiányol, de nem a programom hibás, mindegy neki h. mit fordítók le, még egy hello wordnél is ez van, így most kénytelen vagyok win alatt csinálni.
Arra sajnos nem jöttem rá, hogy Linuxon CodeBlocks-al hogyan lehet lefuttatni úgy, hogy kapjon is valami argumentumokat.Szóval akkor win alatt egyszerűen a cmd szedi ki a fölösnek ítélt spaceket?
Átírtam most külön fgv-be a dolgokat, valamint tettem bele vizsgálatot arra, ha nincs argumentum.
#include <stdio.h>
int i, j, len = 0;
int strLen(int argc, char *argv[]){
for (i = 1; i < argc; i++)
for (j = 0; argv[i][j]; j++)
len++;
if(i==1){
len = 0;
}
else
len = len + (i-2);
printf("hossz: %d\n", len);
return len;
}
int main(int argc, char *argv[]){
strLen(argc, argv);
return 0;
}warningot nem kaptam, korrekt amit csináltam?
-
CPT.Pirk
Jómunkásember
Köszi srácok! A belső ciklust felejtettem el megcsinálni, így most jó lett:
- a szóközt is számolom, az első szóköz és a lezáró 0 közti karaktereket számolja
#include <stdio.h>
int i, j, len = 0;
int main(int argc, char *argv[]){
for (i = 1; i < argc; i++)
for (j = 0; argv[i][j]; j++)
len++;
len = len + (i-2);
printf("hossz: %d\n", len);
return len;
}Hogyan lehet az argc, *argv[] -vel bekért karaktereket egy másik függvény számára átadni? Igazából úgy lenne frankó, ha a számolás nem a mainben lenne, bár így sem rossz.
-
CPT.Pirk
Jómunkásember
Valami biztos, de honnan? Csak a lényeget copyztam be.
Szóval a standard inputra érkező karaktereket szeretném megszámolni.
Pl. progi.exe asd fgh jklmAz simán megy, hogy hány argumentumom van, meg azokat ki is tudom íratni, de argumentumot karakterenként kiírni nem tudom, az nem akar sikerülni.
-
CPT.Pirk
Jómunkásember
Ha így kérek be szöveget:
int main(int argc, char **argv)
Akkor hogy lehet hozzá alakítani az strlen függvényt?
strlen:
int strlen(const char *s)
{
int len = 0;
while(*s++) len++;
return len;
}Meg kellene számolnom a bemenetre érkező betűket az strlen() használata nélkül.
-
CPT.Pirk
Jómunkásember
válasz
Gergosz2 #2154 üzenetére
codeblocks elvileg megy win7 alatt. Viszont egy nagyságrenddel kevesebb a szopás linux alatt, pl. Ubuntu, Mint...
-
CPT.Pirk
Jómunkásember
No, végre összeállt a dolog. Miután végiggondoltam, rájöttem h. nem is kell nekem végiglépkedni a stringen, felesleges az egész while cucc bele, mert az már másnak a feladata, hogy akkor is üres stringet adjon vissza, ha space, tab van benne, nekem csak simán üres stringet kell keresnem. Beírva valamit a test[] mögé, frankón eldönti, hogy mi a helyzet. Szóval szerintem jó így.
#include <stdio.h>
int main ()
{
char test[]="";
strIsEmpty(test);
return 0;
}
int strIsEmpty(const char *str)
{
if(!*str || !str){
printf("A string ures\n");
return 1;
}
printf("Nem ures a string\n");
} -
CPT.Pirk
Jómunkásember
Igen, while-nál kimaradt, a pointerrel meg kezdek valamit. Az óra végén csak egy fordításra volt időm, akkor nem adott hibát, de végtelen ciklus volt, mert rossz feltételt írtam a whilehoz. Per pill itt sem tudom lefuttatni, mert nem tudok átlépni a linuxra egy fontos feltöltés miatt, aztán itt a w7 x64-en csak a cygwin van fent, de az meg amit lefordít, az exe hiányol egy nem létező 64 bites dll-t a cygwinből. Van más alternatíva, de nem akarok win alatt progni, majd holnap megcsinálom Mint alatt, csak bedobtam a félkész kódot, hogy kb. mi a terv.
-
CPT.Pirk
Jómunkásember
No, ellestem pár dolgot órán, meg elvileg csak annyit kell csinálnom, hogy üres-e a string, mert a tab, space vizsgálat már a köv. srác dolga, aki az strIsBlank-et írja.
Órán eddig jutottam el:
int main ()
{
char test[]="abc";
strIsEmpty(test);
return 0;
}
int strIsEmpty(const char *str)
{
while(str)
if(!*str || !str)
printf("ures string");
return 1;
printf("nem ures a string");
}Nem volt időm lejavítani, majd holnap megcsinálom. A lényeg az, hogy be kell mutatni a működést is, ezt ott a mainben egy string értékadással oldottam meg. Azzal volt bajom főleg, hogy hogyan jut át a string, pointer egyik függvényből a másikba. Lua-ban sokkal egyszerűbb volt leírni olyasmit.
-
CPT.Pirk
Jómunkásember
Bedobva a fordítóba, már rögtön a bool után hiányol valamit.
Ha jól értem:
bool isempty(char *s) - itt az *s lesz az a string, amit vizsgálunk.char *p; -csinál egy pointert. De ez most mutat valamire? Vagy csak üres tömb?
for (p=s; *p; ++p) - itt a kezdőérték mi? A p megkapja az s elemeit? A feltétel meg az hogy amíg van eleme, és addig a ++p lépteti az elemeket?
if (*p != ' ' && *p != '\t') - itt a space és a tab vizsgálat van, ez tiszta.
Hogyan tudnám összehozni a dolgot mondjuk egy scanf-el? Az argv dolog szerintem itt nm jó, mert annak alapból az első eleme a file neve. A t. tanárúr nem szereti a scanfet, de kipróbálni jó lenne.
Régen volt a C, lua-ban csináltam pár dolgot az elmúlt 2 évben, az sokkal egyszerűbbnek tűnik egyenlőre.
-
CPT.Pirk
Jómunkásember
Ilyesmire gondolok, de még tudnia kel azt, hogy a space és tabulátor esetén is ürse scriptet ad vissza, azok esetében viszont akkor más karakter nem lehet. Szal ne bonyolítsuk, ha csak egy karakteres a string, akkor meg kellene nézni, hogy spacve v. tab van-e, vagy ha egyik sincs, akkor meg amit te írtál. Ezeket kellene egybegyúrni.
Viszont egy kis magyarázatot kérnék, én legalább egy IF függvénnyel gondolkodtam eddig.
-
CPT.Pirk
Jómunkásember
Van egy problémám.
Üres stringet kell detektálnom C-ben. A probléma, hogy kvázi függvénybe kell ezt megcsinálni, hogy máshonnan kapjon stringet, szal nem előre a kódba írt stringet kell vizsgálni.
Szóval valahonnan jön a script, ráadásul még pointerezni is kell. Ötletek?Sokat próbáltam a pointereket, de nem akar menni a dolog. Pl. próbáltam kiírni a pointer által mutatott string elemeit, de csak számokat kapok.
Van pl. az argc *argv-s argumentum bekérés, hogy tudom megcsinálni, hogy átkerüljön a tartalma egy sima tömbbe, amivel lehet dolgozni?
Meg ilyen alap kérdések, plusz pár dolog, amiből még kérdezni sem tudok.
-
-
CPT.Pirk
Jómunkásember
Sziasztok!
Úgy fújta a szél, hogy most c++,java,pascal,assembly és qbasic után sima C-t kell tanúlni fősulin. A dolog megyeget, meg is írtam egy email cím ellenőrző progit, de azzal kapcsolatban lenne kérdésem.
ugyan nem volt kikötve, honnan kell vennie a proginak az emailcímet, én scanfel kértem be egy char tömbbe, aztán hosszellenőrzés, majd vizsgáló ciklusok, stb...
Viszont a tanár úr kiakadt, mondván a scanf olyan, mintha a viszkető szemünket a seggünkön keresztűl akarnánk megvakarni. (igyekeztem pontossan idézni) Valami hasonló dolgot mondott a getchar()-ra is, ott a pascalosokra utalva, de azt nem használtam. Szóval valami átadásos dolgot kell majd megoldanom, hogy pl. program.exe asdfg@fgg.hu -ból kiszedje az emailcímet magának. ilyen argv meg nemtudom dolgok kellenének nekem oda main fgv-be...
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- ÚJ aktiválatlan Apple iPhone 16 Pro Max 512GB ! 1ÉV nemzetközi APPLE GARANCiA
- EKWB DDC 3.1
- Gamer PC - i5 13400f, RX 6700 XT és 16gb RAM
- Szép Hp Pavilion 15-eg Kis Gamer Laptop 15,6" -45% Bivaly i7-1165G7 16/512G FHD IPS Iris Xe
- EJJ! Dell Latitude 7330 -65% "Kis Gamer" Üzleti Profi Ultrabook 13,3" i5-1245U 16/512 FHD IRIS Xe
- KATONAI ÜTÉSÁLLÓ!!! Getac S410 i5-6300u, G3: i5-8365u, G4: i5-1145G7
- Bomba ár! Dell Latitude 3550 - i5-5GEN I 4GB I 500GB I 15,6" HD I HDMI I Cam I W10 I Garancia!
- AKCIÓ! Apple MacBook Pro 16 M4 Pro - M4 Pro 24GB 512GB SSD garanciával hibátlan működéssel
- Bomba ár! Lenovo ThinkPad T490 - i5-8GEN I 16GB I 256GB SSD I 14" FHD I Cam I W10 I Garancia!
- Telefon felvásárlás!! Honor Magic6 Lite, Honor Magic6 Pro, Honor Magic7 Lite, Honor Magic7 Pro
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged