SharedMemory Speicherzugriffsfehler



  • Servus

    Immer wenn ich versuche was aus meinem SM zu lesen bekomme ich nen Speicherzugriffsfehler.

    Main

    auktionsStruct * auction;
            auction=initSM();
    	auction->startGebot=100;
    	auction->aktuellesGebot=0;
    	auction->hgClient=0;
    	printf("%d\n",auction->startGebot);
    

    iniSM()

    auktionsStruct * tmpauction;
    	if((kennung=shmget(IPC_PRIVATE,sizeof(auktionsStruct),0666))==-1)
    		printf("Kann SM nicht anlegen\n");
    	if((tmpauction==(auktionsStruct*)shmat(kennung,NULL,(SHM_R|SHM_W)))<0)
    		printf("Kann SM nicht anschliessen");
    	return tmpauction;
    

    Ich weiß nett wo der fehler liegen soll.

    thx 4 help



  • Edit:
    Noch das Struct

    typedef struct
    {
       int startGebot;     // Startgebot
       long aktuellesGebot; // aktuelles Gebot
       short hgClient;      // Nummer des höchstbietenden Clients
       long startZeit;      // Startzeit der Auktion
       long endeZeit;       // Endezeit der Auktion
       short flag;          // run =1, Stop = 0, Acknowledge= 1000, weitere Kennungen
    } auktionsStruct;
    


  • ich gehe mal davon aus, dass der Fehler/Coredump erst beim printf() erfolgt und der ptr "auction" ungleich 0 ist.

    Ich habe das mal mit meiner Standard-Routine verglichen (da nehme ich zwar nicht IPC-PRIVATE), kann auf Anhieb aber keinen wesentlichen Unterschied oder Fehler erkennen. Einziger Unterschied:

    Ich benutze beim shmat() als 3. Parameter "0", also etwa:

    ... = shmat(kennung,NULL,0)
    

    Vielleicht hilfts?

    P.S.: Beim shmat() würde ich nicht auf <0 prüfen, da eine Addresse zurückkommt, die je nach Maschine/System ggf. auch das oberste Bit gesetzt haben kann. Also besser etwa:

    cp = (char *) shmat(shmid,NULL,0);
    if ((cp == NULL) || (cp == ((char *) -1)))
        { ... }
    


  • Nachdem ich mir mal nen klaren Kopfgemacht habe und nochmal den Code überflogen habe. Hab ich den Fehler nun gefunden.

    auktionsStruct * tmpauction;
        if((kennung=shmget(IPC_PRIVATE,sizeof(auktionsStruct),0666))==-1)
            printf("Kann SM nicht anlegen\n");
        if(([b]tmpauction==(auktionsStruct*)[/b]shmat(kennung,NULL,(SHM_R|SHM_W)))<0)
            printf("Kann SM nicht anschliessen");
        return tmpauction;
    

    Hier fett markiert natürlich sollte das eine Zuweisung sein kein Vergleich. Kann man ja so leicht übersehen.

    Aber danke für die Tips werde ich gleich anwenden.



  • @Zed
    bist du zufällig von der HS Albsig, 4. Semester?



  • Hiermit bestätige ich die Welt ist klein.
    Ja bin ich



  • tja ja, das auktionsStruct hat dich verraten 😉

    ich werde noch Nachtschicht schieben, sonst wird das nix...


Anmelden zum Antworten