Error: Unresolved external fallK(int*,int*,int*,char*,int*)...



  • Ich habe folgendes Programm mit 0 Fehlern compiliert. Es ergibt sich aber trotzdem ein Fehler (Error: Unresolved external fallK(int*,int*,int*,char*,int*) referenced from module verschluesselung) beim "Make". Kann mir da irgendjemand weiterhelfen?

    /********************************************************************************/
    /* verschluesselung.exe : Kodieren eines Wortes/Satzes mit bestimmtem Kode      */
    /* Projekt              : Praktikumsaufgabe 3                                   */
    /* Autor/in             : Christoph Gieritz (ESA)& Nils Papke (MT)              */
    /* Version              : 1.0                                                   */
    /* Datum                : 15.12.2007     letzte Aenderung am : 13.01.2008       */
    /* Beschreibung         : Dieses Programm verschlüsselt ein Wort/einen Satz mit */
    /*                        maximal 80 Zeichen. Zuerst wird eine                  */
    /*                        Buchstabenverschiebung um anzugebene Stellen          */
    /*                        vorgenommen. Danach wird das neue Wort/der neue Satz  */
    /*                        mittels Ein- und Auslesen in/aus ein(em) Feld         */
    /*                        nochmals chiffriert. Für die Entschlüsselung wird die */
    /*                        zugehörige Geheimzahl benötigt.                       */
    /* Compiler             : Borland C++ V 5.01                                    */
    /********************************************************************************/
    
    /* Testsatz:
       Ich lerne C !
       SoMm1*rx@*ov* 100305
    
       Kontrollsätze:
       Alles klar, Aufgabe bestanden!
       "rGQpJQ"XJZYXKFpLSPFIQGJFJSWpu 690310
    
       Erledigt, das war es!
       \dYV mbVmgon5Z75ZY5rn 850505
    
       Diese Aufgabe ist erledigt!
       Km0npn"0lhl/ziylls""lHpk1zp 070408
    
       Treffen im Landhaus um 19.00 Uhr! Freue mich auf Sie, James Bond
       {oYLQM"V#QVMISIEotGqRJRfoLoHJHn%o@ILpVEEREeIYQoYeYJIMWoIoWQo}o]o 680710 */
    
    /*Einfügen der Programmbibliotheken*/
    #include <stdio.h>    /*Programmbib. für Standardein- und -ausgabe einfügen*/
    #include <conio.h>    /*Programmbib. für Bildschirmausgabe einfügen*/
    #include <math.h>     /*Programmbib. für mathematische Funktionen einfügen*/
    #include <stddef.h>   /*Programmbib. für allgemeine Datentypen und Makros einfügen*/
    #include <string.h>   /*Programmbib. für Stringbenutzung einfügen*/
    #include "codechar.h" /*Programmbib. für Kodeumsetzung einfügen*/
    
    /* Konstantenvereinbarung mit define */
    #define FALSE 0
    #define TRUE  1
    
    /*Unterprogramm-Deklaration*/
    void fallK (int*,int*,int*, char*, int*);
    void fallD (void);
    void fallT (int,int,int,char,int);
    
    /*Definition der Unterprogramme*/
    /*Unterprogramm Fall K*/
    void fallK (int *pn, int *pspalten, int *pzeilen, char **pfeld2, int *ptest){
    
      /*Variablendeklaration für FallK*/
      char dummy[81];
      char eingabe[81];
      int zeichen;
      char feld[81];
      char feld2[81];
      int i;
      int arr[81];
      int laenge;
      int test;            /*Var. zur Testfeldspeicherung*/
      int n;
      int spalten;
      int zeilen;
    
      /*Einlesen des Eingabestrings*/
      printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n->");
      gets(eingabe);
    
      printf("\nKodierstufe 1: Zeichen um 0..%i Positionen Modulo",MAXSHIFT);
      printf("verschieben");
    
      /*Einlesen der Anzahl der Positionsverschiebungen (mit Verschiebungsbed.)*/
      printf("\nEingabe Anzahl der Schiebepositionen -> "); scanf ("%i", &n);
      if (n>89)
        { n=89; printf("Maximale Modulo-Verschiebung 89 Stellen"); }
      laenge = strlen(eingabe);
    
      /*Schleife für Moduloverschiebung*/
      for(i=0; i<laenge; i++) {
          zeichen = (int)eingabe[i];
          arr[i] = CodeTab[zeichen];
          arr[i] = ( arr[i] + n ) % CODECHARANZ;
          feld[i] = DecodeTab[arr[i]];
        }
    
      printf("\nErgebnis Kodierstufe 1: %d Zeichen\n->",i);
    
      /*Schleife für Ausgabe der Kodierstufe 1*/
      for (i=0;i<strlen(eingabe);i++) {
          printf("%c",(char)feld[i]);
        }
    
      printf("<-\n");
      printf("\nKodierstufe 2: Zeichen zeilenweise in Feld eintragen und ");
      printf("spaltenweise ausgeben.\n");
    
      /*Einlesen der Spaltenanzahl (mit Spaltenbedingungen)*/
      printf("Eingabe der Spaltenzahl (2..15) -> "); scanf( "%i", &spalten);
      if (spalten>15) { spalten=15; printf("Maximale Spaltenanzahl 15."); }
      if (spalten<2) { spalten=2; printf("Minimale Spaltenanzahl 2."); }
    
      /*Funktion zur Berechnung und Aufrundung der Zeilenanzahl*/
      zeilen = ceil((float)laenge / (float)spalten );
      printf("\nErgebnis Kodierstufe 2:     \tKodezahl (SchiftZeilenSpalten) : ");
    
      /*Ausgabe der Kodezahl (Zweistellige Ausgabe der Komponenten)*/
      printf("%02d%02d%02d\n",n,zeilen,spalten);
      printf("->");
    
      /*Schleife für Ausgabe und Speicherung des kodierten Wortes/Satzes*/
      for (i=0;i<spalten;i++) {
          zeichen = i;
          for (test=0; zeichen < laenge; test++ ) {
              printf("%c", (char)feld[zeichen]);
              feld2[test]=feld[zeichen];
              zeichen += spalten;
            }
        }
      printf("<-\n\n");
      printf("[return]"); gets(dummy);
    
      /*Übergabe der Werte*/
      *pn=n;
      *pspalten=spalten;
      *pzeilen=zeilen;
      **pfeld2=feld[zeichen];
      *ptest=zeichen;
    }
    
    /*Unterprogramm Fall D*/
    void fallD (void) {
      char dummy[81];
      char feld[81];
      char eingabe[81];
      int zeichen;
      int arr[81];
      int n;
      int laenge;
      int spalten;
      int zeilen;
      int counter;
      int counter2;
      int fillchar;
      int i;
    
      printf("\nDekodierung: Eingabe der Kodezahl (nnnnnn)\n->");
    
      /*Einlesen der Kodezahl*/
      scanf("%02d%02d%02d",&n,&zeilen,&spalten);
      gets(dummy);
    
      /*Einlesen des Eingabestrings*/
      printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n->");
      gets(eingabe);
    
      laenge = strlen(eingabe);
      printf("\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n->",laenge);
      counter = 0;
    
      /*Leerfeldanzahlbestimmung*/
      fillchar = laenge - (zeilen-1)*spalten;
    
      /*Schleife für Ausgabe der 2. Dekodierungsstufe*/
      for (i=0; i<zeilen; i++) {
          zeichen = i;
          counter2 = 1;
            while ( zeichen < laenge && counter < laenge && counter2 <= spalten ) {
                printf("%c", (char)eingabe[zeichen]);
                feld[counter] = (char)eingabe[zeichen];
                counter++;
                if ( counter2 > fillchar ) zeichen += zeilen-1;
                  else	zeichen += zeilen;
                      counter2++;
              }
        }
    
      /*Schleife für Moduloverschiebung*/
      for (i=0; i<laenge; i++) {
          arr[i] = CodeTab[feld[i]];
          arr[i] = ( CODECHARANZ + arr[i] - n ) % CODECHARANZ;
          feld[i] = DecodeTab[arr[i]];
        }
      printf("\n\nErgebnis Dekodierung Stufe 1:\n->");
    
      /*Schleife für Ausgabe der 1. Dekodierungsstufe*/
      for (int i=0;i<strlen(eingabe);i++) {
          printf("%c",(char)feld[i]);
        }
      printf("<-\n\n");
      printf("[return]");
    }
    
    /*Unterprogramm Fall T*/
    void fallT (int n, int spalten ,int zeilen, char *feld2, int test) {
      char eingabe[81];
      char feld[81];
      //unsigned char feld2[81];
      int zeichen;
      int arr[81];
      int laenge;
      int counter;
      int counter2;
      int i;
      int fillchar;
    
      printf("\nDekodierung: Testkodezahl (nnnnnn)\n->");
      printf("%02d%02d%02d\n\n",n,zeilen,spalten);
      printf("Zu dekodierender Testtext:\n->");
      gets(feld2);
      laenge = strlen(feld2);
      printf("\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n->",laenge);
      counter = 0;
    
      /*Leerfeldanzahlbestimmung*/
      fillchar = laenge - (zeilen-1)*spalten;
    
      /*Schleife für Ausgabe der 2. Dekodierungsstufe*/
      for (i=0; i<zeilen; i++) {
          zeichen = i;
          counter2 = 1;
            while ( zeichen < laenge && counter < laenge && counter2 <= spalten ) {
                printf("%c", (char)eingabe[zeichen]);
                feld[counter] = (char)feld2[test];
                counter++;
                if ( counter2 > fillchar ) zeichen += zeilen-1;
                  else	zeichen += zeilen;
                      counter2++;
              }
        }
    
      /*Schleife für Moduloverschiebung*/
      for (i=0; i<laenge; i++) {
          arr[i] = CodeTab[feld[i]];
          arr[i] = ( CODECHARANZ + arr[i] - n ) % CODECHARANZ;
          feld[i] = DecodeTab[arr[i]];
        }
      printf("\n\nErgebnis Dekodierung Stufe 1:\n->");
    
      /*Schleife für Ausgabe der 1. Dekodierungsstufe*/
      for (int i=0;i<strlen(eingabe);i++) {
          printf("%c",(char)feld[i]);
        }
      printf("<-\n\n");
      printf("[return]");
    }
    
    /*Initialisierung des Hauptprogramms*/
    int main (void) {
    
      /*Variablendeklaration*/
      char select;          /*Variable für Fallauswahl*/
      char dummy[81];       /*Var. für Eingabepufferleerung*/
      int zeilen;
      int spalten;
      int n;
      char feld2[81];
      int test;
    
      /*Eingabeschleife*/
      do {
        clrscr();  /*Bildschirm löschen*/
    
        /*Hauptausgabe*/
        printf("Top Secret --- Private Note Dekoder --- Top Secret   C.Gieritz, N.Papke\n");
        printf("=======================================================================\n\n");
        printf("Task: E-Ende  K-Kodieren  D-Dekodieren  T-Testdekodierung (nach K) -> ");
    
        /*Einlesen eines Buchstabens für Fallunterscheidung*/
        gets(dummy); select = dummy[0];
    
        /*Fallunterscheidung*/
        switch (select) {
          /*Fehlerfall*/
          default:
            printf("Fehler: Falsche Kode-Eingabe: %c \a [Return]", select);
            break;
          /*Fall für Programmende*/
          case 'E': case 'e':
    
            printf("Programmende [Return] \a");
            return 0;
            //break;
    
          /*Fall für Kodierung*/
          case 'K': case 'k':
            fallK(&n, &zeilen, &spalten, &feld2[0], &test);
            break;
    
          /*Fall für Dekodierung*/
          case 'D': case 'd':
    
            fallD();
            break;
    
          /*Fall für Testdekodierung*/
          case 'T': case 't':
    
            fallT(n, zeilen, spalten, feld2[0], test);
            break;
    
        };
    
        gets(dummy);
      } while( TRUE );
    
    }
    

    ////////////////////////////////////////////////////////////////////////////////
    Header-Datei: "codechar.h"

    /* codechar.h: Tabellen zur Kodierung und Dekodierung von ASCII-Zeichen
    
    1. Datei in das aktuelle Arbeitsverzeichnis kopieren
    2. Einbindung in den Quelltext: #include "codechar.h"
    
    Kodetabelle fuer die Umkodierung bestimmter ASCII-Zeichen
    ============================================================================
    0           1           2           3              Kodezahl
    0123456789  0123456789  0123456789  0123456789
    ABCDEFGHIJ  KLMNOPQRST  UVWXYZabcd  efghijklmn     ASCII-Zeichen
    ----------------------------------------------------------------------------
    4           5           6           7              Kodezahl
    0123456789  0123456789  0123456789  0123456789
    opqrstuvwx  yz01234567  89 .,:;!?"  +-*%/=$@&#     ASCII-Zeichen
    ----------------------------------------------------------------------------
    8           9                                      Kodezahl
    0123456789  0123456789
    |<>()[]{}\  ab Nr. 90 nicht beleg  t               ASCII-Zeichen
    ----------------------------------------------------------------------------
    erste  Kodenummer: 'A' = ASCII-Tabelle Nr. 65 --> Kodiertabelle Nr.  0
    letzte Kodenummer: '\' = ASCII-Tabelle Nr. 92 --> Kodiertabelle Nr. 89
    
    Alle restlichen Zeichen erhalten formal den Kode 255.
    Diese Zeichen duerfen im Eingabestring nicht vorkommen.
    
    Das Zeichen '~' wird als Fuellzeichen fuer die spaltenweise Ausgabe des
    Kodierfeldes festgelegt. Dieses Zeichen darf deswegen bei der Ergaenzung der
    Kodier- bzw. Dekodier-Tabellen nicht in den Zeichensatz aufgenommen werden.
    */
    #ifndef _CODECHAR                        /* .h-Datei nur einmal einfuegen */
    #define _CODECHAR
    
    #define CODECHARANZ 90                  /* Anzahl der kodierbaren Zeichen */
    #define MAXSHIFT  (CODECHARANZ-1) /* groesstmoegliche Zeichenverschiebung */
    
    #define FILLCHAR     '~'       /* Fuellzeichen fuer Kodierung, '~' = #126 */
    
    const unsigned char CodeTab[256] = {    /* CodeTab[ASCII-Nr.] -> Kode-Nr. */
      /*#000..#015*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#016..#031*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#032..#047*/  62, 67, 69, 79, 76, 73, 78,255, 83, 84, 72, 70, 64, 71, 63, 74,
      /*#048..#063*/  52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 65, 66, 81, 75, 82, 68,
      /*#064..#079*/  77,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
      /*#080..#095*/  15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 85, 89, 86,255,255,
      /*#096..#111*/ 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
      /*#112..#127*/  41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 87, 80, 88,255,255,
      /*#128..#143*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#144..#159*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#160..#175*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#176..#191*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#192..#207*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#208..#223*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#224..#239*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#240..#255*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    }; /* Tabelle zur Zeichenumkodierung */
    
    /*
    Dekodiertabelle zur Rueckkodierung der umkodierten und verschobenen Zeichen
    in den urspruenglichen ASCII-Kode
    */
    const unsigned char DecodeTab[] =     /* DecodeTab[Kode-Nr.] -> ASCII-Nr. */
      "ABCDEFGHIJ"   "KLMNOPQRST"   "UVWXYZabcd"   "efghijklmn"   "opqrstuvwx"
      "yz01234567"   "89 .,:;!?\""  "+-*%/=$@&#"   "|<>()[]{}\\";
    
    #endif
    


  • woot. kryptografie. mein lieblingsthema 🙂

    also du hast deklariert:

    void fallK (int*,int*,int*, char*, int*);
    

    aber definiert:

    void fallK (int *pn, int *pspalten, int *pzeilen, char **pfeld2, int *ptest)
    

    ändere deine deklaration dementsprechend nach

    void fallK (int*,int*,int*, char**, int*);
    

    edit: der fehler entsteht dadurch, dass der compiler dein deklariertes symbol
    automatisch als extern markiert, weil er keine implementation im aktuell zu
    kompilierenden modul findet. der linker will dann nicht, weil er es halt auch
    in anderen objektdateien nicht finden kann.
    das kompilieren selbst funktioniert, weil du die eigentliche funktions-
    definition vor dem aufruf in main() platziert hast.



  • Mit void fallK (int*,int*,int*, char**, int*); ergeben sich aber dann 2 Fehler! Das Programm ohne Unterprogramme (siehe unten) läuft einwandfrei.
    MfG Cit22

    /********************************************************************************/
    /* verschluesselung.exe : Kodieren eines Wortes/Satzes mit bestimmtem Kode      */
    /* Projekt              : Praktikumsaufgabe 3                                   */
    /* Autor/in             : Christoph Gieritz (ESA)& Nils Papke (MT)              */
    /* Version              : 1.0                                                   */
    /* Datum                : 15.12.2007     letzte Aenderung am : 05.01.2008       */
    /* Beschreibung         : Dieses Programm verschlüsselt ein Wort/einen Satz mit */
    /*                        maximal 80 Zeichen. Zuerst wird eine                  */
    /*                        Buchstabenverschiebung um anzugebene Stellen          */
    /*                        vorgenommen. Danach wird das neue Wort/der neue Satz  */
    /*                        mittels Ein- und Auslesen in/aus ein(em) Feld         */
    /*                        nochmals chiffriert. Für die Entschlüsselung wird die */
    /*                        zugehörige Geheimzahl benötigt.                       */
    /* Compiler             : Borland C++ V 5.01                                    */
    /********************************************************************************/
    
    /* Testsatz:
       Ich lerne C !
       SoMm1*rx@*ov* 100305
    
       Kontrollsätze:
       Alles klar, Aufgabe bestanden!
       "rGQpJQ"XJZYXKFpLSPFIQGJFJSWpu 690310
    
       Erledigt, das war es!
       \dYV mbVmgon5Z75ZY5rn 850505
    
       Diese Aufgabe ist erledigt!
       Km0npn"0lhl/ziylls""lHpk1zp 070408
    
       Treffen im Landhaus um 19.00 Uhr! Freue mich auf Sie, James Bond
       {oYLQM"V#QVMISIEotGqRJRfoLoHJHn%o@ILpVEEREeIYQoYeYJIMWoIoWQo}o]o 680710 */
    
    /*Einfügen der Programmbibliotheken*/
    #include <conio.h>    /*Programmbib. für Bildschirmausgabe einfügen*/
    #include <stdio.h>    /*Programmbib. für Standardein- und -ausgabe einfügen*/
    #include <math.h>     /*Programmbib. für mathematische Funktionen einfügen*/
    #include <stddef.h>   /*Programmbib. für allgemeine Datentypen und Makros einfügen*/
    #include <string.h>   /*Programmbib. für Stringbenutzung einfügen*/
    #include "codechar.h" /*Programmbib. für Kodeumsetzung einfügen*/
    
    /*Konstantenvereinbarung mit define*/
    #define FALSE 0
    #define TRUE  1
    
    /*Konstantenvereinbarung mit const*/
    const int codecharanz=90; /*Konstante für Kodeumsetzung*/
    const int maxshift=89;    /*Konstante für Maximalverschiebung*/
    
    /*Initialisierung des Hauptprogramms*/
    int main (void) {
    
      /*Variablendeklaration*/
      char   select;          /*Variable für Fallauswahl*/
      char   dummy[81];       /*Var. für Eingabepufferleerung*/
      int    Ende = FALSE;    /*Var. für Programmende*/
      char   eingabe[81];     /*Var. für Stringeingabe*/
      int    zeichen;         /*Var. für Zeicheneingabe/-verschiebung*/
      char   feld[81];        /*Var. zur Feldspeicherung*/
      char   feld2[81];       /*Var. zur Testfeldspeicherung*/
      int    i;               /*Var. für Schleifenerhöhung*/
      int    arr[81];         /*Var. zur Feldspeicherung*/
      int    n;               /*Var. für Modulo-Verschiebung*/
      int    laenge;          /*Var. zur Speicherung der Stringlänge*/
      int    spalten;         /*Var. zur Speicherung der Spaltenanzahl*/
      int    zeilen;          /*Var. zur Speicherung der Zeilenanzahl*/
      int    test;            /*Var. zur Testfeldspeicherung*/
      int    counter;         /*Var. für Schleifenerhöhung*/
      int    counter2;        /*Var. für Schleifenerhöhung*/
      int    fillchar;        /*Var. für Leerfelderkennung*/
    
      /*Eingabeschleife*/
      do {
        clrscr();  /*Bildschirm löschen*/
        /*Hauptausgabe*/
        printf("Top Secret --- Private Note Dekoder --- Top Secret   C.Gieritz, N.Papke\n");
        printf("=======================================================================\n\n");
        printf("Task: E-Ende  K-Kodieren  D-Dekodieren  T-Testdekodierung (nach K) -> ");
        /*Einlesen eines Buchstabens für Fallunterscheidung*/
        gets(dummy); select = dummy[0];
        /*Fallunterscheidung*/
        switch (select) {
          /*Fehlerfall*/
          default:
            printf("Fehler: Falsche Kode-Eingabe: %c \a [Return]", select);
            break;
          /*Fall für Programmende*/
          case 'E': case 'e':
            {
            printf("Programmende [Return] \a");
            Ende = TRUE;
            break;
            }
          /*Fall für Kodierung*/
          case 'K': case 'k':
            {
            printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n->");
            /*Einlesen des Eingabestrings*/
            gets(eingabe);
            printf("\nKodierstufe 1: Zeichen um 0..%i Positionen Modulo",maxshift);
            printf("verschieben");
            /*Einlesen der Anzahl der Positionsverschiebungen (mit Verschiebungsbed.)*/
            printf("\nEingabe Anzahl der Schiebepositionen -> "); scanf ("%i", &n);
            if (n>89) {n=89; printf("Maximale Modulo-Verschiebung 89 Stellen");}
            laenge = strlen(eingabe);
            /*Schleife für Moduloverschiebung*/
            for(i=0; i<laenge; i++) {
              zeichen = (int)eingabe[i];
              arr[i] = CodeTab[zeichen];
              arr[i] = ( arr[i] + n ) % codecharanz;
              feld[i] = DecodeTab[arr[i]];
            }
            printf("\nErgebnis Kodierstufe 1: %d Zeichen\n->",i);
            /*Schleife für Ausgabe der Kodierstufe 1*/
            for (i=0;i<strlen(eingabe);i++) {
              printf("%c",(char)feld[i]);
            }
            printf("<-\n");
            printf("\nKodierstufe 2: Zeichen zeilenweise in Feld eintragen und ");
            printf("spaltenweise ausgeben.\n");
            /*Einlesen der Spaltenanzahl (mit Spaltenbedingungen)*/
            printf("Eingabe der Spaltenzahl (2..15) -> "); scanf( "%i", &spalten);
            if (spalten>15) { spalten=15; printf("Maximale Spaltenanzahl 15."); }
            if (spalten<2) { spalten=2; printf("Minimale Spaltenanzahl 2."); }
            /*Funktion zur Berechnung und Aufrundung der Zeilenanzahl*/
            zeilen = ceil((float)laenge / (float)spalten );
            printf("\nErgebnis Kodierstufe 2:     \tKodezahl (SchiftZeilenSpalten) : ");
            /*Ausgabe der Kodezahl (Zweistellige Ausgabe der Komponenten)*/
            printf("%02d%02d%02d\n",n,zeilen,spalten);
            printf("->");
            test = 0;
            /*Schleife für Ausgabe und Speicherung des kodierten Wortes/Satzes*/
            for (i=0;i<spalten;i++) {
              zeichen = i;
          	   while ( zeichen < laenge ) {
              	  printf("%c", (char)feld[zeichen]);
                  feld2[test]=feld[zeichen];
                  test++;
                  zeichen += spalten;
                }
            }
            printf("<-\n\n");
            printf("[return]"); gets(dummy);
            break;
            }
          /*Fall für Dekodierung*/
          case 'D': case 'd':
          {
            printf("\nDekodierung: Eingabe der Kodezahl (nnnnnn)\n->");
            /*Einlesen der Kodezahl*/
            scanf("%02d%02d%02d",&n,&zeilen,&spalten);
            printf("\nEingabe des zu dekodierenden Textes\n->");
            gets(dummy);
            /*Einlesen des zu dekodierenden Textes*/
            gets(eingabe);
            laenge = strlen(eingabe);
            printf("\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n->",laenge);
            counter = 0;
            /*Leerfeldanzahlbestimmung*/
            fillchar = laenge - (zeilen-1)*spalten;
            /*Schleife für Ausgabe der 2. Dekodierungsstufe*/
            for (i=0;i<zeilen;i++) {
              zeichen = i;
              counter2 = 1;
          	   while ( zeichen < laenge && counter < laenge && counter2 <= spalten ) {
              	  printf("%c", (char)eingabe[zeichen]);
                  feld[counter] = (char)eingabe[zeichen];
                  counter++;
                  if ( counter2 > fillchar )
                  			zeichen += zeilen-1;
                    else	zeichen += zeilen;
                  counter2++;
                }
            }
            /*Schleife für Moduloverschiebung*/
            for(i=0; i<laenge; i++) {
              arr[i] = CodeTab[feld[i]];
              arr[i] = ( codecharanz + arr[i] - n ) % codecharanz;
              feld[i] = DecodeTab[arr[i]];
            }
            printf("\n\nErgebnis Dekodierung Stufe 1:\n->");
            /*Schleife für Ausgabe der 1. Dekodierungsstufe*/
            for (int i=0;i<strlen(eingabe);i++) {
              printf("%c",(char)feld[i]);
            }
            printf("<-\n\n");
            printf("[return]");
            break;
            }
          /*Fall für Testdekodierung*/
          case 'T': case 't':
          {
            printf("\nDekodierung: Testkodezahl (nnnnnn)\n->");
            printf("%02d%02d%02d\n\n",n,zeilen,spalten);
            printf("Zu dekodierender Testtext:\n->");
            for (i=0;i<strlen(eingabe);i++) {
              printf("%c",(char)feld2[i]);
            }
            printf("\n");
            laenge = strlen(eingabe);
            printf("\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n->",laenge);
            counter = 0;
            fillchar = laenge - (zeilen-1)*spalten;
            for (i=0;i<zeilen;i++) {
              zeichen = i;
              counter2 = 1;
          	   while ( zeichen < laenge && counter < laenge && counter2 <= spalten ) {
              	  printf("%c", (char)feld2[zeichen]);
                  feld[counter] = (char)feld2[zeichen];
                  counter++;
                  if ( counter2 > fillchar )
                  			zeichen += zeilen-1;
                    else	zeichen += zeilen;
                  counter2++;
                }
            }
            for(i=0; i<laenge; i++) {
              arr[i] = CodeTab[feld[i]];
              arr[i] = ( codecharanz + arr[i] - n ) % codecharanz;
              feld[i] = DecodeTab[arr[i]];
            }
            printf("\n\nErgebnis Dekodierung Stufe 1:\n->");
            for (int i=0;i<strlen(eingabe);i++) {
              printf("%c",(char)feld[i]);
              }
            printf("<-\n\n");
            printf("[return]");
            break;
            }
        };
        gets(dummy);
      } while( Ende == FALSE);
      return 0;
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    dazugehörige Headerdatei:
    /* codechar.h: Tabellen zur Kodierung und Dekodierung von ASCII-Zeichen
    
    1. Datei in das aktuelle Arbeitsverzeichnis kopieren
    2. Einbindung in den Quelltext: #include "codechar.h"
    
    Kodetabelle fuer die Umkodierung bestimmter ASCII-Zeichen
    ============================================================================
    0           1           2           3              Kodezahl
    0123456789  0123456789  0123456789  0123456789
    ABCDEFGHIJ  KLMNOPQRST  UVWXYZabcd  efghijklmn     ASCII-Zeichen
    ----------------------------------------------------------------------------
    4           5           6           7              Kodezahl
    0123456789  0123456789  0123456789  0123456789
    opqrstuvwx  yz01234567  89 .,:;!?"  +-*%/=$@&#     ASCII-Zeichen
    ----------------------------------------------------------------------------
    8           9                                      Kodezahl
    0123456789  0123456789
    |<>()[]{}\  ab Nr. 90 nicht beleg  t               ASCII-Zeichen
    ----------------------------------------------------------------------------
    erste  Kodenummer: 'A' = ASCII-Tabelle Nr. 65 --> Kodiertabelle Nr.  0
    letzte Kodenummer: '\' = ASCII-Tabelle Nr. 92 --> Kodiertabelle Nr. 89
    
    Alle restlichen Zeichen erhalten formal den Kode 255.
    Diese Zeichen duerfen im Eingabestring nicht vorkommen.
    
    Das Zeichen '~' wird als Fuellzeichen fuer die spaltenweise Ausgabe des
    Kodierfeldes festgelegt. Dieses Zeichen darf deswegen bei der Ergaenzung der
    Kodier- bzw. Dekodier-Tabellen nicht in den Zeichensatz aufgenommen werden.
    */
    #ifndef _CODECHAR                        /* .h-Datei nur einmal einfuegen */
    #define _CODECHAR
    
    #define CODECHARANZ 90                  /* Anzahl der kodierbaren Zeichen */
    #define MAXSHIFT  (CODECHARANZ-1) /* groesstmoegliche Zeichenverschiebung */
    
    #define FILLCHAR     '~'       /* Fuellzeichen fuer Kodierung, '~' = #126 */
    
    const unsigned char CodeTab[256] = {    /* CodeTab[ASCII-Nr.] -> Kode-Nr. */
      /*#000..#015*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#016..#031*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#032..#047*/  62, 67, 69, 79, 76, 73, 78,255, 83, 84, 72, 70, 64, 71, 63, 74,
      /*#048..#063*/  52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 65, 66, 81, 75, 82, 68,
      /*#064..#079*/  77,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
      /*#080..#095*/  15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 85, 89, 86,255,255,
      /*#096..#111*/ 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
      /*#112..#127*/  41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 87, 80, 88,255,255,
      /*#128..#143*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#144..#159*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#160..#175*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#176..#191*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#192..#207*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#208..#223*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#224..#239*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
      /*#240..#255*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    }; /* Tabelle zur Zeichenumkodierung */
    
    /*
    Dekodiertabelle zur Rueckkodierung der umkodierten und verschobenen Zeichen
    in den urspruenglichen ASCII-Kode
    */
    const unsigned char DecodeTab[] =     /* DecodeTab[Kode-Nr.] -> ASCII-Nr. */
      "ABCDEFGHIJ"   "KLMNOPQRST"   "UVWXYZabcd"   "efghijklmn"   "opqrstuvwx"
      "yz01234567"   "89 .,:;!?\""  "+-*%/=$@&#"   "|<>()[]{}\\";
    
    #endif
    


  • bitte editiere nochmal deinen post und packe den code in cpp tags - ich bekomme
    augenkrebs! 😃 desweiteren poste auch die fehler, die du bekommst. das
    beschleunigt das suchen 🙂



  • Als Fehler zeigt er nur 2 Stück an:
    1. Error: Unresolved external fallK(int*,int*,int*,char*,int*) referenced from module verschluesselung12345.cpp
    2. Error: Unresolved external fallT(int,int,int,char,int) referenced from module verschluesselung12345.cpp



  • Zeigt dein Borland-Compiler das auch an?



  • wenn du das als C code kompilierst, dann diese zeilen:

    for (int i=0;i<strlen(eingabe);i++) {
    

    mit

    for (i=0;i<strlen(eingabe);i++) {
    

    ersetzen. desweiteren auch die deklaration von fallT nach

    void fallT (int,int,int,char*,int);
    

    ändern.

    edit: nicht die definition der funktion ändern, sondern die deklaration,
    sowie schon in meinem ersten post gezeigt.

    ich nutze kein borland compiler 😃



  • Dann ergeben sich zu folgenden Zeilen folgende Fehler:

    fallK(&n, &zeilen, &spalten, &feld2[0], &test);
    

    Cannot convert 'char*' to 'char**' und type mismatch in parameter 4 in call to 'fallK'...

    fallT(n, zeilen, spalten, feld2[0], test);
    

    Cannot convert 'char*' to 'char**' und type mismatch in parameter 4 in call to 'fallK'...
    Dazu 'feld2' is declared but never used



  • also da war was komplett b0rken 😃 dieser code müsste funktionieren:

    /********************************************************************************/
    /* verschluesselung.exe : Kodieren eines Wortes/Satzes mit bestimmtem Kode      */
    /* Projekt              : Praktikumsaufgabe 3                                   */
    /* Autor/in             : Christoph Gieritz (ESA)& Nils Papke (MT)              */
    /* Version              : 1.0                                                   */
    /* Datum                : 15.12.2007     letzte Aenderung am : 13.01.2008       */
    /* Beschreibung         : Dieses Programm verschlüsselt ein Wort/einen Satz mit */
    /*                        maximal 80 Zeichen. Zuerst wird eine                  */
    /*                        Buchstabenverschiebung um anzugebene Stellen          */
    /*                        vorgenommen. Danach wird das neue Wort/der neue Satz  */
    /*                        mittels Ein- und Auslesen in/aus ein(em) Feld         */
    /*                        nochmals chiffriert. Für die Entschlüsselung wird die */
    /*                        zugehörige Geheimzahl benötigt.                       */
    /* Compiler             : Borland C++ V 5.01                                    */
    /********************************************************************************/
    
    /* Testsatz:
       Ich lerne C !
       SoMm1*rx@*ov* 100305
    
       Kontrollsätze:
       Alles klar, Aufgabe bestanden!
       "rGQpJQ"XJZYXKFpLSPFIQGJFJSWpu 690310
    
       Erledigt, das war es!
       \dYV mbVmgon5Z75ZY5rn 850505
    
       Diese Aufgabe ist erledigt!
       Km0npn"0lhl/ziylls""lHpk1zp 070408
    
       Treffen im Landhaus um 19.00 Uhr! Freue mich auf Sie, James Bond
       {oYLQM"V#QVMISIEotGqRJRfoLoHJHn%o@ILpVEEREeIYQoYeYJIMWoIoWQo}o]o 680710 */
    
    /*Einfügen der Programmbibliotheken*/
    #include <stdio.h>    /*Programmbib. für Standardein- und -ausgabe einfügen*/
    #include <conio.h>    /*Programmbib. für Bildschirmausgabe einfügen*/
    #include <math.h>     /*Programmbib. für mathematische Funktionen einfügen*/
    #include <stddef.h>   /*Programmbib. für allgemeine Datentypen und Makros einfügen*/
    #include <string.h>   /*Programmbib. für Stringbenutzung einfügen*/
    #include "codechar.h" /*Programmbib. für Kodeumsetzung einfügen*/
    
    /* Konstantenvereinbarung mit define */
    #define FALSE 0
    #define TRUE  1
    
    /*Unterprogramm-Deklaration*/
    void fallK (int*,int*,int*, char*, int*);
    void fallD (void);
    void fallT (int,int,int,char*,int);
    
    /*Definition der Unterprogramme*/
    /*Unterprogramm Fall K*/
    void fallK (int *pn, int *pspalten, int *pzeilen, char *pfeld2, int *ptest){
    
      /*Variablendeklaration für FallK*/
      char dummy[81];
      char eingabe[81];
      int zeichen;
      char feld[81];
      char feld2[81];
      int i;
      int arr[81];
      int laenge;
      int test;            /*Var. zur Testfeldspeicherung*/
      int n;
      int spalten;
      int zeilen;
    
      /*Einlesen des Eingabestrings*/
      printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n->");
      gets(eingabe);
    
      printf("\nKodierstufe 1: Zeichen um 0..%i Positionen Modulo",MAXSHIFT);
      printf("verschieben");
    
      /*Einlesen der Anzahl der Positionsverschiebungen (mit Verschiebungsbed.)*/
      printf("\nEingabe Anzahl der Schiebepositionen -> "); scanf ("%i", &n);
      if (n>89)
        { n=89; printf("Maximale Modulo-Verschiebung 89 Stellen"); }
      laenge = strlen(eingabe);
    
      /*Schleife für Moduloverschiebung*/
      for(i=0; i<laenge; i++) {
          zeichen = (int)eingabe[i];
          arr[i] = CodeTab[zeichen];
          arr[i] = ( arr[i] + n ) % CODECHARANZ;
          feld[i] = DecodeTab[arr[i]];
        }
    
      printf("\nErgebnis Kodierstufe 1: %d Zeichen\n->",i);
    
      /*Schleife für Ausgabe der Kodierstufe 1*/
      for (i=0;i<strlen(eingabe);i++) {
          printf("%c",(char)feld[i]);
        }
    
      printf("<-\n");
      printf("\nKodierstufe 2: Zeichen zeilenweise in Feld eintragen und ");
      printf("spaltenweise ausgeben.\n");
    
      /*Einlesen der Spaltenanzahl (mit Spaltenbedingungen)*/
      printf("Eingabe der Spaltenzahl (2..15) -> "); scanf( "%i", &spalten);
      if (spalten>15) { spalten=15; printf("Maximale Spaltenanzahl 15."); }
      if (spalten<2) { spalten=2; printf("Minimale Spaltenanzahl 2."); }
    
      /*Funktion zur Berechnung und Aufrundung der Zeilenanzahl*/
      zeilen = ceil((float)laenge / (float)spalten );
      printf("\nErgebnis Kodierstufe 2:     \tKodezahl (SchiftZeilenSpalten) : ");
    
      /*Ausgabe der Kodezahl (Zweistellige Ausgabe der Komponenten)*/
      printf("%02d%02d%02d\n",n,zeilen,spalten);
      printf("->");
    
      /*Schleife für Ausgabe und Speicherung des kodierten Wortes/Satzes*/
      for (i=0;i<spalten;i++) {
          zeichen = i;
          for (test=0; zeichen < laenge; test++ ) {
              printf("%c", (char)feld[zeichen]);
              feld2[test]=feld[zeichen];
              zeichen += spalten;
            }
        }
      printf("<-\n\n");
      printf("[return]"); gets(dummy);
    
      /*Übergabe der Werte*/
      *pn=n;
      *pspalten=spalten;
      *pzeilen=zeilen;
      *pfeld2=feld[zeichen];
      *ptest=zeichen;
    }
    
    /*Unterprogramm Fall D*/
    void fallD (void) {
      char dummy[81];
      char feld[81];
      char eingabe[81];
      int zeichen;
      int arr[81];
      int n;
      int laenge;
      int spalten;
      int zeilen;
      int counter;
      int counter2;
      int fillchar;
      int i;
    
      printf("\nDekodierung: Eingabe der Kodezahl (nnnnnn)\n->");
    
      /*Einlesen der Kodezahl*/
      scanf("%02d%02d%02d",&n,&zeilen,&spalten);
      gets(dummy);
    
      /*Einlesen des Eingabestrings*/
      printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n->");
      gets(eingabe);
    
      laenge = strlen(eingabe);
      printf("\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n->",laenge);
      counter = 0;
    
      /*Leerfeldanzahlbestimmung*/
      fillchar = laenge - (zeilen-1)*spalten;
    
      /*Schleife für Ausgabe der 2. Dekodierungsstufe*/
      for (i=0; i<zeilen; i++) {
          zeichen = i;
          counter2 = 1;
            while ( zeichen < laenge && counter < laenge && counter2 <= spalten ) {
                printf("%c", (char)eingabe[zeichen]);
                feld[counter] = (char)eingabe[zeichen];
                counter++;
                if ( counter2 > fillchar ) zeichen += zeilen-1;
                  else    zeichen += zeilen;
                      counter2++;
              }
        }
    
      /*Schleife für Moduloverschiebung*/
      for (i=0; i<laenge; i++) {
          arr[i] = CodeTab[feld[i]];
          arr[i] = ( CODECHARANZ + arr[i] - n ) % CODECHARANZ;
          feld[i] = DecodeTab[arr[i]];
        }
      printf("\n\nErgebnis Dekodierung Stufe 1:\n->");
    
      /*Schleife für Ausgabe der 1. Dekodierungsstufe*/
      for (i=0;i<strlen(eingabe);i++) {
          printf("%c",(char)feld[i]);
        }
      printf("<-\n\n");
      printf("[return]");
    }
    
    /*Unterprogramm Fall T*/
    void fallT (int n, int spalten ,int zeilen, char *feld2, int test) {
      char eingabe[81];
      char feld[81];
      //unsigned char feld2[81];
      int zeichen;
      int arr[81];
      int laenge;
      int counter;
      int counter2;
      int i;
      int fillchar;
    
      printf("\nDekodierung: Testkodezahl (nnnnnn)\n->");
      printf("%02d%02d%02d\n\n",n,zeilen,spalten);
      printf("Zu dekodierender Testtext:\n->");
      gets(feld2);
      laenge = strlen(feld2);
      printf("\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n->",laenge);
      counter = 0;
    
      /*Leerfeldanzahlbestimmung*/
      fillchar = laenge - (zeilen-1)*spalten;
    
      /*Schleife für Ausgabe der 2. Dekodierungsstufe*/
      for (i=0; i<zeilen; i++) {
          zeichen = i;
          counter2 = 1;
            while ( zeichen < laenge && counter < laenge && counter2 <= spalten ) {
                printf("%c", (char)eingabe[zeichen]);
                feld[counter] = (char)feld2[test];
                counter++;
                if ( counter2 > fillchar ) zeichen += zeilen-1;
                  else    zeichen += zeilen;
                      counter2++;
              }
        }
    
      /*Schleife für Moduloverschiebung*/
      for (i=0; i<laenge; i++) {
          arr[i] = CodeTab[feld[i]];
          arr[i] = ( CODECHARANZ + arr[i] - n ) % CODECHARANZ;
          feld[i] = DecodeTab[arr[i]];
        }
      printf("\n\nErgebnis Dekodierung Stufe 1:\n->");
    
      /*Schleife für Ausgabe der 1. Dekodierungsstufe*/
      for (i=0;i<strlen(eingabe);i++) {
          printf("%c",(char)feld[i]);
        }
      printf("<-\n\n");
      printf("[return]");
    }
    
    /*Initialisierung des Hauptprogramms*/
    int main (void) {
    
      /*Variablendeklaration*/
      char select;          /*Variable für Fallauswahl*/
      char dummy[81];       /*Var. für Eingabepufferleerung*/
      int zeilen;
      int spalten;
      int n;
      char feld2[81];
      int test;
    
      /*Eingabeschleife*/
      do {
        clrscr();  /*Bildschirm löschen*/
    
        /*Hauptausgabe*/
        printf("Top Secret --- Private Note Dekoder --- Top Secret   C.Gieritz, N.Papke\n");
        printf("=======================================================================\n\n");
        printf("Task: E-Ende  K-Kodieren  D-Dekodieren  T-Testdekodierung (nach K) -> ");
    
        /*Einlesen eines Buchstabens für Fallunterscheidung*/
        gets(dummy); select = dummy[0];
    
        /*Fallunterscheidung*/
        switch (select) {
          /*Fehlerfall*/
          default:
            printf("Fehler: Falsche Kode-Eingabe: %c \a [Return]", select);
            break;
          /*Fall für Programmende*/
          case 'E': case 'e':
    
            printf("Programmende [Return] \a");
            return 0;
            //break;
    
          /*Fall für Kodierung*/
          case 'K': case 'k':
            fallK(&n, &zeilen, &spalten, feld2, &test);
            break;
    
          /*Fall für Dekodierung*/
          case 'D': case 'd':
    
            fallD();
            break;
    
          /*Fall für Testdekodierung*/
          case 'T': case 't':
    
            fallT(n, zeilen, spalten, feld2, test);
            break;
    
        };
    
        gets(dummy);
      } while( TRUE );
    
    }
    

    beschäftige dich näher mit zeigern, und vor allem wie man programme debuggen kann 🙂



  • Leider übernimmt das Programm im FallT das in FallK gespeicherte Feld2 nicht für die Testdekodierung. Ich hab ja das Programm ohne Unterprogramme schon reingestellt. So sollte das Programm mit Unterprogramm auch funktionieren.
    MfG Cit22


Anmelden zum Antworten