PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : switch in schleifen umwandeln



Debuger
24-01-2002, 08:45
kann das jemand mit schleifen machen?
eigentlich sollte mann ja nur die cas: erstzen durch if schleifen , aber das klappt bei mir nicht so.



#include <stdio.h>

int main(int argc, char *argv[]) {
FILE* quelldatei;
FILE* zieldatei;
int c;

switch(argc) {
long filepos;
case 2:
printf("1 Argument angegeben\n");

if((quelldatei=fopen(argv[1],"r")) == NULL){
printf("Konnte %s nicht oeffnen\n",quelldatei);
} // if

else {
printf("Datei %s wurde geoeffnet\n",quelldatei);

} // else

fseek(quelldatei, 0L, SEEK_END);
filepos = ftell(quelldatei);
while (filepos >= 0) {
fseek(quelldatei, filepos, SEEK_SET);
putc(getc(quelldatei), stdout);
filepos -= 1;
} // while

break;

case 3:
printf("2 Argumente angegeben\n");

quelldatei=fopen(argv[1],"r");
if(quelldatei==NULL) {
printf("Konnte Quelldatei %s nicht öffnen!\n",argv[1]);
} // if

if(quelldatei!=NULL) {
printf("Quelldatei: %s wurde geoeffnet\n",argv[1]);
} // if

zieldatei=fopen(argv[2],"w");
if(zieldatei==NULL) {
printf("Konnte Zieldatei %s nicht öffnen!\n",argv[2]);
} // if

if(zieldatei!=NULL) {
printf("Zieldatei: %s wurde geoeffnet\n",argv[2]);
} // if

fseek(quelldatei, 0L, SEEK_END);
filepos = ftell(quelldatei);
while (filepos >= 0) {
fseek(quelldatei, filepos, SEEK_SET);
putc(getc(quelldatei), zieldatei);
filepos -= 1;
} // while


printf("\nInhalt der Quelldatei wurde in die Zieldatei geschrieben\n");
break;

default:
printf("Fehler!!! Kein Argument angegeben\n");
printf("Weiter mit Enter-Taste\n");

fclose(quelldatei);
fclose(zieldatei);
getchar();
break;
} // switch

}

Debuger
24-01-2002, 08:46
es ist nicht php code sondern c.
hab nur nicht gewusst ob UBB-Code für C Code hier geht

kehj
24-01-2002, 09:01
Moin,

wo ist das Problem?
switch (argc){
case 2: ...
case 3: ...
default ...
}


Sollte mit

if (argc == 2) ...
if (argc == 3) ...
if (argc != 2 && argc!=3) ...

machbar sein. Aber warum willst du das so haben? Mit dem switch halte ich es für deutlich eleganter... :confused:

Debuger
24-01-2002, 09:12
weil ich nen blöden Lehrmeiser habe

Sellew
24-01-2002, 09:12
oh oh oh du musst noch bischen lernen. logisch das bei dir beide case in die hose gehen. probiers mal so:



#include <stdio.h>

int main(int argc, char *argv[]) {
FILE* quelldatei;
FILE* zieldatei;
int c;

switch(argc) {
long filepos;
case 2:
printf("1 Argument angegeben\n");

if((quelldatei=fopen(argv[1],"r")) == NULL){
printf("Konnte %s nicht oeffnen\n",quelldatei);
} // if

else {
printf("Datei %s wurde geoeffnet\n",quelldatei);

fseek(quelldatei, 0L, SEEK_END);
filepos = ftell(quelldatei);
while (filepos >= 0) {
fseek(quelldatei, filepos, SEEK_SET);
putc(getc(quelldatei), stdout);
filepos -= 1;
} // while
fclose(quelldatei);
} // else


break;

case 3:
printf("2 Argumente angegeben\n");

quelldatei=fopen(argv[1],"r");
if(quelldatei==NULL) {
printf("Konnte Quelldatei %s nicht öffnen!\n",argv[1]);
} // if
else{
printf("Quelldatei: %s wurde geoeffnet\n",argv[1]);
zieldatei=fopen(argv[2],"w");
if(zieldatei==NULL) {
printf("Konnte Zieldatei %s nicht öffnen!\n",argv[2]);
} // if
else{
printf("Zieldatei: %s wurde geoeffnet\n",argv[2]);
fseek(quelldatei, 0L, SEEK_END);
filepos = ftell(quelldatei);
while (filepos >= 0) {
fseek(quelldatei, filepos, SEEK_SET);
putc(getc(quelldatei), zieldatei);
filepos -= 1;
} // while
fclose(quelldatei);
fclose(zieldatei);
}//else
}//else

printf("\nInhalt der Quelldatei wurde in die Zieldatei geschrieben\n");
break;

default:
printf("Fehler!!! Kein Argument angegeben\n");
printf("Weiter mit Enter-Taste\n");

//sinnloses schließen da sie eh nicht offen waren.
//fclose(quelldatei);
//fclose(zieldatei);
//getchar();

break;
} // switch

}


