[elektro] C -- illegal pointer hiba
SZIGETI Szabolcs
szigiszabolcs at gmail.com
Wed Sep 25 19:39:44 CEST 2013
Hali!
Ha csak az első pár karakter megy ki, akkor szerintem ott a hiba, hogy
rosszul detektálod a string végét.
Ez a te függvényed:
void Funct_SendSTR( const char *s )
{
do
{
SPI1_Write( s ) ; // ezen soron "illegal pointer conversion"
} while ( *s++ != 1 );
}
Ez addig fog menni, amíg a s pointer nem mutat egy 1 értékű bájtra, aminek
valószínűleg nem sok értelme van. Ráadásul az üres stringen elhasal.
Próbáld meg ezt:
void Funct_SendSTR( const char *s )
{
while (*s!=0) /* ha igazán szép akarsz lenni,l akkor *s!='\0' -t írsz,
mivel a '\0' a null karakter. */
{
SPI1_Write(*s);
s++;
}
}
A C ben string igazából nincs, az egy char-ra mutató pointer, ahol egy 0
érték jelzi a string végét. Az üres string egy 0 bájtból áll. Az "abc"
string a memóriában úgy néz ki, hogy 'a', 'b', 'c', 0. tehát 4 bájt.
A fenti függvény azt csinálja, hogy amíg az s által mutatott bájt nem
nulla, addig azt a bájtot kiküldi az SPI-n és egyel növeli a pointer
értékét, tehát veszi a következő értéket. Az üres stringre is működik,
mivel ekkor már az első iteráció sem fut le a while miatt és nem küld ki
semmit.
Már feltéve, hogy ezt kell a programodnak csinálni, nem tudom.
Szabolcs
2013. szeptember 25. 19:26 elight at gmail.hu írta, <elight at gmail.hu>:
> Gyári kódos mikroC-t használok régóta..
> elég nagy gyakorlattal,
> ebben nagyonnagy részben meg is bízok.
> ( Ez tehát kiesett, de azért Ők se tévedhetetlenek.
> néha bogarászni kellett ASM-ben is.. )
>
>
> Általában ha bepipálok egy libraryt ,
> az be is fordítja.. Csak a sajátokat kell def-ni..
> Meg van egy buil_in.h , de azt alapból be szoktam.
>
> Ahogy azSPI1_Write
> az strlen is megy *s -el... sima s-el pedig nem.
> pedig pointeres a meghatározás..
> Jleneleg ugy fordul és fut a progi, de hibásan.
> Amire nem jöttem rá, hogy a string első pár
> betűje megy ki csak a modulban, és időnként
> a widget-em kiírása behülyül..
> És ez csak a TXT-t is tartalmazó ( pointeres )
> vidgetek-nál fordul elő !..
> Ha azokat kilövöm, a többi grafikai elem jó!
> Ez nyomozgatom..
>
> Köszi mindenkinek, kaptam jó ötleteket..
> Holnap majd bogarászom, megpróbálgatom
> sorra...
>
> Üdv István
>
>
>
>
>
>
> 2013-09-25 19:09 keltezéssel, SZIGETI Szabolcs írta:
> > Nagyon gyanús, hogy az strlen-nel van a baj, csak azt nem értem, hogy
> miért
> > nem cost * char-t fogad a te strlened. Azt is vetted valahonnan, vagy a
> > gyárit használod? Mert minden valamire való C környezetben az
> strlen(const
> > char *). Így bármit át lehet neki adni.
> > Lehet, hogy csak egy #include <string.h> hiányzik az elejéről? És akkor
> > rájönne, hogy constnak van deklarálva.
> >
> > Szabolcs
> >
> >
> > E
> >
> >
> > 2013. szeptember 25. 18:58 elight at gmail.hu írta, <elight at gmail.hu>:
> >
> >> Nagyon köszi..
> >> a kis fejtágítást.
> >>
> >> Igy már sokkal világosabb..
> >> És bevallom már értem,
> >> amit ösztönösen elkövettem,
> >> hogy (*s ) et írok be az SPI-nek..
> >> Ugy ment , de a kérdés mégis megmaradt bennem.
> >> Azért is hoztam szóba.
> >>
> >> Már éppen azon morfondíroztam,
> >> hogy felfújom a pofám és írok
> >> egy karakter számoló ciklust helyette..
> >> De akkor esetleg a típus kényszerítéssel is próbálkozgatok..
> >> Ebből annyi már bejött, hogy az "strlen" -emnek valamiért
> >> nem engedi a "const" típusmódosítást..
> >> Lehet itt lenne a bibi . ? .
> >>
> >> Üdv István
> >>
> >>
> >> 2013-09-25 18:47 keltezéssel, SZIGETI Szabolcs írta:
> >>> Hali!
> >>>
> >>> Olvasd el, amit előbb írtam. Ha a te strlen-ed valóban char *-ot vár,
> >> akkor
> >>> annak nem adhatsz át const char*-ot. Elvileg a fordító nem fogja
> engedni,
> >>> hogy nem const pointernek átadjál const-ot, hiszen a const célja pont
> az,
> >>> hogy jelezze, nem változtathatod meg.
> >>> De az érdekes, hogy az strlen nem const*, mivel azokat a függvényeket,
> >> amik
> >>> nem hatnak vissza a pointeren keresztül mindig cons*-nak szokták
> >>> deklarálni. Hiszen annak sima és const pointert is adhatsz, ráadásul
> >> plusz
> >>> biztonságot jelent, a függvény fejlesztése során, mert véletlenül sem
> >> fogsz
> >>> visszafelé változtatni a paramétereken keresztül.
> >>>
> >>> Ha az SPI1_Write unsigned short -ot vár, akkor nem kell segédváltozó,
> >> simán
> >>> a *s-et át kell tudnod adni, a fordító megoldja magától, hogy short-ot
> >>> csináljon a char-ból. Ahol egyértelmű az automatikus konverzió, ott a
> >>> fordító megcsinálja. Ahol nem, de értelmes, ott pedig castokkal magad
> >>> kényszerítheted.
> >>>
> >>> Szabolcs
> >>>
> >>>
> >>>
> >>> 2013. szeptember 25. 18:37 elight at gmail.hu írta, <elight at gmail.hu>:
> >>>
> >>>> Köszi, megnéztem ..
> >>>>
> >>>> és nem , hanem
> >>>>
> >>>> unsigned short data
> >>>>
> >>>> ezek szerint egy változóba át is kellene szedegetnem
> >>>> kilökés előtt..
> >>>>
> >>>> A példa program meg valószínűen pointeres
> >>>> SPI átadást használhatott. Majd kiguberálom
> >>>> belőle , hogy beigazolódjon.
> >>>>
> >>>> Történt , hogy egy nagy terjedelmű c++ -os
> >>>> programból operálok át részeket PIC ben...
> >>>> és már csak a stringes pointer aritmetika az
> >>>> amin kerengek mint a gólya...
> >>>>
> >>>> Akkor legalább ez már megvan.
> >>>>
> >>>> De az
> >>>>
> >>>> int strlen( char * )
> >>>>
> >>>> definiciójú függvényt is
> >>>> kidobja illegál-ra
> >>>>
> >>>> A tényleges sor ami galibát okoz ilyesmi..
> >>>>
> >>>> CMD_Text( unsigned int x; unsigned int y ; unsigned int chartype ;
> >>>> const char *s )
> >>>> {
> >>>> CMD_Start_WR( SMD_SIZE*3 + strlen( s ) + 1 ); // itt fut az
> >>>> "illegal pointer conversion" hibára ,
> >>>> // a többi sor ha kihagyom ténylegesen jól lefut,
> >>>> // csak éppen a parancs megnyitás kimarad.
> >>>> CMD_Funct_Send32( SMD_TEXT ) ;
> >>>> ...
> >>>> }
> >>>>
> >>>>
> >>>> 2013-09-25 18:21 keltezéssel, Bali Zoltan írta:
> >>>>> Hali!
> >>>>>
> >>>>> Az "SPI1_Write( s )" is pointert vár?
> >>>>>
> >>>>>
> >>>>> Üdv. Zoli
> >>>>>
> >>>>> 2013. 09. 25. 17:50 keltezéssel, elight at gmail.hu írta:
> >>>>>> Sziasztok..
> >>>>>>
> >>>>>> Ezt miért dobhatja ki a mikroC fordító?
> >>>>>>
> >>>>>> void Funct_SendSTR( const char *s )
> >>>>>> {
> >>>>>> do
> >>>>>> {
> >>>>>> SPI1_Write( s ) ; // ezen soron "illegal pointer
> >>>> conversion"
> >>>>>> } while ( *s++ != 1 );
> >>>>>>
> >>>>>> }
> >>>>>>
> >>>>>>
> >>>>>> meg azt is kidobja pl hogy
> >>>>>>
> >>>>>> if( strlen( s ) == x )
> >>>>>> {
> >>>>>>
> >>>>>> }
> >>>>>>
> >>>>>> más C nyelvben ez menni szokott?
> >>>>>> vagy nagyon benézek valami?
> >>>>>>
> >>>>>> a 'const' mindenképpen szükséges.
> >>>>>> hogyan írnátok helyesen?
> >>>>>>
> >>>>>>
> >>>>>> Az is kérdésem hogy
> >>>>>>
> >>>>>> ( char * s ) és ( char *s )
> >>>>>>
> >>>>>> az ugyanaz, sajnos ezek a pointeres témák
> >>>>>> általában összegabajodnak bennem.
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> Üdv István
> >>>>>>
> >>>>>> -----------------------------------------
> >>>>>> elektro[-flame|-etc]
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>> -----------------------------------------
> >>>>> elektro[-flame|-etc]
> >>>>>
> >>>> -----------------------------------------
> >>>> elektro[-flame|-etc]
> >>>>
> >>> -----------------------------------------
> >>> elektro[-flame|-etc]
> >>>
> >> -----------------------------------------
> >> elektro[-flame|-etc]
> >>
> > -----------------------------------------
> > elektro[-flame|-etc]
> >
>
> -----------------------------------------
> elektro[-flame|-etc]
>
More information about the Elektro
mailing list