Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
uint16_t
foo(uint16_t bar) {
return (bar & 0xF0);
}
struct interface {
uint16_t (*foo)(uint16_t);
};
#if NEEDS_CONVERTER
static struct interface exported_interface = {
.foo = &foo_converter
}
#else
static struct interface exported_interface = {
.foo = &foo
}
#endif
uint16_t
foo_converter(uint16_t bar) {
return(htons(foo(ntohs(bar))));
}
extern struct interface exported_interface;
int
main(int argc, char **argv) {
exported_interface.foo(0x1234);
}
Das Programm ist in C geschrieben und es handhabt WLAN-Verbindungen. Der Haken ist, dass ich einige Bitshifts im Programm habe und schon fundiert portieren möchte. Eigentlich kann ich mir gar nicht vorstellen, dass einfach die Verwendung eines PPC-Compilers alles Probleme löst - denn dann könnte man ja einfach jede Software auf jede X-beliebige Plattform mit minimalem Aufwand portieren. Und das bezweifle ich eigentlich (ganz ohne Vorwissen)...


* saugeil * würde mein Junior jetzt sagen 

immer senkrecht bleibenWenn du dich strikt an die Qt eigenheiten hälst, sollte es auf allen Plattformen kompatibel sein.
Stimmt nicht ganz. Sobald Du in C oder C++ mit (Binär-)Daten von mehreren Bytes Länge (z.B. int, long, etc.) zu tun hast, und diese Daten von extern, also z.B. über's Netzwerk oder von Platte, kommen dann hilft auch QT nicht.
Die Klasse sieht ganz interessant aus, aber ich glaube für rohe Binärdaten die einer bestimmten Byte-Anordnung folgen müssen, also Dinge die man in C üblicherweise einfach in einen Buffer liest und dann als Pointer auf eine Struktur casted (z.B. Header von Netzwerkpaketen) ist sie etwas zu aufwändig.
Das lesen eines Buffers ist ja simpel (QBuffer), damit kannst bsp. ein QByteArray eifach lesen/schreiben ohne jegliche anderen sorgen. Man muss natürlich auch beachten:
struct pci_config_space {
uint16_t vendor_id;
uint16_t device_id;
/* Ein paar andere Felder */
uint32_t exp_rom_base_addr;
/* Noch mehr Felder */
};
int
main (int argc, char **argv) {
struct pci_config_space *ptr = (void *) 0x00010002;
printf("vendor=%#x\n", ptr->vendor_id);
printf("device=%#x\n", ptr->device_id);
printf("rom=%#x\n", ptr->exp_rom_base_addr);
return (0);
}
Mal ein simples bsp., bei Qt gibts quint8, quint16, quint32 und quint64. Qt garantiert das diese Datentypen auf allen Plattformen gleich gross sind. Demnach wäre es etwas naiv, eifach statt quint16 den "unsigned int" zu verwenden, da ja generell bekannt ist, dass ein int ein 16 oder 32 bit langer datentyp sein kann.
Ich glaub wir reden ein bisschen aneinander vorbei. Es geht eigentlich so langsam immer weiter weg vom Thema, aber ich würd's Dir trotzdem gern erklären was ich meine.
Wenn Du einen Daten-Block irgendwoher einliest, es ist wirklich egal woher er kommt, bei dem das Layout vorbestimmt ist, dann wird das (so wie ich das im Moment überlicke) schnell unübersichtlich mit den QT Klassen. Das liegt erst einmal da dran, dass man nicht ohne weiteres einen Datenblock in ein Objekt casten kann.
Nimm an, Du würdest an der Adresse 0x00010002 den Config Header des zweiten Geräts am ersten PCI Bus auslesen können. Nimm weiterhin an, Du bist an Device- und Vendor-ID interessiert sowie an der Adresse des Expansion ROMs.
Eventuell musst Du dem Compiler noch sagen, dass die Struktur gepackt werden muss, aber im Prinzip würdest Du In C so etwas schreiben:
Code:struct pci_config_space { uint16_t vendor_id; uint16_t device_id; /* Ein paar andere Felder */ uint32_t exp_rom_base_addr; /* Noch mehr Felder */ }; int main (int argc, char **argv) { struct pci_config_space *ptr = (void *) 0x00010002; printf("vendor=%#x\n", ptr->vendor_id); printf("device=%#x\n", ptr->device_id); printf("rom=%#x\n", ptr->exp_rom_base_addr); return (0); }
Der Code wird das richtige Ergebnis auf einer Little Endian Maschine liefern, auf einer Big Endian Architektur werden die Werte allerdings "falsch herum" ausgegeben.
Du könntest die Adresse des Headers natürlich auch einem QDataStream Objekt indirekt über ein QByteArray übergeben; irgendwie wird das Framework schon auf rohen Daten operieren können. Du müsstest dann allerdings wissen, dass die Vendor ID bei Offset 0h, die Device ID bei Offset 2h und die Expansion ROM Base Address bei Offset 30h steht.
Auf was ich hinaus will: Die QT Klassen lösen ein völlig anderes Problem als das des Threadstarters - jedenfalls habe ich das so interpretiert.
Wenn ich's recht weiß ist die Breite eines int komplett abhängig von Compiler und Prozessor, ist aber auch egal.
Was ich sagen wollte: {,u}int{8,16,32,64}_t (C99 Typen) sind auch auf allen Plattformen genau 8/16/32/64 Bits breit - das ist also kein Argument. Allerdings gebe ich Dir Recht, dass wenn man sich in einem Framework bewegt, dass man es dann bitteschön richtig macht und dann auch die entsprechenden Datentypen verwendet.
Vielleicht hab ich das Problem nicht gut genug erklärt. Deshalb ohne Dir zu Nahe treten zu wollen: Ich glaube Du verstehst nicht, um was es geht. Das Beispiel mit dem PCI Config Header war frei gewählt, es hätte ebenso der Section-Header einer ELF Datei oder sonstwas sei können. Das Grundproblem hat mit Hardware wenig bis nichts zu tun und mit D-Bus noch weniger.
.Vincent Vega, joar, dass stimmt mit sicherheit au. Deshalb währe ich dir dankbar, würdest mir ein konkretes beispiel geben, wo die Importabilität existiert?
struct pci_config_space {
uint16_t vendor_id;
uint16_t device_id;
/* Ein paar andere Felder */
uint32_t exp_rom_base_addr;
/* Noch mehr Felder */
};
int
main (int argc, char **argv) {
struct pci_config_space *ptr = (void *) 0x00010002;
printf("vendor=%#x\n", ptr->vendor_id);
printf("device=%#x\n", ptr->device_id);
printf("rom=%#x\n", ptr->exp_rom_base_addr);
return (0);
}
QByteArray byteArray;
byteArray.setRawData(0x00010002, 0x40);
QDataStream stream(byteArray, IO_ReadOnly);
/* ... */
byteArray.resetRawData(0x00010002, 0x40);
QDataStream &QDataStream::operator>> (struct pci_config_space & ptr);
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen