Forum: Compiler & IDEs do While schleife


von andy (Gast)


Lesenswert?

Hallo,
Mit der do While schleife lese ich eine Datei von der SD-Card in einen 
puffer(site_puffer)ein.
Dieser ist aber nur 1500 byte gross, meine Datei aber grösser.

Meine überlegung ist erstmal count_a bis 1499 in den puffer zuschreiben 
und dann zusenden, dann count_a wieder auf null setzen und weiter in den 
puffer schreiben bis mein Ende zeichen kommt.

aber irgendwie haut das mit meiner if else abfrage nicht hin.

könnte mir da einer weiterhelfen

mfg
1
static char site_puffer[1500];
2
3
            do
4
             {
5
              res = f_read(&fsrc, &by,  1, &br);       // Daten lesen
6
         //site_puffer[count_a]=by;
7
              count_a++;
8
       
9
       //ist count_a = 1499 dann erstmal die daten senden
10
       if ((count_a == 1499))
11
        {
12
               PSOCK_SEND_STR(&s->sout,site_puffer);
13
         
14
         sprintf( read_write_buffer, "count_a:%d", count_a );
15
               DrawString(0,0,read_write_buffer,&Arial_16x25,WHITE,RED);            
16
        
17
         count_a = 0;
18
        }
19
         
20
       else
21
        {
22
          site_puffer[count_a]=by;
23
        }         
24
         
25
                
26
      }
27
              while ((by != '%'));

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Und Du meinst, dass irgendjemand Lust hat, sich Deinen hingerotzten 
Quellcode näher anzuschauen, wenn nicht einmal die Einrückungen stimmen?

von andy (Gast)


Lesenswert?

Andreas Schweigstill schrieb:
> Und Du meinst, dass irgendjemand Lust hat, sich Deinen
> hingerotzten
> Quellcode näher anzuschauen, wenn nicht einmal die Einrückungen stimmen?


ich habe Höflichst gefragt.
Und solch eine Aussage ist ja wohl unterstes Niveau
junge junge

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

andy schrieb:
> ich habe Höflichst gefragt.

In der deutschen Sprache wird eine Frage mit einem Fragezeichen 
abgeschlossen. Das hast Du nicht getan.

Und "aber irgendwie haut das mit meiner if else abfrage nicht hin." ist 
keine angemessene Fehlerbeschreibung.

von Daniel A. (daniel-a)


Lesenswert?

Dieser code veruhrsacht alptraume!

Ungetestet:
1
static char site_puffer[1500];
2
count_a=0;
3
bool run=1;
4
while(run) {
5
  res = f_read(&fsrc, &by,  1, &br);
6
  if(by=='%'||res<=0)
7
    run = 0;
8
  else
9
    site_puffer[count_a++] = by;
10
  if(count_a >= sizeof(site_puffer)-1 || !run){
11
    site_puffer[count_a] = 0;
12
    PSOCK_SEND_STR(&s->sout,site_puffer);
13
    sprintf( read_write_buffer, "count_a:%d", count_a );
14
    DrawString(0,0,read_write_buffer,&Arial_16x25,WHITE,RED);            
15
    count_a = 0;
16
  }
17
}

PS: Hier kann es noch zu einem Bufferoverflow bei read_write_buffer 
kommen...

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

site_puffer[0] wird nie beschrieben
und wenn der Puffer voll ist, wird das vorher empfangene Zeichen auch 
nicht abgespeichert.

von Jim (Gast)


Lesenswert?

hast Du mal in einem C Forum gefragt?
Da gibt es meist brauchbare Antworten oder im Roboternetz.de
Wenn Du glück hasst, weist Dich jemand auf Tippfehler hin :-) und auf 
unkorrektes Deutsch lol

von spontan (Gast)


Lesenswert?

Hallo Andy, was verstehst du an dem copy&paste-code nicht?

Von dir ist er ja wohl nicht.

Also: Problem beschreiben, Fragen stellen -> Antworten erhalten.

von Klaus W. (mfgkw)


Lesenswert?

andy schrieb:
> ich habe Höflichst gefragt.
> Und solch eine Aussage ist ja wohl unterstes Niveau
> junge junge

Er hat aber Recht.
Vielleicht gefällt dir der Ton nicht, aber inhaltlich gibt es nichts zu 
meckern - wenn dir jemand helfen soll, kann man wenigstens lesbaren 
Quelltext und eine ordentliche Beschreibung verlangen.

von foobar (Gast)


Lesenswert?

Ich hab ja den Verdacht, dass count_a nen Byte ist ...

von Joe F. (easylife)


Lesenswert?

a) sicher stellen, dass count_a mit 0 initialisiert ist
b) die von dir auskommentierte Stelle für "site_puffer[count_a] = by;" 
war schon richtig. Du willst ja den Buffer ab Index 0 füllen.
c) ich nehme stark an, du willst auch den Rest der Datei, der nach einem 
Vielfachen von 1499 bytes gelesen wurde abschicken -> "if ((count_a == 
1499) || (by == '%'))"
d) Ein String wird in C üblicherweise mit einem Nullbyte terminiert. 
Dies fehlt bei dir.

also so sollte es gehen:
1
static char site_puffer[1500];
2
3
count_a = 0;
4
5
do
6
{
7
  res = f_read(&fsrc, &by, 1, &br);       // Daten lesen
8
  site_puffer[count_a] = by;
9
  count_a++;
10
11
  // ist count_a = 1499 oder das Ende der Datei erreicht, Daten senden
12
  if ((count_a == 1499) || (by == '%'))
13
  {
14
    site_puffer[count_a] = 0; // terminate string
15
    
16
    PSOCK_SEND_STR(&s->sout, site_puffer);
17
    
18
    sprintf(read_write_buffer, "count_a:%d", count_a);
19
    DrawString(0, 0, read_write_buffer, &Arial_16x25, WHITE,RED);            
20
    
21
    count_a = 0;
22
  }
23
} while (by != '%');

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Und so läuft es vermutlich schneller:
1
static char site_buffer[1500];
2
char * delimiter;
3
4
do
5
{
6
  res = f_read(&fsrc, site_buffer, 1499, &br);       // Daten lesen
7
8
  site_buffer[br] = 0;  // kann sein, dass das überflüssig ist
9
  
10
  delimiter = strchr(site_buffer, '%');
11
  if (delimiter)
12
  {
13
    *delimiter = 0;      // truncate at delimiter position
14
    br = delimiter - site_buffer;  // calculate length of remaining bytes in buffer
15
  }
16
  PSOCK_SEND_STR(&s->sout, site_buffer);
17
  
18
  sprintf(read_write_buffer, "bytes read: %d\n", br);
19
  DrawString(0, 0, read_write_buffer, &Arial_16x25, WHITE,RED);            
20
} while ((br == 1499) && (delimiter == NULL));

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Steht das '%' eigentlich wirklich mitten im File, oder ist das das 
letzte Zeichen im File und du nimmst das als Hilfskonstruktion, weil du 
nicht wusstest, wie man das Ende des Files erkennt?
Wenn du das gesamte File übertragen willst, wirds natürlich einfacher. 
Dann kannst du dir die Suche nach dem '%' komplett sparen.

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.