Nichtaufgeloestes externes Symbol bzw. 1 unaufgeloeste externe Verweise



  • Hallo Ihrs.

    Da Ihr mir das letzte Mal helfen konntet frage ich euch nun ein zweites Mal.

    Hier ist mein Code:

    #include <stdio.h>									// Standardfunktionen Ein- und Ausgabe
    #include <conio.h>									// Standardfunktionen Tastatur und Bildschirm
    #include <ctype.h>									// toupperin
    #include <string.h>
    
    void einlesen();
    void codieren(char *,int);
    void ausgabe(char const *,int);
    
    int main (void)
    {													// main-Block Anfang
    
    	einlesen();
    
    	return 0 ;											// normales Ende
    }
    
    void einlesen ()
    {
    
    	/////////////////////////////////////////////////////////////////////////////////////////////////
    	/// Funktion einlesen()																		  ///
    	///																							  ///
    	/// Diese Funktion ließt den Inhalt einer beliebigen Datei aus und speichert diesen in dem    ///
    	/// Array "puffer". Anschließend wird die Funktion codieren aufgerufen und der Inhalt der     ///
    	/// eingelesenen Datei übergeben.															  ///
    	/////////////////////////////////////////////////////////////////////////////////////////////////
    
    	FILE *input;
    	char datei_name[20];
    	char puffer[500],c;										// Text auf 256 Zeichen beschränkt
    	int i=0,anzahl=0;
    
    	printf("Welche Datei soll eingelesen werden? \n");		//Eingabe des Dateinamens
    	scanf("%s", &datei_name);
    
    	input=fopen(datei_name,"r");
    
    	if (input==NULL)										// Fehlerausgabe falls Datei nicht vorhanden etc.
    	{
    		printf("Fehler beim Einlesen der Datei %c.",datei_name);
    	}
    	else		
    	{
    		while ((c=fgetc(input))!=EOF)						// Zeichenweises Einlesen der Datei in den Array "puffer"
    		{
    			puffer[i++]=c;
    			anzahl++;
    		}
    
    		puffer[i]='\0';										// Makierung des Endes des Arrays
    
    		fclose(input);
    	}
    
    	codieren(puffer, anzahl);								// Aufruf der Funktion zum Codieren des Textes
    }
    
    void codieren(char *puffer, int anzahl)
    {
    
    	/////////////////////////////////////////////////////////////////////////////////////////////////
    	/// Funktion codieren()																		  ///
    	///																							  ///
    	/// Grundlage dieser Funktion bilden die 2 konstanten Arrays "mors_alph" und "mors_alph_cod". ///
    	/// Im 1ten befinden sich die Buchstaben und im 2ten die dazugehörige Codeworte. Anhand des	  ///
    	/// zum Buchstaben passenden Index wird das Codewort ermittelt und in einem neuen Array		  ///
    	/// "puffer_codiert" gespeichert.															  ///
    	/////////////////////////////////////////////////////////////////////////////////////////////////
    
    	int i=0,n=0,helfer=0;
    	char const mors_alph[41]={' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','"','§','$','%','&','/','(',')','=','Ä','Ö','Ü','?'};
    	char const *mors_alph_cod[41]={"2","10","0111","0101","011","1","1101","001","1111","11","1000","010","1011","00","01","000","1001","0010","101","111","0","110","1110","100","0110","0100","0011","10000","11000","11100","11110","11111","01111","00111","00011","00001","00000","1010","0001","1100","1110011"};  //kein int-Zeiger da Werte mit vorangestellter 0 als Oktalzahl gewertet werden;ein Zeiger da der Array ebenfalls aus Strings (Array) besteht; 1 bedeutet kurzer, 0 bedeutet Langer Piepser,2 nedeutet neues Wort
    	char const *puffer_codiert[500];
    
    	printf("\n\n");
    	for (i=0;i<anzahl;i++)
    	{
    
    		helfer=0;																					// Überprüfung ob ein falsches Zeichen eingegeben wurde
    		for(n=0;n<=41;n++)																			// Alle Buchstaben werden in GROSSBUCHSTABEN, alle Ziffer in die dazugehörigen Symbole verwandelt
    		{
    			if ( (toupper(puffer[i])) == mors_alph[n] )												// Überprüfung ob der "vergrößerte" Buchstabe einer Ziffer des mors_alph-Arrays entspricht
    			{																						// Bei Übereinstimmung wird der Eintrag des Codewort-Arrays(mors_alph_cod) mit dem gleichen Index wie derBuchstabenarrays
    				puffer_codiert[i]=mors_alph_cod[n];					
    				helfer=1;
    			}
    		}
    
    		if(helfer==0) printf("\n Fehler an der Stelle %i mit dem Zeichen %c!",i,puffer[i]);			// Fehlerausgabe falls ein falscher Buchstabe eingegeben wurde
    	}
    
    	/* DEBUG
    	for(i=0;i<anzahl;i++)
    	{
    		printf("\n %c \t %s",puffer[i],puffer_codiert[i]);
    	}
    	*/
    
    	ausgabe(*puffer_codiert,anzahl);
    
    }
    
    void ausgabe(char const *puffer_codiert[500],int anzahl)
    {
    	char puffer_codiert_teiler[10];
    	int i=0,n=0,helfer=0;
    	printf("\n\n");
    
    	for(i=0;i<anzahl;i++)
    	{
    		strcpy(puffer_codiert_teiler,puffer_codiert[i]);
    
    		helfer=strlen(puffer_codiert_teiler);
    
    		for(n=0;n<helfer;n++)
    		{	
    			switch(puffer_codiert_teiler[n])
    			{
    			case '1':printf(".") ;break;
    			case '0':printf("-") ;break;
    			case '2':printf(" ") ;break;
    			default:printf("Fehler");
    			}
    			//printf("\n \n n : %i \t helfer : %i",n,helfer);
    
    		}
    
    	}
    }
    

    Wenn ich diesen kompiliere erscheinen weder Fehler noch Warnungen. Führe ich das Programm allerdings aus meldet der Linker 2 Probleme.

    --------------------Konfiguration: main - Win32 Debug--------------------
    Linker-Vorgang läuft...
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl ausgabe(char const *,int)" (?ausgabe@@YAXPBDH@Z)
    Debug/main.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.
    
    main.exe - 2 Fehler, 0 Warnung(en)
    

    Habt ihr ne Ahnung woran das liegen kann. Hab den Fehler schon in vielen Variationen gegoogelt und auch die Boardsuche hier brachte nichts. Würde mich freuen wenn ihr neLösung findet.

    MfG
    Tarquinio



  • void ausgabe(char const *,int);
    
    //...
    
    void ausgabe(char const *puffer_codiert[500],int anzahl)
    {
      ...
    }
    

    Du deklarierst eine Funktion, die einen char* und einen int erwartet und definierst dann eine, die ein char*-Array und einen int bekommen soll (und da du offenbar einen C++ Compiler verwendest, schluckt der das und legt dir zwei Überladungen von 'ausgabe()' an). Die Lösung ist ganz einfach: das [500] in der Definition ist zu viel (bzw. fehlt in der Deklaration).



  • Danke, das ging schnell.

    Wenn ich die Längenangabe "[500]" weglasse kommt eine neue Fehlermeldung mit der ich mich schon vorher lange rumgeschlagen hab.

    Hier mein aktualisierter Code:

    void ausgabe(char const *puffer_codiert,int anzahl)
    {
    	char puffer_codiert_teiler[10];
    	int i=0,n=0,helfer=0;
    	printf("\n\n");
    
    	for(i=0;i<anzahl;i++)
    	{
    		strcpy(puffer_codiert_teiler,puffer_codiert[i]);
    		helfer=strlen(puffer_codiert_teiler);
    
    		for(n=0;n<helfer;n++)
    		{	
    			switch(puffer_codiert_teiler[n])
    			{
    			case '1':printf(".") ;break;
    			case '0':printf("-") ;break;
    			case '2':printf(" ") ;break;
    			default:printf("Fehler");
    			}
    			//printf("\n \n n : %i \t helfer : %i",n,helfer);
    
    		}
    
    	}
    }
    

    Gibt die Fehlermeldung:

    D:\Studium\Projekte\Morsen in C\morsen_in_c\main.cpp(126) : error C2664: 'strcpy' : Konvertierung des Parameters 2 von 'const char' in 'const char *' nicht moeglich
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Fehler beim Ausführen von cl.exe.

    Das macht einen schon irgendwie kirre.

    By the way: Gibts ne Bibliotheksfunktion die die Ausgabe von .wave Dateien ermöglicht? Oder kann ich den Ton \a länger bzw. kürzer ertönen lassen?



  • Was genau soll denn die Funktion übergeben bekommen? Wenn du dort tatsächlich ein Array von Strings benötigst, ist vermutlich nicht die Definition falsch, sondern der Prototyp.

    @Wave's: Im C-Standard gibt es da nichts. Aber je nach Betriebssystem könntest du etwas finden (in der WinAPI z.B. PlaySound()).



  • @Tarquinio: veruchs mal so:

    void ausgabe(char const **puffer_codiert,int anzahl)
    {
        char puffer_codiert_teiler[10];
        int i=0,n=0,helfer=0;
        printf("\n\n");
    
        for(i=0;i<anzahl;i++)
        {
            strcpy(puffer_codiert_teiler,puffer_codiert[i]);
            helfer=strlen(puffer_codiert_teiler);
    
            ...
        }
    }
    

    Was ich mich frage, ist warum die C Code in einem C++ Programm benutzt, bzw. warum du den C Code mit einem C++ Compiler kompilierst. Wenn du schon C++ benutzt, benutze doch std::string, oder std::list für die String Arrays, usw.



  • CStoll schrieb:

    Was genau soll denn die Funktion übergeben bekommen? Wenn du dort tatsächlich ein Array von Strings benötigst, ist vermutlich nicht die Definition falsch, sondern der Prototyp.

    @Wave's: Im C-Standard gibt es da nichts. Aber je nach Betriebssystem könntest du etwas finden (in der WinAPI z.B. PlaySound()).

    In meinem ersten Beitrag kannstes dir genauer anschauen. Es wird ein Zeiger auf den Array puffer_codiert und die Anzahl der Felder übergeben.

    ausgabe(*puffer_codiert,anzahl);
    

    @supertux:

    Wenn ich deinen Codenehme kommt der gleiche Fehler wie in meinem ersten Beitrag.
    Der switch vergleich hatte aber blendend funktioniert. Ich benutze das Microsoft Visual Studio 6 und hab leider keine Ahnung wie ich da nen C Compiler benutzen kann.



  • Du übergibst dort lediglich den ersten String deines Arrays und nicht das gesamte Array. Das heißt, beim Aufruf ist das Sternchen zu viel - und beim Prototyp mußt du angeben, daß du ein Array übergeben willst.



  • CStoll schrieb:

    und beim Prototyp mußt du angeben, daß du ein Array übergeben willst.

    Und wie mache ich das?

    Der Prototyp der Funktion lautet bisher:

    void ausgabe(char const *,int);
    

    Und wenn ich das Sternchen wegmache

    ausgabe(puffer_codiert,anzahl);
    

    Zeigt er mir an genau dieser Stelle wieder einen Fehler an und zwar:

    error C2664: 'ausgabe' : Konvertierung des Parameters 1 von 'const char *[500]' in 'const char *' nicht moeglich



  • Wie hast du denn bei der Deklaration angegeben, daß du ein Array willst? Genauso sieht das auch beim Prototyp aus (abgesehen davon, daß dort die Variablennamen optional sind):

    void ausgabe(char*/*hier:*/[500],int);
    

Anmelden zum Antworten