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
>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.
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.
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.
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. ...
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.
auaaaaa wie peinlich !! Eine For schleife sollte ich dennoch schon können. mit "<=" geht es natürlich. Danke an alle
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.