Rekursion in c funzt nicht..



  • Hallo liebe Com,

    Bin dabei einen Algorythmus mit einem Programm, welches sich selbst, in bestimmte Ordner, kopiert und die Kopie startet, darzustellen.

    Hier ist der code, den Algorythmus-Teil habe ich entfernt..

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    int main()
    {
        int ch;
        int pos;
    
        int i2=0;
        char exe[30];
    
        char sbat[30] = "@echo off\nbeschreibenv0.exe";
        FILE *exep1, *exep2, *bat;
    
        mkdir("izi");//Erstelle einen Ordner
    
    do
        {
    
        bat = fopen("izi\\echo.bat", "wb");
        fprintf(bat,"%s",sbat);
        fclose(bat);
        sprintf(exe,"izi\\beschreibenv%i.exe",i2); 
    
        exep1 = fopen("beschreibenv0.exe", "rb");
    
        exep2 = fopen(exe, "wb");
    
        while((ch = fgetc(exep1)) != EOF)
        fputc(ch, exep2);
    
        fclose(exep1);
        fclose(exep2);
    
        i2++;
        }
    
    while(i2 <= 0);
    
    ShellExecute(NULL, "open", "izi\\echo.bat", NULL, NULL, SW_SHOW);
    
    return 0;
    
    }
    

    -------------------------------------------------------------------------------

    Dieses Programm erstellt 2 Dateien, beschreibenv0.exe und echo.bat, diese werden in einem neuen Unterverzeichnis gespeichert, name "izi".

    echo.bat soll lediglich die beschreibenv0.exe starten.

    beschreibenv0.exe wiederholt den vorgang und erstellt wieder ein Unterverzeichnis.

    -------------------------------------------------------------------------------

    Mein Problem:

    Das neu erstellte echo.bat Programm startet nicht die neue beschreibenv0.exe.

    Außer: Wenn es direkt vom User ausgeführt wird. 😕

    **Frage:

    Giebt es da Berechtigungs-Schwierigkeiten?

    Wenn ja wie handle ich diese?**

    PS: Vorsicht beim Ausführen ⚠
    Die echo.bat startet immer wieder für sekunden-bruchteile die cmd.



  • http://www.korrekturen.de/beliebte_fehler/algorythmus.shtml

    Ist auch vielleicht ein Komma-overkill.

    Und jetzt erklärst du mir mal bitte wo hier irgendeine Rekursion stattfindet.

    Ich hoffe du bist nicht eins von den kids, die trollen suuuuperlustig finden.



  • Danke EOP,

    habe Algorithmus bisher immer falsch geschrieben 🙂

    Aber wie kommst du auf komma-Overkill?
    Benutze kein float.

    https://de.wikipedia.org/wiki/Rekursion

    Als Rekursion (lateinisch recurrere ‚zurücklaufen‘) bezeichnet man in einem allgemeinen Sinn die Eigenschaft von Regeln, dass sie auf das Produkt, das sie erzeugen, von neuem angewandt werden können, wodurch potenziell unendliche Schleifen entstehen. In Mathematik, Logik und Informatik kann dies spezieller so ausgedrückt werden, dass eine Funktion in ihrer Definition selbst nochmals aufgerufen wird (rekursive Definition). Wenn man mehrere Funktionen durch wechselseitige Verwendung voneinander definiert, spricht man von wechselseitiger Rekursion.

    char sbat[30] = "@echo off\nbeschreibenv0.exe";
    
    bat = fopen("izi\\echo.bat", "wb");
        fprintf(bat,"%s",sbat);
        fclose(bat);
    
    exep1 = fopen("beschreibenv0.exe", "rb");
    
        exep2 = fopen(exe, "wb");
    
        while((ch = fgetc(exep1)) != EOF)
        fputc(ch, exep2);
    
        fclose(exep1);
        fclose(exep2);
    
    ShellExecute(NULL, "open", "izi\\echo.bat", NULL, NULL, SW_SHOW)
    


  • essio schrieb:

    Die echo.bat startet immer wieder für sekunden-bruchteile die cmd.

    Wie erklärst Du Dir das?



  • Das weiß ich nicht, ich habe eine identische version bei der es nicht so ist..



  • essio schrieb:

    Aber wie kommst du auf komma-Overkill?

    Bin dabei einen Algorithmus mit einem Programm, welches sich selbst in bestimmte Ordner kopiert und die Kopie startet, darzustellen.



  • essio schrieb:

    Das weiß ich nicht, ich habe eine identische version bei der es nicht so ist..

    Na, da in dem Code, den Du uns da präsentierst, nur ein einziger Aufruf der bat-Datei ist, und zwar unmittelbar, bevor das Programm zu Ende ist, schließe ich daraus, dass sehr wohl neue Instanzen des Programms gestartet werden.
    Wo sonst sollen die wiederholten echo.bat Aufrufe herkommen?
    Bau mal ein paar Debug-Hilfen ein, um das zu verifizieren.



  • Belli schrieb:

    essio schrieb:

    Das weiß ich nicht, ich habe eine identische version bei der es nicht so ist..

    Na, da in dem Code, den Du uns da präsentierst, nur ein einziger Aufruf der bat-Datei ist, und zwar unmittelbar, bevor das Programm zu Ende ist, schließe ich daraus, dass sehr wohl neue Instanzen des Programms gestartet werden.
    Wo sonst sollen die wiederholten echo.bat Aufrufe herkommen?
    Bau mal ein paar Debug-Hilfen ein, um das zu verifizieren.

    Das war nur ein kleiner Nebenbug..

    Das eigentliche Problem muss bei der Berechtigung des Programms liegen, habe schon 3 verschiedene Versionen geschrieben... Alle scheitern an diesem einen Punkt.



  • Also startet das oben gezeigte Programm doch nicht pausenlos eine neue echo.bat?



  • Belli schrieb:

    Also startet das oben gezeigte Programm doch nicht pausenlos eine neue echo.bat?

    Doch, das schon..

    Bei diesem Code ist das Problem besser einsehbar:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <windows.h>
    
    int main()
    {
    	int ch;
    	int pos;
    
    	int i2=0;
        char exe[30];
    
    	char sbat[30] = "@echo off\nbeschreibenv0.exe";
        FILE *exep1, *exep2, *bat;
    
    	mkdir("izi");
    
    do
    	{
    
    	bat = fopen("izi\\echo.bat", "wb");
    	fprintf(bat,"%s",sbat);
    	fclose(bat);
    	sprintf(exe,"izi\\beschreibenv%i.exe",i2);	
    
    	exep1 = fopen("beschreibenv0.exe", "rb");
    
        exep2 = fopen(exe, "wb");
    
    	while((ch = fgetc(exep1)) != EOF)
      	fputc(ch, exep2);
    
        fclose(exep1);
        fclose(exep2);
    
    	i2++;
    	}
    
    while(i2 <= 0);
    
    ShellExecute(NULL, "open", "izi\\beschreibenv0.exe", NULL, NULL, SW_SHOW);
    
    return 0;
    
    }
    

    1.Ein Ordner wird erstellt namens izi.
    2.exe kopiert sich hinein und erstellt die echo.bat.
    3.exe startet die exe im erstellten izi Ordner.

    // anders als be dem ersten Code, startet die exe ihre Kopie und nicht die //echo.bat, welche die Kopie startet.

    4.Nun sollte die exe wieder einen Unterordner erstellen and so on..

    Statt dessen startet sie, bleibt für Skunden und startet sich danach erneut, ohne irgendeine weitere "sichtbare" Aktion durchzuführen.

    Wie komme ich da weiter? 😕

    Ich bin recht frisch dabei, bitte um Verständnis.



  • Jo, deshalb schließe ich nach wie vor, der Aufruf funktioniert, der hat auch vorher schon mit der echo.bat funktioniert (wieso überhaupt starten über eine bat-Datei und nicht direkt, wie jetzt).
    Wie ich schon mal schrieb: Bau mal Ausgaben ein, die Dir den Programmverlauf zeigen. Prüf mal, ob mkdir überhaupt noch ein Verzeichnis anlegt.

    Vermutung:
    Das Programm arbeitet bei jedem Aufruf mit dem selben Working Directory, die zweite und alle folgenden Programminstanzen können also izi nicht mehr anlegen, weil es schon von der ersten Programminstanz angelegt wurde.

    Versuch mal:

    SetCurrentDirectory("izi");
    ShellExecute(NULL, "open", "izi\\beschreibenv0.exe", NULL, NULL, SW_SHOW);
    

    oder

    SetCurrentDirectory("izi");
    ShellExecute(NULL, "open", "beschreibenv0.exe", NULL, NULL, SW_SHOW);
    


  • Belli schrieb:

    Jo, deshalb schließe ich nach wie vor, der Aufruf funktioniert, der hat auch vorher schon mit der echo.bat funktioniert (wieso überhaupt starten über eine bat-Datei und nicht direkt, wie jetzt).

    Hab gedacht das würde mit cmd anders aussehen, dass ich so iwie den Fehler ausmerzen kann.

    Wie ich schon mal schrieb: Bau mal Ausgaben ein, die Dir den Programmverlauf zeigen. Prüf mal, ob mkdir überhaupt noch ein Verzeichnis anlegt.

    Ein 2tes izi-Verzeichnis wird nicht angelegt.

    Vermutung:
    Das Programm arbeitet bei jedem Aufruf mit dem selben Working Directory, die zweite und alle folgenden Programminstanzen können also izi nicht mehr anlegen, weil es schon von der ersten Programminstanz angelegt wurde.

    Daran könnte es liegen..

    Versuch mal:

    SetCurrentDirectory("izi");
    ShellExecute(NULL, "open", "izi\\beschreibenv0.exe", NULL, NULL, SW_SHOW);
    

    oder

    SetCurrentDirectory("izi");
    ShellExecute(NULL, "open", "beschreibenv0.exe", NULL, NULL, SW_SHOW);
    

    Gibt es da auch einen weg in C für?

    Danke 😃 , ich baue es ein, und melde mich in ein paar Tagen wieder, hab in den nächsten Tagen leider keine Zeit.



  • Danke es klappt jetzt 😃


Log in to reply