strlen() und __flash (Atmel Studio7)

Gast #4835558
Aus dem GCC-Tutorial:

Im Gegensatz zu progmem sind keine speziellen Bibliotheksfunktionen oder 
-makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable 
ist "normales" C.

Das funktioniert bei mir nicht:

strlen gibt nicht die korrekte Länge des Strings zurück.

sizeof gibt die korrekte Länge des Array zurück (Stringlänge plus 1).


Den Eintrag im Tutorial habe ich so verstanden, dass strlen als 
Bibliotheksfunktion das richtige Ergebnis zurückgeben sollte.

Wo liegt das Problem?

1
...
2
const __flash char s[] = "Irgendein Text";
3
...
4
c = strlen(s);
5
c = sizeof(s);
6
...
(Firma: RUB) #4835570
http://www.cplusplus.com/reference/cstring/strlen/
1
Returns the length of the C string str.
2

3
The length of a C string is determined by the terminating null-character:
4
A C string is as long as the number of characters between the beginning of
5
the string and the terminating null character (without including the
6
terminating null character itself).
7

8
This should not be confused with the size of the array that holds the string.
(Firma: RUB) #4835589
Einfach mal lesen...

strlen gibt die Laenge des C-Strings ohne Stringbegrenzer zurueck, 
sizeof gibt die Groesse des Arrays zurueck. Das sind verschiedene Dinge.
1
#include <stdio.h>
2
#include <string.h>
3

4
int main(int argc, char *argv[])
5
{
6
    char x[200] = "Hallo";
7

8
    printf("strlen: %i\n", strlen(x));
9
    printf("sizeof: %i\n", sizeof(x));
10

11
    return 0;
12
}
strlen gibt 5, sizeof 200 zurueck.
Der Unterschied sollte halbwegs offensichtlich sein.

Peter schrieb:
> strlen gibt nicht die korrekte Länge des Strings zurück.
>
> sizeof gibt die korrekte Länge des Array zurück (Stringlänge plus 1).
strlen gibt die korrekte Laenge des Strings zurueck, und sizeof die 
Laenge des Arrays. Wie in meinem Beispiel gezeigt, kann der String 
deutlich kuerzer sein als das Array.

Du musst schon wissen was du willst. Willst du die Laenge des Strings 
oder die Groesse des Arrays?
Gast #4835599
Kaj G. schrieb:
> Einfach mal lesen...
>
> strlen gibt die Laenge des C-Strings ohne Stringbegrenzer zurueck,

genau und er schreibt:

> strlen gibt nicht die korrekte Länge des Strings zurück.

scheinbar gibt es bei ihm ein bug - wenn es wirklich so ist.
Moderator #4835602
Peter schrieb:
> Aus dem GCC-Tutorial:
>
> Im Gegensatz zu progmem sind keine speziellen Bibliotheksfunktionen oder
> -makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable
> ist "normales" C.

Das betrifft nur das direkte Lesen solcher Variablen. Deswegen brauchst
du die Funktionen pgm_read_* nicht mehr. Wenn du aber einen Zeiger auf
eine Flash-Variable als Funktionsargument übergibst, klappt das nur,
wenn die Funktion so geschrieben ist, dass sie den Zeiger als Zeiger ins
Flash interpretiert und mit der entsprechenden Instruktion (LPM) darauf
zugreift. Für strlen ist dies aber nicht der Fall, deswegen musst du
nach wie vor strlen_P benutzen.

@Kai:

Es geht dem TE nicht um den Unterschied zwischen strlen und sizeof,
sondern wie man die Länge eines Strings im Flash bestimmt.
(Firma: RUB) #4835629
Yalu X. schrieb:
> Für strlen ist dies aber nicht der Fall, deswegen musst du
> nach wie vor strlen_P benutzen.
Unabhaengig davon, dass mir dieser Unterschied nicht bekannt war, habe 
ich den TO so verstanden, dass er erwartet, das strlen und sizeof das 
selbe Ergebnis liefern muessten.

Peter schrieb:
> strlen gibt nicht die korrekte Länge des Strings zurück.
Es waere hilfreicher, wenn man dazu schreibt, was strlen denn zurueck 
gibt und was man erwartet haette...
#4835679
Kaj G. schrieb:
> Unabhaengig davon, dass mir dieser Unterschied nicht bekannt war, habe
> ich den TO so verstanden, dass er erwartet, das strlen und sizeof das
> selbe Ergebnis liefern muessten.

Die Unkenntnis über diesen Unterschied hat dich das so verstehen lassen.

Die Beschreibung von Peter zeugt davon, dass ihm der Unterschied 
durchaus bekannt ist.

Peter schrieb:
> strlen gibt nicht die korrekte Länge des Strings zurück.
>
> sizeof gibt die korrekte Länge des Array zurück (Stringlänge plus 1).
#4836395
Yalu X. schrieb:
> Peter schrieb:
>> Aus dem GCC-Tutorial:
>>
>> Im Gegensatz zu progmem sind keine speziellen Bibliotheksfunktionen oder
>> -makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable
>> ist "normales" C.
>
> Das betrifft nur das direkte Lesen solcher Variablen. Deswegen brauchst
> du die Funktionen pgm_read_* nicht mehr. Wenn du aber einen Zeiger auf
> eine Flash-Variable als Funktionsargument übergibst, klappt das nur,
> wenn die Funktion so geschrieben ist, dass sie den Zeiger als Zeiger ins
> Flash interpretiert und mit der entsprechenden Instruktion (LPM) darauf
> zugreift. Für strlen ist dies aber nicht der Fall, deswegen musst du
> nach wie vor strlen_P benutzen.

Ich weiß, dass es hier um C geht! Trotzdem sei die Bemerkung erlaubt, 
dass man so etwas in C++ leicht vermeidet, indem man sich entsprechende 
Wrappertypen schreibt ... (allerdings gibt es nicht __flash-extension im 
g++ nicht und man muss mit PROGMEM arbeiten).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 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.