strlen() und __flash (Atmel Studio7)

Gast #4835558
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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?
Moderator #4835602
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren