Taktzyklenoptimierung für getVersion()



  • Hi,

    ich musste gerade eine kleine Funktion für die Ermittlung der Revisionsnummer implementieren. Nun muss das Ding noch auf Taktzyklen optimiert werden. Könnt Ihr mir da vielleicht helfen?

    #include <string.h>
    
    const char revisionv[] = "$Revision: 20 $"; /* hier ersetzt SVN selbst die Revisionsnummer */
    
    /// <summary>Revisionsnummer ermitteln.</summary>
    /// <returns>(int) Revisionsnummer.</returns>
    int getVersion()
    {
    	if(strlen(revisionv) >= 15) /* 15 Stellen entsprechen den svn::keyword Revisionen 0 bis 9 */
    	{
    		int index; /* Index auf die Einerstelle der Revisionsnummer im Revisionsstring */
    		for(index = 11; revisionv[index] != ' '; ++index) /* ab Index 11 (12 Stelle) fängt die Revisionsnummer im String an */
    			continue;
    		index--; /* Benötigt wird nicht der Index auf das Leerzeichen, sondern auf die letzte Zahl */
    
    		int revision = 0; /* Revisionsnummer */
    		int multiplikator = 1; /* Stellenpotenzierer */
    		for(; index >= 11; --index) /* von hinten nach vorne addieren */
    		{
    			revision = revision + ((revisionv[index] - 48) * multiplikator); /* 48 abziehen, da ASCII-Ziffer und nicht Integer */
    			multiplikator = multiplikator * 10; /* sonst wäre 12 nicht 12 (2 + 10) sondern 3 (2 + 1) */
    		}
    
    		return(revision);
    	}
    	else {
    		return(0);
    	}
    }
    


  • Ich hab gerade

    char revisionv[] = "$Revision: 20 $"; /* hier ersetzt SVN selbst die Revisionsnummer */
    

    aus der Funktion herausgenommen und sie im allgemeinen Teil als Konstante definiert:

    #include <string.h>
    
    const char revisionv[] = "$Revision: 20 $"; /* hier ersetzt SVN selbst die Revisionsnummer */
    


  • Hi,
    - das Schlüsselwort const ist zum Kennzeichnen von nicht veränderlichen Variablen gedacht.
    - Wenn die Revisionsnummer größer als 99 wird könnte es Probleme geben.
    - Ansonsten hätte ich da keine Hemmungen sscanf zu benutzen:

    int version()
    {
    	int revnr = -1;
    	sscanf ( revisionv, "$Revision: %d $", &revnr );
    	return revnr;
    }
    

    Gruß,
    B.B.



  • Nimm doch atoi() bzw. strtoul(). Man parst Zahlen definitiv nicht händisch aus Strings raus...



  • Hi Big Brother,

    Big Brother schrieb:

    - Wenn die Revisionsnummer größer als 99 wird könnte es Probleme geben.

    warum könnte es da zu Problemen kommen? Kann sscanf keine dreistelligen Zahlen extrahieren?

    Hi ThiefMaster,

    ThiefMaster schrieb:

    Nimm doch atoi() bzw. strtoul(). Man parst Zahlen definitiv nicht händisch aus Strings raus...

    Aber um atoi() benuzen zu können, muss ich doch auch erst mal Anfang und Ende der Zahl bestimmen.?



  • Weil es zu eng im Array wird. Du legst ja die maximale Anzahl der Zeichen des Arrays hier fest:

    char revisionv[] = "$Revision: 20 $";
    

    In diesem Format ist kein Platz für eine dreistellige Zahl.



  • Zumindest für stroul reichts wenn du den Anfang kennst.


Log in to reply