n Damen Problem



  • daniel.1983 schrieb:

    @Java-Progger

    Vielen Dank! (Denke wohl zu umständlich!)

    Nicht wenn du die Diagonal-Arrays selbst geschickt eliminierst 🕶

    http://www.ijon.de/comp/programme/damen/damen_de.html

    Liefert dir alle 92 Lösungen.



  • Du kennst dich nicht zufällig mit dll aus? Ich muss die Lösungen des Damenproblems mit Hilfe einer dll in eine Datei schreiben.

    Deklariert wird die Funktion im eigenen Header mit
    extern __declspec(dllimport) void save_sol(struct nqueen myqueen, int z);

    Hab ich da irgendwas falsch gemacht? (Manchmal funktionierts sogar!?!)
    Ach ja, template ist mit dev-c++ erstellt.

    dll.h:

    #include "myhead.h"
    #ifndef _DLL_H_
    #define _DLL_H_
    
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    
    DLLIMPORT void save_sol(struct nqueen myqueen,int z);
    
    #endif /* _DLL_H_ */
    

    dllmain.c:

    #include "dll.h"
    #include <windows.h>
    
    DLLIMPORT void save_sol(struct nqueen myqueen,int z)
    {
       int i, j;
       static int si = 0;
       FILE *pf;
       char *pname = myqueen.strfilename;                       
       char *ps[55];     
       pf = fopen(pname, "a");    
    
       if (myqueen.uinumbersolution && z == 2)
          {
          fprintf(pf, "\nLösung Nr.%d :\t", myqueen.uinumbersolution);
          }
    
       if (z == 0)                          //wird zu Begin aufgerufen
          {
          fprintf(pf, "\n\tLösungen für das n Damenproblem\n\n");
          fprintf(pf, "Legende : <Reihe,Spalte>\n");
          }
       else if (z == 1)                     //nach jedem Algorithmusaufruf
          {
          fprintf(pf, "\n\n\nBrettgroesse : %d x %d\n\n", myqueen.icurrentsize, myqueen.icurrentsize);
          }
       else if (z == 2)                     //schreiben der Lösungen in txt-Datei
          {
          for (i = 0; i <= myqueen.icurrentsize - 1; i++)
             {
             for (j = 0; j <= myqueen.icurrentsize - 1; j++)
                {
                if (myqueen.iboard[i][j] == 1)
                   {
                   fprintf(pf, "<%d,%d> ", i + 1, j + 1);
                   si++;
                   }          
                }
             } 
          }
       else if (z == 3)                    //nach Ende des Algorithmus
          {
          fprintf(pf, "\n\nAnzahl der Lösungen : %d", myqueen.uinumbersolution);
          if (myqueen.mode == DIRECTLY)
             {
             fprintf(pf, "\t\tbenötigte Zeit : %.4f s", (float) (myqueen.cend - myqueen.cbegin) / CLOCKS_PER_SEC);
             }
          }   
       fclose(pf);
    }
    
    BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                           DWORD reason        /* Reason this function is being called. */ ,
                           LPVOID reserved     /* Not used. */ )
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
    
          case DLL_PROCESS_DETACH:
            break;
    
          case DLL_THREAD_ATTACH:
            break;
    
          case DLL_THREAD_DETACH:
            break;
        }
    
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    


  • Hat sich bereits erledigt!

    Habe anstatt dem ganzen struct einzelne struct-Elemente an die dll übergeben, nun funktioniert es!

    Aber da wäre noch eine letzte Frage:

    Während des Algorithmus muss man abbrechen können. Wenn man aber mit getch() arbeitet, muss eine Eingabe erfolgen. Wie könnte ich das lösen, ohne auf eine Eingabe zu warten (aber mit e abbrechen)?



  • callbacks und kbhit (nicht ansi)



  • Und wie mache ich das mit callbacks? Habe in meinen Büchern nichts darüber gefunden!



  • wenn du noch nicht im netz gesucht hast, solltest du das jetzt tun.



  • c.rackwitz schrieb:

    callbacks und kbhit (nicht ansi)

    seit wann gehen 'callbacks' nicht in ansi-C ?



  • ten schrieb:

    seit wann gehen 'callbacks' nicht in ansi-C ?

    Seit wann ist "kbhit" Ansi-C? 🙄



  • LordJaxom schrieb:

    ten schrieb:

    seit wann gehen 'callbacks' nicht in ansi-C ?

    Seit wann ist "kbhit" Ansi-C? 🙄

    äääh, ok, missverständnis meinerseits 😞



  • Kannst du mir nicht einfach den Funktionsprototyp geben?



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-39320.html

    Es kommt aber darauf an, unter welchem BS
    und Compiler du arbeitest.

    Wie bereits gesagt, ist kbhit() kein ANSI-C



  • Danke für die Info! Hatte gedacht das kbhit() den jeweils direkten Wert aus dem Puffer ausliest. 🙄 Dass es kein ANSI C ist, ist in meinem Fall egal, soll nur unter XP laufen.

    Vielen Dank nochmal für deine Mithilfe! Melde mich wieder wenn ich mit Java angefangen hab 😃



  • Hallo Leute bin kein profi in c programmierung aber muss Ndamen problem schreiben und zwar habe ich jetzt ein Problem mit meiner calcnqueen funktion die funktion soll ja nur die damen auf dem schachbrett setzen mehr nichts. ich hab schon einiges ausprobiert kriege das nicht hin, kann mir da jemand vielleicht helfen. hier ist mein Code:

    #include "header.h"

    char calcnqueen(struct squeen *pt)
    {
    int irow = 0;
    int icol = 0;

    if((irow < 0) || (irow >= buh.boardsize))
    {
    puts("Fehler");
    f='e';
    }

    else
    {
    icol=0;
    }

    while(icol < buh.boardsize && f !='e')
    {
    if(isattacking()==true)
    {

    }

    else if(irow==buh.boardsize-1)
    {
    printf("Loesung gefunden");

    }

    else
    {
    f=calcnqueen(struct squeen *pt, row+1);
    }

    icol++;

    }

    return f;

    }

    😞


Anmelden zum Antworten