Új hozzászólás Aktív témák
-
buherton
őstag
Mindegy hova rakja. A RAM mérete 512 B, és ő 270 B-t foglal le, ami helyből több, mint a fele teljes méretnek.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
dabadab
titán
válasz alapz@j #4704 üzenetére
Vagy csinalsz minden fuggvenybol kettot, egyet r/o, masikat r/w stringekhez:
string_foo(char *str)
{
/* do stuff */
}
string_foo_const(const char *const_str)
{
char *str = copy_to_heap(const_str);
return string_foo(str);
}(Milyen kar, hogy C-ben nincs overloading)
[ Szerkesztve ]
DRM is theft
-
buherton
őstag
válasz alapz@j #4706 üzenetére
Miről van szó amúgy? ARM-nál szintek vannak meghatározva, ahol a supervisor mindent megtehet, de ha egy user szintű akar oda írni, ahova nem lenne szabad, akkor ezt hard fault expection-nel köszöni meg a proci. Azaz itt az architektúra tartatja be a szabályokat. Továbbá az MPU-nak meg lehet mondani, hogy ki hova írhat, de az megint egy másik tészta.
Nem mellesleg a C standard nem beszél ilyenről, így ilyen nincs. Az, hogy az OS vagy az architektúra támogatja-e az már a C-n kívül álló dolog.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
alapz@j
tag
válasz buherton #4707 üzenetére
Van egy string könyvtáram, ahol a String típus egy struktúra, amiben egy char* változó mutat a tényleges karaktersorozatra. Hogy a felhasználónak ne kelljen még plusz a memóriakezeléssel is bajlódnia, a sztringek mutable-ként működnek, úgy, hogy a függvények új memóriaterületet allokálnak az eredménynek, a régi területet pedig felszabadítják free-vel Ez ugye a felhasználó számára nem látszik, mert ő mindig ugyanazt a String változót látja. A konstruktor függvény első verziója egyszerűen felvette a felhasználó által megadott char* értéket. Ez viszont nem jó, mert ha a stack-en van a karaktersorozat (és nem static), akkor ugye az megsemmisül, ha char* x = "x" formában definiált volt, akkor az r/o memóriaterületen van és az első free-nél kiakad a rendszer, stb. Úgyhogy a jelenlegi konstruktor duplikálja a karaktersort a heap-re, ami csak annyiban rossz, hogy ha már eredetileg is ott volt, akkor kétszer annyi memóriát használ a program. Az lenne a legelegánsabb megoldás, ha a konstruktor érzékelné, hogy a paraméter a stack-re, r/o területre vagy a heap-re mutat és ennek megfelelő memóriafoglalási stratégiát választana.
-
Karma
félisten
válasz alapz@j #4708 üzenetére
Szerintem az lenne a pláne, ha lenne const char *-os konstruktor (ez heapre másol) és egy char *-os ami átveszi a tulajdonjogot a stringről, és döntse el a kóder hogy melyik releváns.
De egyébként mi az C-ben, hogy konstruktor? Ha tényleg C-ről van szó, akkor semmi se gátol meg abban, hogy a függvények neve is tükrözze hogy mit csinál a pointerrel.
“All nothings are not equal.”
-
don_peter
senior tag
Uraim, kérnék egy kis segítséget, hátha észreveszitek azt amin én már simán átsiklok.
Hardver: (PIC18F4550 és 25LC640 memória IC)Csatoltam egy leegyszerűsített forrás fájlt.
KB. 3 napja kínlódom vele és nem jövök rá mért nem azt csinálja amit szeretnék.
A lényeg, hogy a memóriába szeretnék 1 32bájtos lapot beírni és ahelyett, hogy csak 1db 32bájtos lapot írna be a memória területre teleszemeteli a következő x*32bájtos területeket is.
Azért mondom, hogy következő x*32bájtos területeket, mert szabályosan emelve a memória címzést kiolvasható ugyan az mint amit elmentettem a 0-ás címre.
(8x32bájtig (256) egyformák a kiolvasott értékek, de mikor ugrik a 9x32bájtos (288) területre ott már 1bájtot csúszik visszafelé a memória címzés.)
Utóbbit csak említettem, de nem érdekes most.
Valaki esetleg látja azt a hibát ami ezt okozza?
Előre is köszi../*********************************************
+ K¸lsı f·jlok beemelÈse
**********************************************/
#include <p18F4550.h> //PIC be·llt·sa
#include <stdio.h>
#include <delays.h> //KÈsleltetÈsek
#include <stdlib.h>
#include "header.h" //¡lltal·nos header be·llÌt·sok
#include "p18f4550_pindef.h" //P18F4550 saj·t definiciÛim
#include "lcd.c" //LDC meghajt·s f¸ggvÈnyei
/*********************************************
+ DefinciciÛk deklar·l·sa
**********************************************/
//-------------------------- DefinciciÛk ----------------------------//
//PIC18F4550 SPI l·bkioszt·sa
//7. (RA5)[SS - SPI m·sodlagos input v·lasztÛ]
//33.(RBO)[SDI - SPI adat bemenet]
//34.(RB1)[SCK - szinkron Ûra be/ki SPI mÛdban]
//26.(RC7)[SDO - SPI adat kimenet]
#define SPI_CS_TRIS TRIS_A5 //A5 chip v·laszt·s
#define SPI_CS LAT_A5 //A5 chip v·laszt·s
#define SPI_SO_TRIS TRIS_B0 //B0-·s bit
#define SPI_SCK_TRIS TRIS_B1 //B1-es bit Ûrajel
#define SPI_SI TRIS_C7 //C7 adat ki
//-- A 25LC640 EEPROM ·ltal elfogadott parancsok
#define CMD_WRSR 0x01 //St·tuszregiszter Ìr·sa
#define CMD_WRITE 0x02 //Õr·s a megadott cÌmtıl kezdıdıen
#define CMD_READ 0x03 //Olvas·s a megadott cÌmtıl kezdıdıen
#define CMD_WRDI 0x04 //Letiltja az Ìr·st
#define CMD_RDSR 0x05 //St·tuszregiszter olvas·sa
#define CMD_WREN 0x06 //EngedÈlyezi az Ìr·st
#define PMEMBLOCK 32
/*********************************************
+ Union deklar·l·sa
**********************************************/
/*- 16bit-es UNION - (SPI memÛria cÌmzÈshez Ès 2 b·jtos (16bit-es) adatok t·rol·s·hoz kell)*/
typedef union _union16 {
unsigned int value;
struct {
unsigned char low;
unsigned char high;
};
} union16;
/*********************************************
+ PrototÌpusok
**********************************************/
void main(void); //Main()
unsigned char spi_io(unsigned char adat); //SPI Ìr·s olvas·s
void waitFor25LC640(void); //V·rakoz·s a SPI memÛri·ra
void memWrite25LC640(union16 MemCim, unsigned char *pbuf); //MemÛria Ìr·sa
void memRead25LC640(union16 MemCim, unsigned char *pbuf); //Meria olvas·sa
void main(void){
/*********************************************
+ V·ltozÛk deklar·l·sa
**********************************************/
union16 MemCim, ReadCim, AlsoFutes;
unsigned char Membuffer[PMEMBLOCK+1] = {0};
unsigned char x=0, i=0, z=0;
/*********************************************
+ LCD inicializ·l·s
**********************************************/
TRISD = 0;
lcd_init(); // Az LCD modulinicializ·l·sa
stdout = _H_USER; // Az LCD legyen a standard kimenetnt
/****************************LCD*************************************/
/*********************************************
+ SPI init
**********************************************/
SPI_CS_TRIS = 0; //A5-es l·b kimenet
SPI_CS = 1; //A5 l·b magas szinten
SPI_SO_TRIS = 1; //B0 l·b SDI bemenet
SPI_SCK_TRIS = 0; //B1 l·b SCK kimenet
SPI_SI = 0; //C7 l·b SI kimenet
SSPSTATbits.SMP = 0; //MintavÈtelezÈs idızÌtÈse Master mÛd esetÈn 1: mintavÈtelezÈs a kimeneti idı vÈgÈn, 0: mintavÈtelezÈs a kimeneti idı kˆzepÈn). Slave mÛdban kˆtelezıen null·ba kell ·llÌtani.
SSPSTATbits.CKE = 0; //”rajel f·zis·nak be·llÌt·sa (1: az adatkimenet be·llÌt·sa akkor tˆrtÈnik,amikor az Ûrajel aktÌv ·llapotbÛl tÈtlenre v·lt, 0: az adatkimenet be·llÌt·sa akkor tˆrtÈnik, amikor az Ûrajel tÈtlen ·llapotbÛl aktÌv szintre v·lt)
SSPSTATbits.BF = 0; //A buffer foglalts·g·t jelzı ·llapotbit (1: az adat·tvitel lezajlott, SSPBUF kiolvashatÛ, 0: az adatbuffer ¸res)
SSPCON1bits.WCOL = 0; //‹tkˆzÈs detekt·l·s Ìr·sn·l (1: Ìr·st/adatk¸ldÈst kÌsÈrelt¸nk meg, amikor nem lehetett, 0: nincs ¸tkˆzÈs)
SSPCON1bits.SSPOV = 0; //VÈteli t˙lcsordul·s-jelzı (1: ˙jabb b·jt Èrkezett, de SSPBUF meg nincs kiolvasva, 0: nincs t˙lfoly·s)
SSPCON1bits.SSPEN = 1; //Master Szinkron Soros Port engedÈlyezÈse (1: engedÈlyezve, 0: letiltva)
SSPCON1bits.CKP = 0; //”rajel polarit·sa (1: aktÌv ·llapotban alacsony szint, 0: aktÌv ·llapotban magas szint)
SSPCON1bits.SSPM0 = 0;
SSPCON1bits.SSPM1 = 1;
SSPCON1bits.SSPM2 = 0;
SSPCON1bits.SSPM3 = 0;
//BeÌ·r·s ut·n ki kell kommentelni-------------------------------------
/*Membuffer[0] = '#';
Membuffer[1] = 'D';
Membuffer[2] = 'P';
Membuffer[3] = 'T';
Membuffer[4] = 'P';
Membuffer[5] = ' ';
Membuffer[6] = ' ';
Membuffer[7] = ' ';
Membuffer[8] = ' ';
Membuffer[9] = ' ';
Membuffer[10] = ' ';
Membuffer[11] = ' ';
Membuffer[12] = ' ';
Membuffer[13] = ' ';
Membuffer[14] = ' ';
Membuffer[15] = ' ';
Membuffer[16] = ' ';
Membuffer[17] = ' ';
Membuffer[18] = 60;
Membuffer[19] = 61;
Membuffer[20] = 120;
Membuffer[21] = 62;
Membuffer[22] = 160;
Membuffer[23] = 63;
Membuffer[24] = 200;
Membuffer[25] = 64;
Membuffer[26] = 220;
Membuffer[27] = 65;
Membuffer[28] = 250;
Membuffer[29] = 66;
AlsoFutes.value = 500;
Membuffer[30] = AlsoFutes.low;
Membuffer[31] = AlsoFutes.high;
Membuffer[32] = '\0';
//2 memÛria blokk feltˆltÈse
MemCim.value = 0;
memWrite25LC640(MemCim, Membuffer);
//MemCim.value += PMEMBLOCK; //32
//memWrite25LC640(MemCim, Membuffer);
memset(Membuffer, 0, sizeof(Membuffer)); //Null·zzuk Membuffer-t
//BeÌ·r·s ut·n ki kell kommentelni------------------------------------
*/
//Kiolvassuk a memÛria tartam·t
MemCim.value = 0;
do{
memRead25LC640(ReadCim, Membuffer);
ReadCim.value += PMEMBLOCK;
for(i=0; i<PMEMBLOCK; i++){
if(Membuffer[i]=='#'){ z++; }
printf("%i - %02i - 0x%x ", x, ReadCim.value-PMEMBLOCK, ReadCim.value-PMEMBLOCK);
lcd_write(0xC0,0,1,1);
printf("Talalat(#): %i ", z);
lcd_write(0x94,0,1,1);
printf("H:%i - L:%i ", ReadCim.high, ReadCim.low);
lcd_write(0xD4,0,1,1);
printf("%i~%c ", i, Membuffer[i]);
lcd_write(0x80,0,1,1);
Delay10KTCYx(10);
}
memset(Membuffer, 0, sizeof(Membuffer));
x++;
}while(x<15); //Amennyi lapot akarunk, annyit olvasunk ki
Delay10KTCYx(100);
while(1);
}//main
/*********************************************
+ SPI 25LC640 memÛria
**********************************************/
unsigned char spi_io(unsigned char adat){
unsigned char tmp;
SSPSTATbits.BF = 0; // tˆrli foglalts·g jelzı ·lapot·t a st·tusz regiszterben
SSPCON1bits.WCOL = 0; // tˆrli az esetleges Ìr·s ¸tkˆzÈs hibajelzıt
tmp = SSPBUF; // tˆrli a BF jelzıbitet
SSPBUF = adat; // kirakja a kimenı adatot az SSPBUF regiszterbe
while(!SSPSTATbits.BF); // megv·rjuk a busz ciklus vÈgÈt
return (SSPBUF); // a vett b·jttal tÈr¸nk vissza
}
void waitFor25LC640(void) {
unsigned int flag;
do {
SPI_CS = 0; //kiadjuk a Chip Enable jelet
spi_io(CMD_RDSR); //St·tuszregiszter olvas·sa parancs
flag = spi_io(0x00); //Olvasunk, de valamit akkor is k¸ldeni kell!
SPI_CS = 1; //megsz¸ntetj¸k a Chip Enable jelet
} while (flag & 0x01);
}
void memWrite25LC640(union16 MemCim, unsigned char *pbuf) {
unsigned char i,flag;
waitFor25LC640(); //V·runk, ha az EEPROM elfoglalt
SPI_CS = 0;
WriteSPI(CMD_WREN); //Õr·s ˙jraengedÈlyezÈse
SPI_CS = 1;
Delay10KTCYx(1);
SPI_CS = 0;
spi_io(CMD_WRITE); //Adatblokk Ìr·sa
spi_io(MemCim.low);
spi_io(MemCim.high);
for (i=0; i < PMEMBLOCK; i++) {
spi_io(*pbuf++); //Az adatbuffer kiÌr·sa
}
SPI_CS = 1;
}
void memRead25LC640(union16 MemCim, unsigned char *pbuf) {
unsigned char i;
waitFor25LC640(); //V·runk, ha az EEPROM elfoglalt
SPI_CS = 0;
spi_io(CMD_READ); //Adatblokk olvas·sa
spi_io(MemCim.low);
spi_io(MemCim.high);
for (i=0; i < PMEMBLOCK; i++) {
*pbuf++=spi_io(0x00); //Olvasunk, de valamit akkor is k¸ldeni kell!
}
SPI_CS = 1;
}[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
buherton
őstag
válasz don_peter #4711 üzenetére
Bocsánat, nem tudtam, hogy ilyen PIC-et használsz. Valamiért egy PIC16 rémlett. 32 kB flash, 2 kB RAM már jobban mutat.
Pár észrevétel:
- SSPCON1 regisztert illetve a társait valahogy el lehet érni bájtként, és akkor nem bitekkel kell majmolni. Nem mellesleg ha jó a fordító, akkor ezeket nem optimalizálja ki és mindenegyes sor egy 2 bájtos parancs.
- *pbuf++=spi_io(0x00); -> ez így elég meredek. Inkább így
for (i=0; i < PMEMBLOCK; i++) {
*(pbuf+i)=spi_io(0x00);
}
és már mehet is a const az argumentumba és biztonságosabb is így, mert a memória címe nem változik.
- while(!SSPSTATbits.BF); -> lehet ilyeneket használni, de akkor tegyél bele watchdogot (ez önmagában ajánlott), vagy timeout-t, mert ezek nélkül a jövőben okozhat problémát.Az a probléma hogy a for cikluson belül olvas ki több lapot, vagy a while cikluson belül?
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
don_peter
senior tag
válasz buherton #4712 üzenetére
Igen PIC18F4550-et használok amelynek azért tágasabb a felhasználható memóriája..
A régebben felmerülő tömb problémát megoldottam már szóval az oké..."SSPCON1"
Azért írtam meg bitenként a beállítást, hogy megtanuljam és mindig, ha vissza keressem értsem mit miért állítottam be.
Nekem így átláthatóbb mint ha egy sorba a 8bit-et állítom.
Ezek a beállítások egy init() függvényen belül vannak így nem zavarnak programozás közben, csak ide az átláthatóság miatt másoltam be...
De, ha már nem lesz rá szükség akkor 1bájtos parancsként fogom én is megírni a beállításokat."Az a probléma hogy a for cikluson belül olvas ki több lapot, vagy a while cikluson belül?"
Ezt a kérdést nem értem.
A kiolvasással nincs gond..még
A beírás nem oké.
A kiolvasásnál én állítom be mennyi sor olvasson ki az szerintem jól működik, de a beírás...A következőket vettem észre még tegnap esete:
Kíváncsiságból vissza olvastattam 100x32 byte-nyi területet és a következőket tapasztalom: (hátha rávilágít a hibára)
Minden 256-odik byte címzésénél 1 byte-tal kevesebbet írt be a memóriába és (32*8)*32 == (8192)byte után válik teljesen üres a memória.
Fura....Kipróbálom ez a "*(pbuf+i)=spi_io(0x00);" verziót.
Az a baj, hogy még a mutatókat nem látom át teljesen.----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
don_peter
senior tag
Uraim,
Hogyan tudok egy short int változót vissza alakítani char típusúra?
Egy pl:short int szam = 600;
unsigned char text[4] = {0};
itoa(szam, text);A végeredmény pedig így kellene kinézzen:
text[0] == 6
text[1] == 0
text[2] == 0
text[3] == \0[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
don_peter
senior tag
válasz Jester01 #4718 üzenetére
Bocsi azt gondoltam nem támogatja, de úgy néz ki még is:
short i = 500;
char buf[4];
sprintf (buf, "%d", i);
printf("ide2: %s\n", buf);És maradékos osztással már megoldom.
Csak egy lökés kellett.
Köszi..[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
don_peter
senior tag
-
don_peter
senior tag
Igen, igen igazad van.
Erre gondoltam én is, csak rosszul fejeztem ki maga.
A lényeg az, hogy az eredmény (arra amire nekem kellene) értékelhetetlen lenne az utóbbi megoldást használva.buherton:
Közben rájöttem, hogy a memória címzés miatt csúszott el durván az egész beírás.
Most már megy szépen minden oda ahová kell.
2óra debug kihozta a hibát[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
buherton
őstag
válasz don_peter #4725 üzenetére
Örülök, hogy meg lett. Nem ez lesz az utolsó memória elírásod. Sajnos ez tapasztalat .
Viszont ha már szóba került, akkor a watchdogot tényleg állítsd be. A watchdog egy speciális timer, ami ha lejár, akkor pl. csinál egy szoftver reset-et és ezzel újraindul az uC. Ez akkor jön jól, ha pl. viharban kap egy tüskét a cucc és beakasztja a futást. Ekkor a timer lejár és már reseteli is. Többféle alkalmazási technikája is van a WD-nek, de az általános azaz, hogy induláskor inicializálod a WD-t, majd valamelyik ciklikus "task"-ban reseteled a timer-t, ezzel megakadályozod, hogy lejárjon a timer.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
don_peter
senior tag
válasz dabadab #4727 üzenetére
Lesznek még félreérthető kérdéseim...
Nézzétek el nekem.
Tanulok belőlük.. (legalább is remélem )buherton:
watchdog-ot én is ismerem, és úgy kell megírjam a programot, hogy ezt ne keljen alkalmazni.
És természetesen úgy kell majd megterveznem és megépítenem, hogy ne legyen semmilyen olyan zavar ami kiválthatna egy akadást.
Tehát nem szabad beakadnia a program futásának, főként nem akkor amikor forraszt majd a gép.
Atom biztosan kell mennie.[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
buherton
őstag
válasz don_peter #4728 üzenetére
A watchdog használata nem a kód minőségétől függ, hanem a életben előforduló véletlenektől. Ha biztosra szeretnél menni a programod működése szempontjából, akkor használsz watchdogot, mert nem tudhatod, hogy az adott eszköz milyen behatásoknak lesz kitéve, illetve mikor fog az uC tévedni. Ezekre a kihatásokra csak részben lehet felkészülni szoftveres és hardveres oldalról, és a watchdog sem jelent mindenre megoldást, de az legalább a nagy részét lefedi.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
buherton
őstag
Lenne hozzátok egy teszt kérdésem saját felmérés céljából.
int i = 0;
i += i++;Mennyi lesz az i eredménye? A nagy tudású tudorok ne árulják el a választ .
MOD: holnap ilyenkor adom meg a helyes választ.
[ Szerkesztve ]
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
don_peter
senior tag
válasz buherton #4730 üzenetére
Véleményem szerint az eredmény 0 lesz.
Nem teszteltem le szóval lehet hibás a válasz...Magyarázat: Ha jól gondolkodom, akkor az i++ nem értékelődik ki vagy csak az eredmény átadás után implementálódik. (Bár lehet akkor sem)
[ Szerkesztve ]
----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----
-
alapz@j
tag
Egy érdekes problémába botlottam, ami három különböző fordítóval is előjön, szóval a kódban lehet a hiba, de nem tudom, hogy mi.
#include <stdio.h>
int main(void) {
char date[] = "2014/05/01";
int year, mon, day;
int res = sscanf(date, "%i/%i/%i", &year, &mon, &day);
printf("%i\n", res);
return 0;
}Ez így jól működik, a res-be három kerül, mert három értéket sikerült beolvasnia a sscanf-nak. De ha a hónapot átírom 08 vagy 09-re akkor azt már nem ismeri fel. Minden más értékre működik. Ha sima 8-at vagy 9-et írok, megint működik. Szerintetek?
-
alapz@j
tag
-
buherton
őstag
válasz alapz@j #4738 üzenetére
Valaki tudja, hogyan lehet az stdout-t átírni PC-n (gcc)? Ez alatt azt értem, hogy nem a normális standard out-ra akarok kiírni, hanem a programon belül szeretném tartani az adatfolyamot.
Egyelőre nem találtam megoldást a neten.
[ Szerkesztve ]
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
buherton
őstag
A probléma egy kicsit összetettebb, mert az avr-gcc, ezt tudja:
static FILE mystdout = FDEV_SETUP_STREAM(usart_putchar_printf, NULL, _FDEV_SETUP_WRITE);
int main( void )
{
stdout = &mystdout;
printf("Hello world");
}
void usart_putchar_printf(char data, FILE *stream)
{
bájt küldése soros porton
}és ezt szerettem volna elérni a PC-n is, hogy végül egy függvényt hívjon minden karakter kiíráskor.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
Karma
félisten
válasz buherton #4742 üzenetére
Ilyenről szabványos környezetben nem tudok, de ha a soros portig eljutás kell csak, irányítsd Windowson a comX-re a forgalmat, Linuxon meg a /dev/ttySX-re (ahol X a port száma).
Keresgéltem még egy kicsit, egyre inkább úgy tűnik, hogy a FILE*-ot nem lehet csak úgy helyettesíteni, ez valami avr-gcc sajátosság.
[ Szerkesztve ]
“All nothings are not equal.”
-
Jester01
veterán
glibc-ben van fopencookie de az valóban nem szabványos.
Ha saját programodból akarsz mondjuk soros portra írni, akkor úgy célszerű eleve felépíteni.
Jester
-
buherton
őstag
A lényeg azaz lenne, hogy egy egyszerű mikrokontrolleres környezetet akartam kialakítani a PC-n, hogy ne a a hardveren kelljen szenvedni. Viszont nem rossz ötlet, csak kérdés, hogy Linux engedi-e, hogy egyszerre két program kezelje a soros portot (windowson biztosan nem), de ez már más topic.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
buherton
őstag
válasz buherton #4730 üzenetére
Majd elfelejtettem.
Előre bocsátom, hogy ez az egyik legszemetebb teszt kérdés a C-ben. Ugyanis ehhez jól kell ismerni a C szabványt, mert abban van leírva, hogy "két szekvencia pont között ha egy változónak egynél többször adunk értéket, akkor nem definiált a működés", azaz nem tudjuk biztosra megmondani, hogy mi lesz az eredmény, mert fordító függő lesz.
Ismerősöm állás interjún kapott egy ilyen feladatot, de volt ám meglepetés, amikor elkezdte mondani a fentebbi szöveget, ugyanis az interjúztató nem tudott erről . Így nem kell bánkódni azoknak akik nem tudták. Egy évvel ezelőtt én se tudtam volna a helyes választ.
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
-
axioma
veterán
válasz buherton #4746 üzenetére
Akkor nekem anno hulyeseget tanitottak... en ugy tudtam, hogy az i++ azt jelenti, hogy az adott sorban levo minden mas muvelet utan kell az i=i+1-et erteni, a ++i-nel meg ugyanezt az (ezen muvelettol megfosztott) sor ele. Ez siman eldontene a dolgot ebben az esetben is (azt ertem, hogy csak a ketszer i-nek ertekadasnal van gond, altalanos esetben igaz lesz). Igazabol nem is tudom elkepzelni, hogy mi az az indok, amiert a ford.pr-nak jobb ha nem tartja ezt ebben a spec. esetben is be, de biztos oka van.
Mas kerdes, hogy nem tunik amugy se jo gyakorlatnak semmi olyan kodsort leirni, ami nem ranezesre egyertelmu, hogy mit fog csinalni. Raadasul ez csak 2 sort von ossze egybe, nem egy nagy kaland kiirni, biztositani az elkepzeleseknek megfelelo sorrendet. -
buherton
őstag
Több példa is van, ahol a szabvány ezzel foglalkozik pl.:
sum = sum * 10 - '0' + (*p++ = getchar()); ennél a példánál sem egyértelmű, hogy mikor fog inkrementálódni a p mutató. Az okot nem írja csak a szekvencia pontokra hivatkozik.Az ilyenek valóban kerülendők, ezért sem találkoztam még soha ilyen warning üzenettel.
(#4747) Jester01: Sose próbáltam lefordítani, de ez tök jó, hogy a fordító figyelmeztet. gcc?
tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!
Ú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!