Forum: Compiler & IDEs strlen() und __flash (Atmel Studio7)


von Peter (Gast)


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
...

von Kaj G. (Firma: RUB) (bloody)


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.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Kaj G. schrieb:
> Kaj G.
>           (Firma: RUB)

und was willst du uns damit sagen?

von Kaj G. (Firma: RUB) (bloody)


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?

von Peter II (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


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.

von Kaj G. (Firma: RUB) (bloody)


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...

von Peter (Gast)


Lesenswert?

@ Yalu

Vielen Dank für die Erklärung. Es funktioniert mit strlen_P.

von Dirk B. (dirkb2)


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).

von Wilhelm M. (wimalopaan)


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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.