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