rätselhaftes Problem mit simpelster Initialisierungsfunktion



  • Hallo Community,

    da dies mein erster Beitrag hier ist, vll ersmal ein wenig allgemeines Bla-Bla:
    Ich habe mit leichtem Schmunzeln soeben den angepinnten Beitrag "RTFM!" gelesen. Normalerweise bin ich in einem Mopedforum aktiv, wo eben diese Problematik auch oft auftritt. Stichwort "Ich hab keine Ahnung von nix, will auch nix lernen, denkt ihr mal für mich..."
    Ich hoffe also, das ich euch jetzt hinreichend viel Iformation zukommen lasse, so dass ihr auch ein Bild von dem bekommt, was ich vorhabe.

    Ich habe in der Schule c/c++ gelernt, wobei sich c++ auf ein paar Klassenanwendungen am ende der 13 beschränkte. Sprich von c++ hab ich nicht viel Ahnung und benutze von daher normales c. Ich würde mein Level nicht allzu niedrig ansetzen, ich habe in der Oberstufe auch so Dinge wie Graphenalgorithmen, (vollst Baumsuche, kürzeste WEge, etc etc) kennen gelernt. Ich nutze zu Hause Bloodshed Dev C++ in der neusten Version unter XP SP2 und an der Uni Suse 10.1 mit GCC.

    Jetzt zum Projekt: Ich muss für ein Projekt eine Ampelsimulation erstellen. Was die genau tut lasse ich hier mal weg, weil für mein Problem unwichtig.
    In dem Code unten tritt folgendes "Problem" auf:
    Der letzte Parameter "Grüne Welle" wird einfach nicht eingelesen. Wenn ich das kompilierte Programm ausführe erscheint nur die letzte Frage, für eine Eingabe wird keine Zeit gelassen und der Rechner macht sofort mit der nächsten Ausgabe weiter. Dies passiert sowohl an der Uni wie auch zu Hause. Ich habe bereits ergebnislos folgendes probiert:
    - von darüberliegenden Ausgabe/Einlese Routinen die (funktionierenden) print und scan Befehle kopiert und nur den Text geändert. Keine Besserung
    - die Abfragesekton für "Grüne Welle" an eine andere Stelle verschoben um zu sehen ob es daran liegt, das dies die letzte Abfrage ist. Keine Änderung
    - Projektbetreuer gefragt. Es scheint so zu sein dass er noch weniger Ahnung hat als ich
    - C Script gewälzt. Meiner Ansicht nach müsste es funktionieren, aber offensichtlich liege ich da falsch 😉
    - wenn ich mir eine mini-Main schreibe, die nur die letzten beiden printf und scanf Befehle enthält, funktionierts
    - wenn ich mir eine etwas größere mini-Main schreibe die alle printf und scanf Befehle enthält funktinierts wieder nicht. Diese Version ist unten abgebildet

    Um folgendes gehts:

    #include <stdlib.h>
    #include <stdio.h>
    
    int main(){
          char fahrertyp;
          char grwelle;
          float strecke = 0;
          float v = 0;
          int AnzahlAmpelStart = 0;
    
          //Einlesen der gewuenschten Simulationskonfiguration
          printf("Start der Ampelsimulation. Bitte geben Sie die Parameter der Simulation ein:\n");
          printf("Welcher Fahrertyp ist gewuenscht (Normal = n, Raser = r)?\n");
          scanf("%c", &fahrertyp);
    	  printf(" TEST: %c\n", fahrertyp);
          printf("Wie lang soll die Strecke sein (Angabe in km)?\n");
          scanf("%f", &strecke);
    	  printf(" TEST: %f\n", strecke);
          printf("Wie hoch soll die zulaessige Hoechstgeschwindigkeit sein (km/h)\n");
          scanf("%f", &v);
    	  printf(" TEST: %f\n", v);
          printf("Wie viele Ampeln sollen sich auf der Strecke befinden?\n");
          scanf("%d", &AnzahlAmpelStart);
    	  printf(" TEST: %d\n", AnzahlAmpelStart);
          printf("Sollen die Ampeln in gruener Welle geschaltet sein? (j/n)\n");         
          scanf("%c", &grwelle);   // <-- Dieses scanf wird nicht ausgeführt!!
    	  printf(" FERTSCH\n");
    
    	  while (1){}
    }
    

    Der Code enthält auch noch die ganzen Test-Ausgaben, die mir sagen ob die Variable korrekt eingelesen wurde. Dies hatte ihc deshalb gemacht, weil in meiner Main direkt nach Aufruf der Init Funktion nochmals die soeben eingegebene Simulationskonfiguration ausgegeben wird. Und da sind alle Werte komischer Weise 0... Könnte das vll daran liegen, dass die Variablen nur innerhalb der Funktion verändert werden? Ich hab alle Parameterübergaben direkt gemacht. Sprich einfach die Variable in die Parameterliste geschrieben. Call by Value heißt das glaub ich. Könnte dieses 2te Problem gelöst werden, wenn ich alles auf Zeiger umbaue? (das wäre ja dann Call by Reference, oder?)
    Mit diesem Problem habe ich mich allerdings ehrlich gesagt noch ncit wirklich beschäftigt. Ich dachte nur wo ich hier eh schon umfangreiche Prosatexte verfasse kann ich da gleich mit fragen 😉

    Grüße an alle in Foren helfenden
    Carsten

    PS wenn einer von euch Schwalbe fährt und nicht weiter weiß: www.schwalbennest.de - da revanchiere ich mich dann!



  • Sorry für den Poppeldost, ich konnte nicht editieren und mri ist noch was eingefallen:

    -Keine Compilerfehlermeldungen
    - Ausgabe sieht so aus:

    ...
    Sollen die Ampeln in gruener Welle geschaltet sein? (j/n)
    FERTSCH





  • Herzlichen Dank! Bufferoverflow hört sich plausibel an. Ich habe die verlinkte Seite erst mal zu den Favoriten gepackt 😉
    Werde scanf gleich mal aus meinem Programm verbannen...


Anmelden zum Antworten