Pointer in Byte convertieren



  • Hallo Leute ich habe mal eine wahrscheinlich dumme Frage. Aber erstmal zum Hintergrund: Ich möchte ein Netzwerk mit einem Simulationstool simulieren. Die Nachrichten die das Simulationstool versendet haben einen Contextpointer (void*) welcher dazu gedacht ist eigene Inhalte an die Nachricht anzuhängen. Da ich aber mit jeder Nachricht nur ein Byte versenden möchte stelle ich mir die Frage ob es nicht möglich ist den Pointer gleich als Speicherort für das eine Byte (also unsigned char oder uint8_t) zu verwenden. Ist sowas möglich und wenn ja wäre ein kleines Beispiel schön.

    Vielen Danke im Voraus



  • möglicherweise so:

    unsigned char Message = 123;
    send(&Message);
    

    wobei das ganze doch sehr schwammig ist ohne die genaue implementierung zu kennen.



  • @flabahz
    Danke für die Antwort.
    Aber damit mache ich doch auch nur einen Pointer auf die Variable Message. Obwohl Pointer nicht richtig ist. Es wird ja eine Referenz erstellt und bis auf Unterschied das Referenzen nicht 0 werden können sind Pointer und Referenzen fast identisch soweit ich weiß.

    Zur Not muss mich halt doch mit der Speicherverwaltung rumschlagen^^



  • ich verstehe dein anliegen nicht genau.

    derBauer schrieb:

    Die Nachrichten die das Simulationstool versendet haben einen Contextpointer (void*) welcher dazu gedacht ist eigene Inhalte an die Nachricht anzuhängen.

    da hast du gesagt, die funktion erwartet einen (void*), was eindeutig ein zeiger ist da es keine referenzen auf void gibt

    derBauer schrieb:

    Aber damit mache ich doch auch nur einen Pointer auf die Variable Message.

    jo, du teilst der funktion die adresse der variable mit, korrekt.

    derBauer schrieb:

    Obwohl Pointer nicht richtig ist.

    offensichtlich schon, hast du ja in deinem eigenen eröffnungspost gesagt.

    derBauer schrieb:

    Es wird ja eine Referenz erstellt[...]

    ne

    derBauer schrieb:

    [...]bis auf Unterschied das Referenzen nicht 0 werden können sind Pointer und Referenzen fast identisch soweit ich weiß.

    naja so pauschal kannst du das nicht sagen, es gibt schon ein paar unterschiede...



  • ja, du weisst einfach den Inhalt deines Bytes dem Pointer zu:

    void* p = (void*)128;
    


  • @flabahz
    Zum einen sagte ich das Pointer und Referenzen "fast" gleich sind und zum anderen wollte ich mit dem Geschwafel über Pointer
    und Referenzen sagen, dass dein Beispiel eine Referenz auf die Variable Message sendet. Also die Adresse der Variable. Was ich aber
    möchte ist, dass die Adresse auf welche der Poniter zeigt der Wert selbst ist und nicht eine Stelle im Speicher. Aber das geht vermutlich
    nicht.

    Der Knackpunkt ist, dass ich einen Sende-Buffer und einen Empfangs-Buffer habe und wenn die Nachricht aus Komponente 1 raus ist soll
    sie im Sende-Buffer gelöscht werden und somit schieße ich den Speicherbereich ab bevor der Empfänger ihn lesen konnte.

    @knivil
    Ich werde es mal testen ob das klappt aber wenn nicht muss ich das wohl über "shared Pointer" lösen.

    Denn wenn ich die Speicherverwaltung selbst übernehme, werde ich hier nicht froh...



  • Der Knackpunkt ist, dass ich einen Sende-Buffer und einen Empfangs-Buffer habe und wenn die Nachricht aus Komponente 1 raus ist soll
    sie im Sende-Buffer gelöscht werden und somit schieße ich den Speicherbereich ab bevor der Empfänger ihn lesen konnte.

    Du machst wahrscheinlich was falsch.



  • @knivil
    Leider nicht. Ich habe das ganze schon mehrfach geprüft. Der Sendebuffer muss geleer werden nachdem die nachricht die Komponente verlässt und wenn nur Pointer übertragen werden gibts halt Probleme beim Zugriff. Man könnte ja auch einfach Speicher auf dem Heap reservieren aber ich glaub das fällt mir später auf die Füße. Die Sache mit den Pointern ist schon der Weg mit dem geringsten Aufwand und mit der geringsten Anzahl potenzielle Stolpersteine.

    Aber eine Frage hab ich noch: Gibts eine Möglichkeit den Wert des Pointers ohne viel Aufwand in ein uint8_t zu wandeln?



  • derBauer schrieb:

    @flabahz
    Danke für die Antwort.
    Aber damit mache ich doch auch nur einen Pointer auf die Variable Message. Obwohl Pointer nicht richtig ist. Es wird ja eine Referenz erstellt und bis auf Unterschied das Referenzen nicht 0 werden können sind Pointer und Referenzen fast identisch soweit ich weiß.

    Zur Not muss mich halt doch mit der Speicherverwaltung rumschlagen^^

    Es wird keine Referenz übergeben, sondern es wird die Adresse der Variable "Message" übergeben.



  • derBauer schrieb:

    Aber eine Frage hab ich noch: Gibts eine Möglichkeit den Wert des Pointers ohne viel Aufwand in ein uint8_t zu wandeln?

    Du kannst grundsätzlich deinen Speicher casten wohin du willst. Die Frage ist, ob dir der Inhalt deiner neuen Variable dann gefällt. Klar kannst du einen 32bit / 64bit Pointer in einen 8Bit-Integer casten.



  • Ich verstehe nicht, was Du mit "Speicherort" meinst. Wenn Du die Adresse des Bytes, das Du versenden möchtest, verschickst, hat der Empfänger eine Adresse. Die kann er aber nicht benutzen, weil sie nur im Kontext des Senders auf das verweist, was Du eigentlich übertragen willst.

    Dann steht da mit seiner Adresse, weiß, dass es auf dem Quellcomputer an der Stelle was Tolles für ihn gibt - aber er kommt nicht dran!

    Also Käse, den Wert selbst solltest Du verschicken. Das macht man wie von flabahz vorgeschlagen. Du brauchst hier kein Speichermanagement, man kann Zeiger auch im Sinne einer Referenz verwenden. Wichtig ist nur, dass der Zeiger während dem gesamten Versandzeitraum gültig bleibt, da muss man bei asynchronem Versand etwas aufpassen.

    Irgendwo hast Du einen Denkfehler, glaube ich, daher habe ich einfach Mal das Zeug oben geschrieben. Vielleicht hilft's, vielleicht nicht. 🙂



  • Die Lösung hat doch Knivil bereits gepostet. Du weist dem void* ( Contextvariable ) einfach deinen Wert zu, egal ob es nur ein Byte ist oder 4 oder 8 Bytes ( je nach System ). Du kannst sowohl unsigned char ( 1 Byte ) als auch int32/int64 in void* casten.

    Du darfst dann nur bei der Gegenstelle ( Empfänger ) nicht den Fehler machen, zu versuchen den Inhalt der Contextvariable als Adresse zu interpretieren, sondern du musst wissen, dass es eben was anderes ist.

    So wie Knivil das beschrieben hat, funktioniert es garantiert. Wenn nicht, machst du was falsch.


Log in to reply