Hallo, ich bin gerade dabei für ein eigenes Projekt ein fremdes Library einzubinden. Hierbei verwende ich 2 unterscheidliche gcc Kompiler: gcc 4.4.3 für X86 Architektur unter Eclipse gcc 4.5.2 für ARM Architektur unter Eclipse Das externe Lib verwendet sehr viele void*, welche dann bei einem Funktionsaufruf übergeben werden - die Funktion verlangt z.B. einen struct xyz*) als Parameter. Für X86 kann ich dass Library erstellen, solche Sachen werden nur als Warnings ausgegeben, das Library funktioniert aber. Der ARM Compiler schmeißt mir hier aber Fehler. Lassen sich die checks auf solche Fehler irgendwie abschalten? Habe bereits angefangen manuell Typecasts einzufügen (da ich weiß was die Funktion erwartet) allerdings werde ich hierbei ziemlich alt, da das Library ziemlich umfangreich ist. Danke, Mike
In C sollten sich void-Zeiger und andere Zeiger auch ohne Cast ineinander umwandeln lassen. Sicher, dass nicht versehentlich als C++ übersetzt wird? Dateiendungen mit .C statt .c gelten für gcc automatisch als C++, wenn nicht über eine Option was anderes angegeben wird.
Hallo, vielen Dank für deinen Ratschlag! An dem lags leider nicht, das Projekt wurde als c angelegt, alle Dateien enden mit .h oder .c (beides klein). Eclipse meldet beim Builden auch dass es den gcc c Compiler verwendet (Invoking: GCC C Compiler) Leider bekomme ich unmengen folgender Fehler (Beispiel): error: invalid conversion from 'void*' to 'phFriNfc_OvrHal_t*' wo dann halt nur ein Typecast hilft. Trotzdem Danke! Mike PS: Kleiner Nachtrag zu meinem ersten Post: Es scheitert nicht am eigenen Projekt sondern dan den exterene Sourcen welche ich zu einem Shared Object builden soll - was unter X86 klappt, unter ARM eben halt nicht. Ich würd so ein hin und her casting nicht verwenden. Grausam zum lesen, noch grausamer zum debuggen.
Michael D. schrieb: > Ich würd so ein hin und her casting nicht verwenden. Grausam zum lesen, > noch grausamer zum debuggen. Wenn du schon im Code eingreifst, dann mach dir eine(!) Hilfsfunktion, die den Cast übernimmt und die Version mit dem void Pointer aufruft. Und die restlichen Aufrufe ersetzt du durch einen Aufruf dieser Hilfsfunktion. Auf die Art hast du dann den Cast nur an einer Stelle und wenn sich dann rausstellt, dass noch mehr zu tun ist, anstatt nur zu casten, dann hast du dann auch gleich die eine einzige Stelle, an der du eingreifen musst.
Wie sieht denn die Compiler-Kommandozeile aus? Man kann per Compiler-Schalter solche Fehlermeldungen auch in C einschalten.
Also ehlrich leute. Das ist völlig normal, das man void* nicht auf einen Typ* zuweisen kann. ANDERSRUM ist es IMMER möglich.
Hast du mal ein Codebeispiel? Das folgende Beispiel compiliert der arm-gcc 4.5.2 auf meinem Rechner selbst mit "-pedantic -Wall -Wextra" ohne zu meckern:
1 | void* vp; |
2 | int* ip; |
3 | |
4 | int i, j; |
5 | |
6 | struct mystruct { |
7 | int si; |
8 | } s; |
9 | struct s* sp; |
10 | |
11 | int foo(struct mystruct* sp) { |
12 | return sp->si; |
13 | }
|
14 | |
15 | int bar(int* ii) { |
16 | return *ii; |
17 | }
|
18 | |
19 | int main(void) { |
20 | |
21 | i = 3; |
22 | |
23 | ip = &i; |
24 | vp = &i; |
25 | ip = vp; |
26 | i = *ip; |
27 | |
28 | bar(vp); |
29 | |
30 | s.si = 5; |
31 | vp = &s; |
32 | |
33 | foo(vp); |
34 | |
35 | return 0; |
36 | }
|
Oliver
Hallo Leute, vielen Dank für Eure Unterstützung. Wie immer saß der Fehler vorm Rechner (bitte um Nachsicht, ich bin Linux-Neuling) Ich hatte in den Projektsettings beim C Kompilerpfad Toolchain.../...g++ angegeben... Eine Änderung auf gcc brachte hier Hilfe. void* schrieb: > Das ist völlig normal, das man void* nicht auf einen Typ* zuweisen kann. Trotzdem macht jeder ein int *p = malloc(123); was in meinem Fall auch nicht funktioniert hat. Danke nochmals, Mike
Michael D. schrieb: > void* schrieb: >> Das ist völlig normal, das man void* nicht auf einen Typ* zuweisen kann. Nein, ist es absolut nicht! > Trotzdem macht jeder ein > > int *p = malloc(123); > > was in meinem Fall auch nicht funktioniert hat. In C muß das funktionieren, sonst ist der Compiler kaputt oder explizit so konfiguriert. In C++ darf es nicht funktionieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.