Kopieren einer Struktur durch std::copy in einen Vektor
-
Ich habe gerade folgendes Problem:
pcap_if_t *devices; std::vector<pcap_if_t> aDevices; ... aDevices.push_back(pcap_if_t()); std::copy(*myDevice, *myDevice + sizeof(pcap_if_t), aDevices.back());
Der Pointer zeigt auf eine Struktur, welche in das Element des Vektors kopiert werden soll. Leider funktioniert folgende Lösungsidee nicht.
1>pcap.cpp(22): error C2676: Binärer Operator '+': 'pcap_if_t' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht
Danke für eure Hilfe
-
der "derefenzier" operator * hat vorrang gegenüber dem + operator.
du musst die addition in klammern setzen, damit das Ergebnis dereferenziert wird.
-
Ich glaube eher, du möchtest
aDevices.back() = *myDevice;
std::copy tut nicht, was du denkst dass es tut. Schlags mal nach.
-
std::copy(*myDevice, *(myDevice + sizeof(pcap_if_t)), aDevices.back());
Mhmm, funktioniert immer noch nicht. Macht aber (entschuldigung) nach meinen Augen auch keinen Sinn... Wenn man die Gröse der Struktur zum Pointer dazu addiert und erst danach den Dereferenzieroperator anwendet, landet man doch praktisch gesehen überall... Eigentlich müsste man doch zuerst den Dereferenzieroperator anwenden, dann die Grösse der Struktur dazuaddieren und danach erst dereferenzieren... Leider scheitere ich aber dabei.
std::copy(*myDevice, (pcap_if_t) ((unsigned int)*myDevice + sizeof(pcap_if_t)), aDevices.back());
-
std::copy tut nicht, was du denkst dass es tut. Schlags mal nach.
Mhmm, verstehe gerade nicht was du meinst, aber der Code sieht gut aus
(Leider hänge ich jetzt am nächsten Problem (die Struktur hat noch weitere Pointer), aber ich denke mal dieses Problem ist geklärt^^)
-
Erzähl am besten, was du machen willst, und nicht wie. Dann kann man dir besser helfen. Jedenfalls kann ich deinem Code nicht ansehen, was du erreichen willst.
Edit: Ok, du hast es ja eigentlich im Titel stehen. Aber das "durch std::copy" hättest du dir sparen können; denn std::copy ist hier nicht der beste Ansatz. Warum nicht einfach mit push_back?
aDevices.push_back(*myDevice);
Wo kommt denn der Zeiger eigentlich her? Verwendest du irgendwo new[] oder malloc oder sowas?
-
krümelkacker schrieb:
Wo kommt denn der Zeiger eigentlich her?
Vermutlich hat er die aus einer Funktion der C-Library libpcap. Selbstverständlich muss er die später auch wieder durch Aufruf einer libpcap-Funktion freigeben.
-
Mal einen kurzen Blick in die Pcap-Manpages geworfen: Pointerproblemhaber, du bist dir schon darüber bewusst, dass der pcap_if_t-Zeiger, den du durch Aufruf von pcap_findalldevs erhältst, auf das erste Element einer verketteten Liste zeigt? Die Struktur sieht auf meinem System übrigens so aus:
struct pcap_if { struct pcap_if *next; char *name; /* name to hand to "pcap_open_live()" */ char *description; /* textual description of interface, or NULL */ struct pcap_addr *addresses; /* wieder eine verkette Liste */ bpf_u_int32 flags; /* PCAP_IF_ interface flags */ }; /* snip */ struct pcap_addr { struct pcap_addr *next; struct sockaddr *addr; /* address */ struct sockaddr *netmask; /* netmask for that address */ struct sockaddr *broadaddr; /* broadcast address for that address */ struct sockaddr *dstaddr; /* P2P destination address for that address */ };
Was in aller Welt versuchst du da mit dem std::copy zu erreichen?