Hallo Gemeinde,
ich schreibe eine art parser wobei ich jetzt auf ein problem gestoßen
bin.
ich habe 8 & 16 bit breite variablen (arrays) und will diese als 1.
pointer ausgeben.
stark vereinfachtes beispiel:
1
char i[10];
2
short z[3];
3
..
4
5
//initialisierung der arrays
6
//ein paar defines
7
..
8
9
void* var(char vartype, char element)
10
{
11
switch(vartype)
12
{
13
case INT_: return *i[element];
14
break;
15
case SHORT_: return *z[element];
16
break;
17
default; return null;
18
break;
19
}
20
}
21
22
void main()
23
{
24
//ne ganze menge inits und so
25
var(INT_,0) = 12;
26
var(SHORT_,12)=0;
27
}
aber das funtioniert so leider nicht :(
kann mir da jemand helfen?
danke schonmal :)
Abgesehen von der Unsinnigkeit des Beispiels ...
Ich würde es mal mit dem Adressoperator versuchen und in main die
gelieferten Pointer dereferenzieren.
1
...
2
caseINT_:return&i[element];
3
break;
4
caseSHORT_:return&z[element];
5
break;
6
default;returnNULL;
7
break;
8
...
9
10
11
...
12
*((int*)(var(INT_,0)))=12;
13
*((short*)(var(SHORT_,12)))=0;
14
...
P.S: Mit AVR-GCC/WinAVR ist sizeof(int) == sizeof(short) und darum die
Unterscheidung eine rein akademische Angelegenheit.
EDIT: PPS. Ähh i ist char[], aber case INT_: return &i[element]; ???
danke werner, aber dein ansatz funktioniert nicht, wenn ich einen wert
zuweisen möchte :(
\main.c:: In function `main':
\main.c:264: warning: dereferencing `void *' pointer
\main.c:264: error: invalid use of void expression
Hengst wrote:
> danke werner, aber dein ansatz funktioniert nicht, wenn ich einen wert> zuweisen möchte :(>> \main.c:: In function `main':> \main.c:264: warning: dereferencing `void *' pointer> \main.c:264: error: invalid use of void expression
Sorry, ich habe auf den ersten Blick nicht alle Fehler gesehen. Ist im
Edit korrigiert (hoffentlich alle ;-))
EDIT nautürlich nicht. Stefan hat noch einen mehr gefunden :-/
bei einem "unsigned short" passiert dies:
\main.c:159: warning: comparison is always true due to limited range of
data type
\main.c:159: warning: use of cast expressions as lvalues is deprecated
\main.c:159: error: invalid lvalue in increment
aus der meldung werde ich nicht ganz schlau :(
@ Hengst (Gast)
> aber bei "unsigned short" geht es nicht...
Das unsigned short taucht jetzt zum 1. mal auf...
Ja, da kann man nicht mal raten :-(
Wie sieht denn diese problembehaftete Zeil 159 aus?
Idealerweise würdest du nicht nur die Frage stellen, sondern auch eine
Möglichkeit zur Beantwortung liefern, indem du (wenigstens) diese Zeile
mitpostest. Besser noch das ganze Programm.
BTW:
1
chari[10];
2
3
void*var(charvartype,charelement)
4
{
5
switch(vartype)
6
{
7
caseINT_:return&i[element];
8
:
Was verwendest du für einen Prozessor, wo ein char = int ist?
Ich habe ein wenig den Eindruck, dass du etwas Einfaches einfach
kompliziert lösen willst. Beschreib doch eher mal die Aufgabe,
vielleicht kommen dann andere (und bessere) Lösungsvorschläge ;-)
ich habe mein problem weiter lokalisiert, weiß jetzt aber nicht, wie ich
es umgehen kann.
ich habe eine große anzahl von #definitin für jede menge kleine aufgaben
...bricht der comiler bei "adce(*((uint16_t*)VAR(var_type,var)));" ab
mit den meldungen
warning: use of cast expressions as lvalues is deprecated
error: invalid lvalue in increment
es muss irgendetwas mit #define zu tun haben... scheinbar kann ich nur
8bit variablen übergeben. habe ich damit recht? kann ich das umgehen?
compiler: gcc 3.4.5 mingw
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.