- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 10

Thema: Sehr komisches Verhalten bei void*...

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    25.05.2008
    Ort
    Korntal-Münchingen
    Alter
    42
    Beiträge
    15
    Zitat Zitat von gunzelg Beitrag anzeigen
    Folgendes steh zwar nicht zur debatte, ist für mich aber auch suspekt:
    case READ_VBATT:
    LOG(PROTOCOL, "Reading battery voltage");
    *(unsigned long*)pOutput = 143 * 100;
    Warum suspekt?

    Wir haben eine Funktion, die wie folgt Deklariert ist:

    Code:
    extern "C" QUOKAJ2534_API long PassThruIoctl(
        unsigned long ChannelID
        , unsigned long IoctlID
        , void* pInput
        , void* pOutput
    );
    Der erste Parameter ist für uns uninteressant.

    unsigned long IoctlID zeigt, was genau gemacht werden soll, ob die Batteriespannung gelesen werden soll oder eben die 5-Baud-Initialisierung.

    Die beiden void* Parameter werden je nach IoctlID bedatet...

    Die J2534 Spec sagt zum Beispiel aus:

    Wenn READ_VBATT (IoctlID = 0x03) aufgerufen wird, dann:
    -> pInput ist NULL, weil dieser Parameter nicht verwendet wird
    -> pOutput ist ein Pointer auf ein unsigned long, der eine Spannung in Millivolt hält.

    Dieses void* Konstrukt ist an und für sich ganz cool, weil man eben alles Mögliche reinstopfen kann, man muss nur irgendwie sagen, was da drin steckt und das passiert hier über die Variable IoctlID.

    Alternative wäre für jeden Satz an Variablentypen eine eigene Funktion zu schreiben, macht das Ganze nicht gerade übersichtlicher.

    Der Aufrufer, der die Funktion PassThruIoctl aufruft, weißt ja, was er zurückerwartet und übergibt an die beiden void* Parameter die Referenzen auf die Variablen, die er zuvor (vor dem Aufruf) angelegt und initialisiert hat. Das ist ein klassisches "call by referenz" Verfahren, da wird eben nicht der Wert einer Variable (wie bei "call by value") übergeben, sondern die Referenz.

    Beantwortet es Deine Frage?

    Zitat Zitat von gunzelg Beitrag anzeigen
    Aber um da weiter zu kommen, würde ich das ganze mal in sofern simulieren, dass ich ein Programm schreibe, das deine Funktion aufruft.
    Dann kannst du das ganze leicht debuggen unds schaun was ankommt und gegebenfalls in der Funktion den Code anpassen.
    Ja, damit habe ich schon angefangen, dann sehe ich, was da passiert. Eine sehr gute Idee.

    Zitat Zitat von Holomino Beitrag anzeigen
    Die Zuweisung der Adresse von outputMsg auf den pOutput-Parameter?
    Such mal im Zweig "case FIVE_BAUD_INIT:" nach "pOutput". Der kommt da gar nicht vor.
    Du hast Recht... irgendwie habe ich es verrafft...

    Da hat in der Tat das hier gefehlt:

    Code:
    *(SBYTE_ARRAY*)pOutput = outputMsg;
    Nun sieht der Case so aus:

    Code:
    case FIVE_BAUD_INIT:
                    {
                        LOG(PROTOCOL, "Five baud init");
                        SBYTE_ARRAY* inputMsg = (SBYTE_ARRAY*)pInput;
    
                        if (inputMsg->NumOfBytes > 1)
                        {
                            LOG(PROTOCOL, "Wake up message length is greater than 1 Byte");
                            return ERR_INVALID_MSG;
                        }
                        
                        LOG(PROTOCOL, "pInput array");
                        LOG(PROTOCOL, "Wake up for ECU with id 0x%02x called", inputMsg->BytePtr[0]);
                        LOG(PROTOCOL, "pInput array end");
    
                        unsigned char KeyWords[2]{};
                        SBYTE_ARRAY outputMsg{};
                    
                        LOG_SBYTE(PROTOCOL, inputMsg);
    
                        KeyWords[0] = 0x00;
                        KeyWords[1] = 0x81;
    
                        outputMsg.NumOfBytes = 2;
                        outputMsg.BytePtr = &KeyWords[0];
    
                        *(SBYTE_ARRAY*)pOutput = outputMsg;
                    
                        LOG(PROTOCOL, "pOutput array");
                        LOG_SBYTE(PROTOCOL, (SBYTE_ARRAY*)pOutput);
                        LOG(PROTOCOL, "pOutput array end");
                    }
                    break;
    Das hat nun die Auswirkung, dass ich im Test-Tool einen festen Wert bekomme, der sich auch nicht ändert, wenn ich mehrmals auf Execute drücke. Bild ist im Anhang.

    Zitat Zitat von Holomino Beitrag anzeigen
    dann tschuldige, dass ich lebe.
    Was soll das denn bitte???
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken TestTool_2.jpg  

Ähnliche Themen

  1. Tiny13(A), PWM, $crystal: Komisches Verhalten
    Von M_I_B im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 21
    Letzter Beitrag: 18.09.2012, 10:19
  2. RP6-Wetterstation komisches Verhalten
    Von Virus im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 03.01.2010, 11:35
  3. Komisches AVR Verhalten...
    Von EDatabaseError im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 21.02.2007, 19:44
  4. Komisches Verhalten bei SD21 mit Picaxe mit ADC
    Von Anubisbot im Forum Sensoren / Sensorik
    Antworten: 9
    Letzter Beitrag: 17.11.2005, 11:46
  5. Komisches verhalten meiner CC1
    Von d4rkwolf im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 01.03.2005, 20:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress