AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [C] Erfolg prüfen ohne Rückgabewert

[C] Erfolg prüfen ohne Rückgabewert

Ein Thema von silver-moon-2000 · begonnen am 11. Jan 2008 · letzter Beitrag vom 14. Jan 2008
Antwort Antwort
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

[C] Erfolg prüfen ohne Rückgabewert

  Alt 11. Jan 2008, 15:43
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
-> Weil ich kein C/C++ Forum kenne
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 11. Jan 2008, 15:48
Zitat von silver-moon-2000:
-> Weil ich kein C/C++ Forum kenne
http://www.c-plusplus.de/forum/index.php Hätte man sicher auch mit Google gefunden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#3

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

  Alt 11. Jan 2008, 17:10
Zitat von Luckie:
Zitat von silver-moon-2000:
-> Weil ich kein C/C++ Forum kenne
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
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#4

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

  Alt 11. Jan 2008, 17:21
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

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

  Alt 11. Jan 2008, 17:27
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
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#6

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

  Alt 11. Jan 2008, 18:36
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 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,

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
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

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

  Alt 14. Jan 2008, 13:34
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...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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