du musst deine if's nur ordentlich schachteln und aufpassen wo du was schließt.

gruß.

Debuger
24-01-2002, 09:26
das mit den cases hat ja geklappt.
und mit de ifs auch.
hatte ne schleife zuviel bei mir

Sellew
24-01-2002, 09:46
hä?? also bei deinem obigen code kann es nicht geklappt haben. wenn er nämlich die datei nicht findet, gibt er zwar die ausschrift, geht dann aber trotzdem zur while schleife. du hast nämlich dort deine if's viel zu schnell geschlossen. probiers aus. er wird mit dem code crashen.

nu weiss ich auch was du wolltest, aber die lösung dazu hat ja kehj schon geschrieben.

gruß.

Debuger
24-01-2002, 10:05
das mit den Caces klappt bei mir Prima

kehj
24-01-2002, 11:12
Ich muß auch ehrlich sagen, daß ich den Code nur überflogen habe.
Zu Bugs kann ich nichts sagen. Generell würde ich da auch anders Modularisieren...

Egal, bei wem lernst du denn? Meine Abnehmer hätten mir so'ne if-Krücke um die Ohren gehauen ;)

Trotzdem noch viel Spaß!

P.S.: auf den 2. Blick muß ich auch sagen, daß du die if-Anweisungen zu früh zumachst. Hast du mal versucht, eine Datei anzugeben, die nicht existiert? Dann sollte das Programm gehörig crashen... (Das Dumme an C ist ja nur, daß es manchmal trotzdem funktioniert... :(

anda_skoa
24-01-2002, 11:32
Wenn du das switch(argc) durch ifs ersetzten willst, geht das so:


if (argc==2)
{
}
else if (argc==3)
{
}
else
{
}


Außerdem heißtes nicht if Schleife ;)
Eine Schleife wiederholt sich im Normalfall ja.
If ist eine Verzweigung, eine bedingte Verzweigung.

Ciao,
_

Pingu
24-01-2002, 11:35
Hi,

also am Programmierstil ist wirklich noch einiges zu pfeilen.

Ich hätte ganz am Anfang eine oder auch zwei kleine if Anweisungen genommen, ala:

if (argc > 1) {

... öffne quelldatei

} // if (argc > 1)
else {

.. zeige Fehlermeldung, z.B. auch für die richtige Bedienung des Programms.

exit (-1);

} // if (argc > 1)

if (argc == 3) {

... öffne zieldatei

} // if (argc == 3)
else
zieldatei = stdout;

.... mache alles was du willst


Denn die eine große switch-Anweisung für das bisseril Krimskrams macht das ganze ganz schön unubersichtlich, z.B. zwei mal wird die die Quelldatei geöffnet, zweimal ist der Code fürs einlesen da. Ich glaube das ist der Programmierstil von Bill's Leuten, Hauptsache viel Speicherplatz verbrauchen, auch wenn's nicht notwendig ist.

Gruß

-= Pingu =-

PS: Eine provokante Frage: Läßt Du eigentlich alles von uns machen, oder überlegst Du Dir auch was selber. Denn ich denke du sollst die Programmierung lernen? Aber hier im Forum kann ich die gesamte Programmentwicklung verfolgen: File Zeilenweise auslesen (http://www.linuxforen.de/forums/showthread.php?s=&threadid=22786)

Debuger
24-01-2002, 12:07
nö aber ich hab in der Firma niemanden der mir Hilft.
Wir sind ne 3 mann Firma und sehr unter Zeit druck.

Und PS. ich lerne viel schneller wenn ich ein fertiges Programm mit erklärung bekomme

Sellew
24-01-2002, 12:42
@Pingu

dein p.s. spricht mir aus der sele. wollte diese frage auch schon stellen, wollt aber nicht unhöfflich sein.


Original geschrieben von Debuger
Und PS. ich lerne viel schneller wenn ich ein fertiges Programm mit erklärung bekomme

wenn du meinst, ich kanns mir net so vorstellen, wenn ich selber was rausfinde lern ich a viel besser und b ich behalte es auch für später.

so gehts mir,aber zum glück sind nicht alle gleich.

übrigens rätsel ich immer noch warum dein prog bei einer nicht existierenden datei nicht crasht. zum glück ist kehj derselben meinung wie ich.

gruß.

Debuger
24-01-2002, 12:48
bei mir gehts zulange bis ich was heraus finde.

php hab ich auch durch fertige Scripts gelernt

Sellew
24-01-2002, 12:53
aha, wenn du php kannst, wieso machst du dann in c deine if's zu schnell zu?? soll kein angriff an deine programmierfähigkeiten sein, aber ich frage mich ob du das in php auch so machst??

wenn ja müssten auch dort deine progs crashen oder du testest nicht genug. den fehler sieht jeder beim hinschauen. das ist mir nur ein rätsel. glaub mir, arbeite ein tutorial durch und du verstehst das programmieren langsam von grund auf. egal welche sprache. wenn du das kannst, dann ist es leicht eine andere sprache zu verstehen. man muss aber die grundlagen verstehen und beherschen lernen.

dies ist nur ein tip am rande.

gruß.

Debuger
24-01-2002, 12:57
eigentlich kalppen alle php's von mir.

Wie soll ich ein Tutorial durchgehen wenn ich vom Lehrmeister Aufgaben bekommen die ich machen muss?

Hab halt nen Arsch als Lehrmeister

Sellew
24-01-2002, 13:01
hmm ganz einfach, setz dich zu hause hin. ist doch einfach oder??
ich mach das nur so und es gibt glaub ich viele andere die das auch so fabrizieren.

gruß.

Debuger
24-01-2002, 13:04
wenn du den ganzen Tag nur c machst und de Lehrmeister noch Druck macht, hab ich am abend echt keine Lust C zu lernen

Sellew
24-01-2002, 13:06
hast du schon mal dran gedacht dich mit dem lehrmeister zu unterhalten?? das es so nicht geht und so?? vielleicht hilft es.

gruß.

Debuger
24-01-2002, 13:24
also es ist so:
ich hatte zuerst ne Lehre als Systeminformatiker begonnen.
Nach inem halben Jahr wechselte ich die Lehre und mache seither Applikationsentwickler.

Im ersten halben Jahr hatten die anderen C und ich nicht.
Im Sommer habe ich ne Teil-LAP und muss c können.
deshalb muss ich jetzt so schnell wie möglich viel c lernen.

Und da wir ne kleine Firma sind und im Moment zeitdruck haben hat der Lehrmeister keine Zeit mir Sachen zu eklären darum schreibe ich hier so viel.

Und ich lernen nun mal schneller aus fertigen Scripts.

kehj
24-01-2002, 13:39
Original geschrieben von Sellew

übrigens rätsel ich immer noch warum dein prog bei einer nicht existierenden datei nicht crasht. zum glück ist kehj derselben meinung wie ich.


Ich kann sagen, daß es bei mir mit einem Speicherzugriffsfehler abschmiert. (wenn die Quelldatei nicht existiert)

Aber nochwas anderes: stellst du beim Kompilieren eigentlich die Warnungen ein?
Das mag ja sehr kleinkarriert klingen, aber da kommen doch 'ne Menge raus...
Zum Beispiel gibst du nichts am Ende von main() zurück... Habt ihr keine Programmierregeln in der Firma? Oder ist sowas allgemein nicht üblich?
Ich programmiere nun noch an der Uni, da ist der -Wall Schalter Pflicht.

Macht man das im "richtigen Leben" nicht mehr, hauptsache es läuft irgendwie?


Hast du mal im Netz nach Online-C-Kursen gesucht?

Debuger
24-01-2002, 13:56
ich bekomme keine Meldungen.

Ich code mit dem C++ von Bloodshed

Sellew
24-01-2002, 14:08
@kehj

der speicherzugriffsfehler ist ja auch absolut berechtigt.

und zu dienem -wall sag ich nur, manche sind kleinkarriert und manchen ist es halt rille, hauptsache es funzt. ich gehöre aber zu den kleinkarrierten.

gruß.

kehj
24-01-2002, 15:22
Bei uns in der Schule ist
gcc -Wall -ansi -pedantic angesagt

Bei einer Übungen (die auch in C programmiert wurde) hab ich nur //.. Kommentare geschrieben und bei der Abnahme festgestellt, daß das ca. 2 Seiten Warnings gab :eek:
Das war ein Schock :D Aber der Prüfer hat's locker genommen