long in char konvertieren

#607939
Lesenswert?
• ▲
▼
SiO2 wrote:
> Hi,
> ich hab ein longarray, und möchte aber auf die longs byteweise
> zugreifen, so daß ich 4 einzelne bytes eines longwertes habe. ltoa gibts
> bei keil anscheinend nicht.

ltoa() würde dir auch nichts nützen. Diese Funktion macht was
ganz anderes.

> und einen charzeiger darüberlaufen lassen
> geht nicht, da der kompiler nen fehler meldet.

Wenn du uns auch noch sagen würdest wie der Fehler lautet
und den zugehörigen Code dazu (+ notwendige Umgebung
um das Ganze verstehen zu können), dann könnte dir irgendwer
erklären wo du die C-Regeln verletzt hast. Einen 'char-
Pointer drüberlaufen lassen' ist eine der Möglichkeiten
die du hast um dein Problem zu lösen.


Eine weitere ist der Einsatz einer Union.
Eine weitere ist der Einsatz von Shift und Maskieroperationen
um die einzelnen Bytes zu extrahieren.
Gast #607940
Lesenswert?
• ▲
▼
Arraydefinition:
 signed long  par[ PAR_COUNT ];

code zum auslesen:
  char * p_array;
  p_array=&par[0];


Fehlermeldung:

CParameter.cpp(226): error: a value of type "signed long *" cannot be 
assigned to an entity of type "signed char *"


Irgendwas muss ich da übersehen.
Gast #607941
Lesenswert?
• ▲
▼
@ SiO2 (Gast)

>bei keil anscheinend nicht. und einen charzeiger darüberlaufen lassen
>geht nicht, da der kompiler nen fehler meldet.

Du brauchst einen Pointer cast.

Ohne Gewähr.

char *p_char;
long tmp;

p_char = (char*)&tmp;

MFG
Falk
#607949
Lesenswert?
• ▲
▼
SiO2 wrote:
> @Falk, geht mit dem cast auch nicht,

Ohne den Keil Compiler zu kennen:
Das muss gehen. Mit einem cast
überstimmst du immer das Typ-Prüfsystem
des Compilers.


> der Keilcompiler hat sogar nen
> problem wenn ich ne fkt habe, die int als parameter nimmt aber ein
> volatile int übergebe.

völlig zu Recht.
Gast #607951
Lesenswert?
• ▲
▼
@ SiO2 (Gast)

>@Falk, geht mit dem cast auch nicht, der Keilcompiler hat sogar nen
>problem wenn ich ne fkt habe, die int als parameter nimmt aber ein
>volatile int übergebe.

Zeig mal deinen Quellcode und die Fehlermeldung.

MFG
Falk
Gast #607952
Lesenswert?
• ▲
▼
>> der Keilcompiler hat sogar nen
>> problem wenn ich ne fkt habe, die int als parameter nimmt aber ein
>> volatile int übergebe.

>völlig zu Recht.

Wieso? ich gebe mit volatile doch nur an, dass es nicht wegoptimiert 
werden soll.

grübl
Gast #607959
Lesenswert?
• ▲
▼
@Falk
main.cpp(92): error: argument of type "volatile unsigned int *" is 
incompatible with parameter of type "unsigned int *"

deklaration:
void setBitI( unsigned int * where, char bit_nr, char value );

code:
extern volatile unsigned int * io1_i;
setBitI(io1_i,2,2);
Gast #607988
Lesenswert?
• ▲
▼
@ SiO2 (Gast)

Ich meinte eher das Problem mit dem Pointer cast.

Und das mit dem volatile hat auch seinen Grund. Kann ich aber jetzt 
nicht wirklich begründen, bin da nicht so der C-Profi.

MfG
Falk
#607993
Lesenswert?
• ▲
▼
SiO2 wrote:
>>> der Keilcompiler hat sogar nen
>>> problem wenn ich ne fkt habe, die int als parameter nimmt aber ein
>>> volatile int übergebe.
>
>>völlig zu Recht.
>
> Wieso?

void foo( int* i )
{
}

int main()
{
  volatile int j;

  foo( &j );
}

Woher soll jetzt bitte der Code in foo() wissen, dass für j
spezielle Regeln gelten? In main() teilst du dem Compiler
mit: Mach keine Optimierungen mit der Variablen j und innerhalb
von foo würde das alles nicht mehr gelten?

> ich gebe mit volatile doch nur an, dass es nicht wegoptimiert
> werden soll.

Du spzifizierst mit volatile, dass eine Variable sich auf
Wegen ändern kann, die der Compiler nicht einsehen kann.

volatile ist ein Qualifizierer eines Datentyps, genauso wie const.
Der komplette Datentyp von j ist 'volatile int'. foo() nimmt
aber keinen 'volatile int*'. foo() nimmt einen 'int*'. Das
ist aber ein anderer Datentyp!

Stell dir einfach vor, hinter dem j würde sich in Wirklichkeit
eine Hardwareuhr verbergen. In main() teilst du dem Compiler
korrekterweise mit, dass er bei jedem Zugriff auf j auch wirklich
die Uhr auslesen muss. Dann übergibst du die Uhr an foo() und
innerhalb dieser Funktion darf der Compiler Zugriffe dann plötzlich
cachen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren