sprintf, % und und eine Menge Ratlosigkeit



  • _matze schrieb:

    Bashar schrieb:

    Nicht ganz. Deine Variante ist die Lösung, wenn der Formatstring ein %-Zeichen enthält, das ausgegeben werden soll, statt als Formatierungszeichen interpretiert zu werden.

    Ja, war das nicht die Aufgabe?

    Nein, das Prozent steckt in strangething, nicht im Formatstring. Hast du das erste Posting überlesen?



  • Bei mir klappt ohne Probleme:

    Neolyth schrieb:

    int strangething = 0x25; 
    char buffer [50]; 
    sprintf(buffer,"Das hier klappt nicht:%c...",strangething); 
    printf("%s", buffer);
    


  • Soo, ich merk schon 🙂

    Aaaalso, feststellen, dass es irgendwo hakt tu ich bei der Ausgabe. Kurz und knapp, ich schicke dieses char-array an eine Funktion serial_output:

    void serial_output( char* format, ... )
    {
    	va_list arglist ;
    
    	va_start(arglist, format) ;
    
    	int start_index = end_index ;
    	int remaining = SERIAL_BUFFER_SIZE - start_index ;
    
    	if (remaining > 1)
    	{
    		int wrote = vsnprintf( (char*)(&serial_buffer[start_index]), (size_t)remaining, format, arglist) ;
    		end_index = start_index + wrote;
    	}
    
    	va_end(arglist);
    
    	return ;
    }
    

    Dann hab ich noch ein Interrupt, das von Zeit zu Zeit aufgerufen wird:

    void __attribute__((__interrupt__,__no_auto_psv__)) _U2TXInterrupt(void)
    {
    	indicate_loading_inter ;
    	interrupt_save_set_corcon ;
    
    	_U2TXIF = 0 ; // clear the interrupt 
    
    	int txchar = serial_callback_get_byte_to_send() ;
    
    	if ( txchar != -1 )
    	{
    		U2TXREG = (unsigned char)txchar ;
    	}
    
    	interrupt_restore_corcon ;
    	return ;
    }
    

    Und die dazugehörige serial_callback

    int serial_callback_get_byte_to_send(void)
    {
    	unsigned char txchar = serial_buffer[ sb_index++ ] ;
    
    	if ( txchar )
    		return txchar ;
    	}
    	else
    	{
    		sb_index = 0 ;
    		end_index = 0 ;
    	}
    
    	return -1;
    }
    

    Das geht dann über ein UART raus, auf der anderen Seite in mein Laptop rein. Da kuck ich dann mit hterm (oder ähnlichem) was ankommt, und dieses '%' ist nie dabei. Es ist auch kein Platzhalter da oder ähnliches, es scheint einfach so als ob sprintf dieses byte übergeht und beim nächsten weitermacht...

    Ich sollte vielleicht anmerken dass das alles natürlich nicht auf meinem Mist gewachsen ist, das ist zum Teil copy-paste aus der Microchip-Doku und andere Hilfestellungen.



  • Neolyth schrieb:

    Aaaalso, feststellen, dass es irgendwo hakt tu ich bei der Ausgabe. Kurz und knapp, ich schicke dieses char-array an eine Funktion serial_output:

    Ich seh jetzt nicht ganz eindeutig die Verbindung zu dem Problem. Versteh ich das richtig, du machst in etwa folgendes?

    int strange = '%';
    char buffer[50];
    sprintf(buffer, 'Achtung ein Prozent: %c', strange);
    serial_output(buffer);
    


  • Belli schrieb:

    Bei mir klappt ohne Probleme:

    Neolyth schrieb:

    int strangething = 0x25; 
    char buffer [50]; 
    sprintf(buffer,"Das hier klappt nicht:%c...",strangething); 
    printf("%s", buffer);
    

    Ja, wie gesagt, im Büro mit meinem schönen Standard-Compiler klappt das auch. Das macht es nicht gerade einfacher 😞



  • Compiler hin oder her.
    Neolyth, entscheiden ist doch machst du es so

    serial_out(buffer);
    

    oder so

    serial_out("%s", buffer);
    

    beantworte doch bitte einfach die Frage.
    Oder überleg dir selbst was der unterschied ist.



  • Ja, ehr, ich mache es so:

    serial_output(buffer);
    

    Was dann ja die schon erwähnte Funktion aufruft...



  • Neolyth schrieb:

    Ja, ehr, ich mache es so:

    serial_output(buffer);
    

    Was dann ja die schon erwähnte Funktion aufruft...

    Also ist das Prozentzeichen im Formatstring von vsnprintf und wird als Formatspecifier interpretiert. Wenn ich mich mal eben selbst zitieren dürfte:

    Ich tippe auf Betriebsblindheit bei dir. Vielleicht gibts du buffer mit printf(buffer) aus?

    Mach es entweder mit serial_output("%s", buffer) oder gleich serial_output("Ein tolles Prozentzeichen: %c", strangething) .



  • Und serial_output erwartet als ersten Parameter einen? Richtig: Format-String.
    Und ein Prozent im Format-String bedeutet was? Richtig: Es wird interpretiert.

    Also, wenn Du jetzt mit sprintf einen String zusammengesetzt hast, der im Ergebnis ein Prozentzeichen enthält, was passiert dann, wenn Du wiederum sprintf (hier serial_output) mit jenem Ergebnis als Formatstring aufrufst?



  • Neolyth schrieb:

    Ja, ehr, ich mache es so:

    serial_output(buffer);
    

    Was dann ja die schon erwähnte Funktion aufruft...

    Entschuldige bitte, aber wenn du das so machst sollte klar sein was mit dem Prozentzeichen passiert. Aber ach nein, der Compiler ist ja Schuld, und du bist der erste Mensch der nen Prozentzeichen ausgeben möchte...

    Nix für ungut 🤡



  • OMG!
    Natürlich, es ist so offensichtlich... Da muss ich mich ja fast schon für schämen!

    Vielen Dank, ich werde das gleich heute Nachmittag einem Praxistest unterziehen, aber so wie ich das sehe wird der wohl sehr erfolgreich verlaufen.

    Hey, Ihr seid echt super 🙂 Danke, das spart mir weitere endlose Stunden voll Kopfschmerzen.


Anmelden zum Antworten