Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C] Erfolg prüfen ohne Rückgabewert (https://www.delphipraxis.net/106482-%5Bc%5D-erfolg-pruefen-ohne-rueckgabewert.html)

silver-moon-2000 11. Jan 2008 14:43


[C] Erfolg prüfen ohne Rückgabewert
 
Hallo zusammen,

wir müssen als Leistungsnachweis in Info ein kurzes Programm, welches sich um Pointer dreht, schreiben.
Dazu haben wir vom Prof. eine Methode bekommen, um Daten aus einer Textdatei in ein "Array of Pointer" einzulesen.
Code:
char *stringFeld[12][5]
Dummerweise sieht die Signatur dieser Methode so aus:
Code:
void createStringFeld(char *daten[12][5]);
soll heißen, sie hat keinen Rückgabewert, anhand dessen man überprüfen könnte, ob das stringFeld richtig befüllt wurde. Und wir dürfen auch die Methode nicht verändern (und z.B. einen Rückgabewert einbauen).

Die Methode an sich sieht so aus:
Code:
void createStringFeld(char *daten[12][5]){ 
   FILE *pFile = fopen("daten.txt", "r");
//   int zeilen=12; //Von mir Auskommentiert, da nicht verwendet
   int spalten=5;
   char file[20] = "Daten.txt";
   char zeichen[2];
   int i=0, zeile,spalte;
   char *zString =(char *) malloc(2*sizeof (char));
   zString[0] = '\0';
   if (!pFile) {
      printf(" Fehler beim Oeffnen der Datei %s\n", file);
      return;
//-> hier hätte ich sonst den RückgabeWert eingebaut
   }
   zeichen[1] = '\0';
   zeichen[0] = fgetc(pFile);
   while(!feof(pFile)){
      // evtl vorhandene Leerzeichen auslesen
      while(zeichen[0] == ' '|| zeichen[0] =='\n'){
         zeichen[0] = fgetc(pFile);
      }
      //printf("---> %c", zeichen[0]);
      while ((zeichen[0] != ' ' && zeichen[0] != '\n') && !feof(pFile)){
         zString = (char*)realloc(zString,strlen(zString)+ 2* sizeof (char));
         strncat(zString,zeichen,1);
         zeichen[0] = fgetc(pFile);
      }
      strcat(zString,"\0");
      zeile = (int) i/spalten;
      spalte = i%spalten;
      daten[zeile][spalte] = zString;
      i++;
      // zString neu initialisieren
      zString =(char *) malloc(2*sizeof (char));
      zString[0] = '\0';
   }
   fclose(pFile);
   return ;
}
Lange Einleitung, lange Frage...
Wie kann ich nun den Fehler abfangen, dass die Daten gar nicht eingelesen wurden (z.B. weil die Datei fehlt...).

Ich habe mir jetzt so beholfen (Ausschnitt aus der main Methode):
Code:
   createStringFeld(stringFeld);
   if (**stringFeld[0] != 'K') {
      printf("StringField not filled! Abort...");
      return EXIT_FAILURE;
   }
   ...
Da ich die Daten kenne und weiß, dass als erstes der Name "Kraemer" im stringFeld steht, teste ich eben zur Zeit, ob der erste char das "K" ist.

Sonderlich hübsch finde ich das nicht, bei meinem (sehr) begrenzten Wissen will mir aber nichts Schöneres einfallen.
Ich wäre also dankbar, wenn sich jemand diesen Codeschnipsel mal anschauen und mir sagen könnte, ob das so in Ordnung ist, was ich mache.

p.s. Da es sich hier ja um einen Leistungsnachweis handelt, den ich "allein" machen soll, bitte ich darum, dass mir hier keine Lösungen o.Ä. präsentiert werden, sondern "nur" Denkansätze, wie ich weiter vorgehen kann/soll.

p.p.s: warum ich in dieses Forum schreibe, und nicht in ein C/C++ Forum?
-> Weil ich weiß, dass Ihr kompetent genug seid :dp:
-> Weil ich kein C/C++ Forum kenne :wall:

Luckie 11. Jan 2008 14:48

Re: [C] Erfolg prüfen ohne Rückgabewert
 
Zitat:

Zitat von silver-moon-2000
-> Weil ich kein C/C++ Forum kenne :wall:

http://www.c-plusplus.de/forum/index.php Hätte man sicher auch mit Google gefunden.

silver-moon-2000 11. Jan 2008 16:10

Re: [C] Erfolg prüfen ohne Rückgabewert
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von silver-moon-2000
-> Weil ich kein C/C++ Forum kenne :wall:

http://www.c-plusplus.de/forum/index.php Hätte man sicher auch mit Google gefunden.

Hmm, ja, Du hast ja Recht. Und um ehrlich zu sein, ich habe nicht in Google gesucht, weil ich wusste, dass hier kompetente Leute sitzen. Da habe ich mir gedacht, wenn es ein Unterforum für andere Sprachen gibt, kann ich auch hier posten und "muss nicht" in ein anderes Forum wechseln.

Gruß und sorry
sm2k

JasonDX 11. Jan 2008 16:21

Re: [C] Erfolg prüfen ohne Rückgabewert
 
Eine Möglichkeit wäre, das erste Element des Arrays im Falle eines Fehlers auf NULL zu setzen. Damit könntest du Fehler in der Funktion entsprechend erkennen.

Aber warum allokierst du immer 2 Byte, obwohl du nur eins brauchst?
Code:
zString =(char *) malloc(2*sizeof (char));
zString[0] = '\0';

zString = (char*)realloc(zString,strlen(zString)+ 2* sizeof (char));
         strncat(zString,zeichen,1);
greetz
Mike

Der_Unwissende 11. Jan 2008 16:27

Re: [C] Erfolg prüfen ohne Rückgabewert
 
Gut, wenn Du das Forum nicht wechseln möchtest ist das ok, aber eigentlich solltest Du leicht auf die Lösung kommen.

An sich gibt es immer nur ein paar Möglichkeiten:

Das Einfachste ist, dass Du einfach nur einen String ausgibst, der auf den Fehler hinweißt. Das ist alles andere als schön, da die Programmarbeitung weitergeführt wird (und es dann eben auch zu "echten" Fehlern kommen kann).

Etwas besser ist dann schon der Weg, den Du jetzt gehen wolltest. An sich sollte aber klar sein, dass man nicht immer den Wert einer gültigen Belegung kennt. Da gibt es aber eine sehr gute Alternative, Du kannst einfach für den Fehlerfall einen Wert reseriveren, also z.B. ein konst. String, der mit Error beginnt. Am Besten kombinierst Du sowas noch, wenn Du ein Statisches Array verwendest, dann kannst Du z.B. in jede Zeile einen individuellen String stecken, der jeweils konstant ist. Die Wahrscheinlichkeit, dass genau diese Zeilen auch in einer Datei standen ist dann eher gering (aber nicht 0).

Noch besser (und auch sehr einfach) ist dann noch die Möglichkeit auf eine globale Variable zurückzugreifen. Die kannst Du einfach verwenden ohne dass Du die Signatur ändern musst und nun ja, der Rest dürfte dann klar sein.

Gruß Der Unwissende

silver-moon-2000 11. Jan 2008 17:36

Re: [C] Erfolg prüfen ohne Rückgabewert
 
Zitat:

Zitat von JasonDX
Eine Möglichkeit wäre, das erste Element des Arrays im Falle eines Fehlers auf NULL zu setzen. Damit könntest du Fehler in der Funktion entsprechend erkennen.

Aber warum allokierst du immer 2 Byte, obwohl du nur eins brauchst?
Code:
zString =(char *) malloc(2*sizeof (char));
zString[0] = '\0';

zString = (char*)realloc(zString,strlen(zString)+ 2* sizeof (char));
         strncat(zString,zeichen,1);

Es ist so, dass ich diese Methode nicht geschrieben habe, sondern sie wurde von unserem Professor bereit gestellt, soll heißen, er hat sie vermutlich selbst geschrieben.

Zitat:

Zitat von Der_Unwissende
Noch besser (und auch sehr einfach) ist dann noch die Möglichkeit auf eine globale Variable zurückzugreifen. Die kannst Du einfach verwenden ohne dass Du die Signatur ändern musst und nun ja, der Rest dürfte dann klar sein.

hmm, ja, das wäre eine wesentlich bessere Möglichkeit als die meinige. An so etwas "Einfaches" habe ich gar nicht gedacht, :oops:

Ich habe aber gerade nochmal mit dem Prof geredet und er meinte, das, was auf dem Aufgabenblatt stehe, müsse auch so bleiben. Soll heißen, nicht nur die Signaturen darf ich nicht ändern, auch in der Methode an sich darf ich nichts reinschreiben.
Mit Ausnahme des letzten Quellcode Kastens darf ich in meinem ersten Post also nix verändern.
Und das ist nun das Aus für globale Viariablen oder eine Vorbelegung meines Arrays, so wie ich es sehe.

Trotzdem vielen Dank für Eure Ratschläge und Tipps.

Gruß
sm2k

OlafSt 14. Jan 2008 12:34

Re: [C] Erfolg prüfen ohne Rückgabewert
 
Also das eine Vorbelegung des Arrays nun verboten ist, sehe ich nicht so. Eingangsparameter ist Eingangsparameter - was drin ist, spielt (noch) keine Rolex.

Ich würde das Array mit Nullen füllen - im Fehlerfalle ist es immer noch voller Nullen (ansonsten ist da Text oder ähnliches drin) und dies kann man abtesten.

Alternativ stellt sich die Frage: Kann so ein Fehlerfall auftreten, soll heißen, der Prof sorgt dafür, das die Datei stets existiert ? Dann brauchst auch kein Fehlerhandling machen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz