sprintf funktioniert bei Tasks nicht??

OP #6158584
Guten Tag,

ich habe folgendes Problem und zwar wird alle 15 Sekunden eine Task 
aufgerufen. In der Task wird die Funktion sendeNachricht() aufgerufen 
und die Nachricht "SMS nicht aktiv" wird auf der Konsole ausgegeben. 
Wenn ich sprintf() in der Funktion sendeNachricht() verwende, hängt sich 
alles auf und der Task wird nicht mehr aufgerufen. Woran kann das 
liegen? Wenn ich sprintf in der main.c verwende funktionierts 
einwandfrei, jedoch in einer Task garnicht. Sobald ich sprintf aus der 
Funktion entferne funktioniert es wieder. Ich verwende IDE Atmel Studio 
und den Mikrocontroller ATSAMC21.
1
#include <stdio.h>
2

3
static void task_15s()
4
{
5
   while (1)
6
   {
7
        sendeNachricht();
8
        os_sleep(15000);
9
   }
10
}
11

12
void sendeNachricht( void )
13
{
14
      
15
   uint8_t SOC = 92;
16
   char text[10];  
17
   sprintf(text, "Zustand der Fahrzeugbatterie: Ladezustand(SOC) = %d %%",SOC);    
18

19
   io_write(edgb, (uint8_t *)"SMS nicht aktiv!!!\n", 19
20
}

Vielen Dank schon einmal für eure Antworten.

Grüße Max
Gast #6158614
Matthias S. schrieb:
> Stefan ⛄ F. schrieb:
>> Für wie wahrscheinlich hältst du den Fall, dass snprintf() fehlt?
>
> 50:50

Ich plädiere für maximal 1% Wahrscheinlichkeit. snprintf() gehört 
nämlich zum Standard C99 und wurde von allen mir bekannten C Compilern 
sogar sehr viel früher implementiert.
Gast #6158622
Stefan ⛄ F. schrieb:
> Ich plädiere für maximal 1% Wahrscheinlichkeit. snprintf() gehört
> nämlich zum Standard C99 und wurde von allen mir bekannten C Compilern
> sogar sehr viel früher implementiert.

Dann hattest Du offenbar noch nicht viel mit Windows zu tun.
Gast #6158638
Hmmm schrieb:
> Unter Windows gibt es ein C99-snprintf() erst seit Visual Studio 2015
> und der CRT von Windows 10.
> Davor gab es nur ein kaputtes _snprintf() und das MS-eigene *_s()-Zeug.

Was für ein Käse, echt? Ich hatte damals mit Borland Pascal, später 
Turbo Pascal programmiert.
Gast #6158661
Zumindest der gcc von Linux spuckt da eine dicke fette Warnung aus:
1
sfrings@stefanpc:~/Downloads$ gcc test.c
2
test.c: In function ‘main’:
3
test.c:8:24: warning: ‘Dieser Text ist zu lang’ directive writing 23 bytes into a region of size 10 [-Wformat-overflow=]
4
    8 |   sprintf(a,"Dieser Text ist zu lang");
5
      |              ~~~~~~~~~~^~~~~~~~~~~~~
6
test.c:8:3: note: ‘sprintf’ output 24 bytes into a destination of size 10
7
    8 |   sprintf(a,"Dieser Text ist zu lang");
8
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1
sfrings@stefanpc:~/Downloads$ gcc test.c
2
test.c: In function ‘main’:
3
test.c:8:35: warning: ‘Dieser Text ist zu lang’ directive output truncated writing 23 bytes into a region of size 10 [-Wformat-truncation=]
4
    8 |   snprintf(a,sizeof(a),"Dieser Text ist zu lang");
5
      |                         ~~~~~~~~~~^~~~~~~~~~~~~
6
test.c:8:3: note: ‘snprintf’ output 24 bytes into a destination of size 10
7
    8 |   snprintf(a,sizeof(a),"Dieser Text ist zu lang");
8
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sogar in bunt - neuerdings.
Gast #6158680
Stefan ⛄ F. schrieb:
> Zumindest der gcc von Linux spuckt da eine dicke fette Warnung aus

Yep, das werden wohl die meisten modernen Compiler so machen, genau wie 
die meisten Anfaenger Warnungen ignorieren, nicht sehen, nicht 
einschalten, Fehl interpretieren, usw.

leo
Gast #6158684
leo schrieb:
> die meisten Anfaenger Warnungen ignorieren, nicht sehen, nicht
> einschalten, Fehl interpretieren,

BTW mein Ex-Chef schaltete diese "sinnlosen" Warnungen immer aus, es hat 
ca. 2 Jahre gekostet, ihn vom Gegenteil zu ueberzeugen ...

leo

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.