Forum: Mikrocontroller und Digitale Elektronik malloc mit "for Schleife"


von Torsten B. (torty)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich versuche gerade mich in dynamische Datenverwaltung einzubasteln.

Mir gelingt es nicht, den malloc Befehl mit einer for-schleife zu 
verknüpfen.
Bitte werft doch mal einen Blick in das angehängte File und sagt mir, 
warum der obere Teil nicht das gleiche macht, wie der untere mit der 
Schleife.

Ich lasse es im Augenblick auf dem AVR Simulator des Studios 4.18 
laufen.

Könnte das auch ein Bug im Simulator sein ?

Danke
Torsten

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

>   for (i=0;i == MaxSatz ;i++)


Diese "Schleife" ist kaputt.

von Guru (Gast)


Lesenswert?

>Diese "Schleife" ist kaputt.

Eine alternative Formulierung wäre:

Mit der Bedingung i == MaxSatz wird die for-Schleife solange und nur 
dann ausgeführt, falls eben i den selben Wert hat wie MaxSatz. Da i aber 
schon mit 0 initialisiert wird, ist das nie der Fall.

Die Bedingung in der for-Schleife muss anders formuliert werden. Da das 
Grundlagen sind, empfehle ich Dir, auf eine einfache korrektur von uns 
zu verzichten und darüber in einem C-Buch Deiner Wahl (oder z.B. 
http://openbook.galileocomputing.de/c_von_a_bis_z/index.htm) 
nachzulesen, sonst lernst Du es nicht.

von U.R. Schmitt (Gast)


Lesenswert?

1
#define UART_MAXSTRLEN 84
2
#define MaxSatz 4
3
4
unsigned char i=0;
5
6
char uart_string[UART_MAXSTRLEN+1]
7
8
...
9
10
for (i=0;i == MaxSatz ;i++) 
11
{
12
  ptrString[i] = (char *) malloc(85);
13
  strcpy(ptrString[i],"String");
14
}
15
16
free(ptrString[0]);
17
free(ptrString[1]);
18
free(ptrString[2]);
19
free(ptrString[3]);
20
free(ptrString[4]);
21
  
22
23
while(1)
24
{
25
  
26
}
27
return 0;

Noch ein paar Anregungen:
1. Wenn du schon UART_MAXSTRLEN definierst, solltest du die Konstante 
auch beim malloc (mit +1) verwenden.
2. Wenn du den malloc in einer Schleife machst ist es durchaus sinnvoll 
das free auch in derselben Schleife zu machen
3. Dein return 0 wird nie erreicht weil du vorher eine Endlosschleife 
hast
4. Denk genau darüber nach wie oft eine Schleife durchlaufen wird wenn 
du schreibst "for (i=0; i<=ANZAHL, i++)" bzw. "for (i=0; i<ANZAHL, i++)"

Viel Erfolg, jeder hat mal angefangen, aber ein gutes C Buch (so aus 
Papier) ist auf jeden Fall die beste Basis, wenn du es auch liest.

von U.R. Schmitt (Gast)


Lesenswert?

Mist Edit: natürlich das free nicht in derselben Schleife, sondern in 
einer weiteren Schleife (dann wenn du den Speicher nicht mehr brauchst) 
und mit derselben Laufbedingung.

von Ralf (Gast)


Lesenswert?

Guru schrieb:
> Da das
> Grundlagen sind, empfehle ich Dir, auf eine einfache korrektur von uns
> zu verzichten und darüber in einem C-Buch Deiner Wahl (oder z.B.
> http://openbook.galileocomputing.de/c_von_a_bis_z/index.htm)
> nachzulesen, sonst lernst Du es nicht.

 ...

von Ralf (Gast)


Lesenswert?

Ach, ich sehe gerade: Gilt für beide!

von Lehrmann M. (ubimbo)


Lesenswert?

U.R. Schmitt schrieb:
> #define UART_MAXSTRLEN 84
> #define MaxSatz 4
>
> unsigned char i=0;
>
> char uart_string[UART_MAXSTRLEN+1]
>
> ...
>
> for (i=0;i == MaxSatz ;i++)
> {
>   ptrString[i] = (char *) malloc(85);
>   strcpy(ptrString[i],"String");
> }

Das passt genauso wenig.

Nochmal ganz langsam:

for(A;B;C){ ...

A wird beim ersten Aufruf der Schleife ausgeführt.
B wird zu Beginn eines jeden Durchlaufs überprüft. Falls der Wert 
false ist, wird die For-Schleife beendet
C wird am Ende eines jeden Durchlaufs ausgeführt.

nachdem MaxSatz gleich 4 ist ist die Bedingung i = MaxSatz nie erfüllt 
da 0 == 4 einfach 'false' ist.

von Torsten B. (torty)


Lesenswert?

auaaaaa wie peinlich !!
Eine For schleife sollte ich dennoch schon können.

mit "<=" geht es natürlich.

Danke an alle

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Im übrigen ist es in C gebräuchlicher, anstelle von
1
#define MaxSatz 4
2
3
char *ptrString[5];
4
5
for (i=0;i <= MaxSatz ;i++)
6
...

so vorzugehen:
1
#define MaxSatz 5
2
3
char *ptrString[MaxSatz];
4
5
for (i = 0; i < MaxSatz; i++)
6
...

Zwei Dinge also:

Wenn es schon eine Konstante gibt, die die Anzahl der Elemente 
beschreibt (MaxSatz), dann sollte diese Konstante auch bei der 
Deklaration des Array verwendet werden.

Ansonsten ist es üblich, bei Zählschleifen statt des höchsten noch in 
der Schleife liegenden Wertes den ersten nicht mehr in der Schleife 
liegenden Wert zu verwenden, der --der bei 0 beginnenden Zählweise sei's 
gedankt-- rein zufälligerweise der Anzahl der Schleifendurchläufe 
entspricht.

Klar, man könnte auch
1
#define MaxSatz 4
2
3
char *ptrString[MaxSatz + 1];
4
5
for (i = 0; i <= MaxSatz; i++)
6
...

schreiben, aber jeder geübte C-Programmierer wird bei einer Schleife, in 
der das Abbruchkriterium eine innenliegende Obergrenze enthält und auf 
ein Array zugegriffen wird, stutzig werden und irritiert nach der 
Arraydeklaration sehen.

Formell richtig sind beide Vorgehensweisen, aber was vom etablierten 
Standard abweicht, irritiert.

von U.R. Schmitt (Gast)


Lesenswert?

Lehrmann Michael schrieb:
> Das passt genauso wenig.
>
> Nochmal ganz langsam:

Hallo Michael,
das war der Auszug aus dem Code von Thorsten zur Veranschaulichung auf 
was sich meine Verbesserungsvorschläge beziehen.
Das hatte ich vergessen zu schreiben :-)

Wie notwendig die Vorschläge waren sieht man an:

Torsten B. schrieb:
> auaaaaa wie peinlich !!
> Eine For schleife sollte ich dennoch schon können.
>
> mit "<=" geht es natürlich.

Thorsten, WIE OFT WIRD die SCHLEIFE mit <= durchlaufen? Das habe ich 
dich oben schon gefragt.

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.