Probleme mit Fehlerfindung!



  • Hallo liebe C++ Community,

    habe mal wieder ein Problem beim lernen, iwie finde ich den Fehler nicht, folgendes habe ich bisher:

    //main.cpp

    #include <iostream>
    #include <string>
    #include "Ausgabe.h"
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
    	int aZahlen[12]={1,4,77,45,34,22,33,45,6,67,8,9};
    	char aWort[12]="Algorithmen";
        Ausgabe(aZahlen[12]);
    
      return 0;
    }
    

    //Ausgabe.h

    #ifndef AUSGABE_H
    #define AUSGABE_H

    void Ausgabe(int aZahlen[12]);

    #endif

    //Ausgabe.cpp

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include "Ausgabe.h"
    using namespace std;
    
    template <class T> T Ausgabe(T aArray[12])
    {
      for(int i=0;i<=11;i++)
      {
        cout<<aArray[i]<<" ";
      }
    
    }
    

    Die Fehlermeldung lautet:

    error C2664: 'Ausgabe': Konvertierung des Parameters 1 von 'int' in 'int []' nicht möglich
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Hab das Script nun des öffteren durchgeschaut, finde aber den Fehler nicht 😞

    Bitte helft mir, damit ich weiter komme.

    LG Samkirchner



  • Ausgabe(aZahlen[12]); -> Ausgabe(aZahlen);



  • Fellhuhn schrieb:

    Ausgabe(aZahlen[12]); -> Ausgabe(aZahlen);

    Erklärung: mit aZahlen[12] greifst du auf das 13te (!) Element des Arrays aZahlen zu - das aber nur 12 Elemente hat -> undefiniertes Verhalten (heißt von komischen Ausgaben über Abstürze bis dass der Computer dir die Zähne putzt ist alles erlaubt)



  • pumuckl schrieb:

    Fellhuhn schrieb:

    Ausgabe(aZahlen[12]); -> Ausgabe(aZahlen);

    Erklärung: mit aZahlen[12] greifst du auf das 13te (!) Element des Arrays aZahlen zu - das aber nur 12 Elemente hat -> undefiniertes Verhalten

    Aber das ist nicht das Problem! Hier gibt es noch gar kein undefiniertes Verhalten, denn aZahlen[12] ist kein int-Array mehr sondern ein int -> Compile-Error!
    Es ginge prinzipiell schon, dass man nur mit einem Range arbeitet. Dann übergibt man aber nicht array[start_index] sondern array + start_index.
    Falls array_size > start_index + range_size, dann ist das auch noch definiertes Verhalten.



  • l'abra d'or schrieb:

    pumuckl schrieb:

    Fellhuhn schrieb:

    Ausgabe(aZahlen[12]); -> Ausgabe(aZahlen);

    Erklärung: mit aZahlen[12] greifst du auf das 13te (!) Element des Arrays aZahlen zu - das aber nur 12 Elemente hat -> undefiniertes Verhalten

    Aber das ist nicht das Problem! Hier gibt es noch gar kein undefiniertes Verhalten, denn aZahlen[12] ist kein int-Array mehr sondern ein int -> Compile-Error!
    Es ginge prinzipiell schon, dass man nur mit einem Range arbeitet. Dann übergibt man aber nicht array[start_index] sondern array + start_index.
    Falls array_size > start_index + range_size, dann ist das auch noch definiertes Verhalten.

    😕

    wow, das ist mir doch ein wenig zu hoch, also wenn ich nun Ausgabe(aZahlen); mache, dann bringt er mir folgendes, ich nehme mal an das wolltest du damit sagen, oder???

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl Ausgabe(int * const)" (?Ausgabe@@YAXQAH@Z)" in Funktion "_main".

    nur was heißt das nun auf deutsch 😞



  • wow, das ist mir doch ein wenig zu hoch, also wenn ich nun Ausgabe(aZahlen); mache, dann bringt er mir folgendes, ich nehme mal an das wolltest du damit sagen, oder???

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl Ausgabe(int * const)" (?Ausgabe@@YAXQAH@Z)" in Funktion "_main".

    nur was heißt das nun auf deutsch 😞

    Nein, das wollte ich nicht sagen.

    #include <iostream>
    using namespace std;
    
    void Ausgabe( int* array, int size )
    {
        for( int i=0; i<size; ++i ) {
            cout << array[i] << endl;
        }
    }
    
    int main()
    {
        int zahlen[24] = { 1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
                          11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
                          21, 22, 23, 24 };
        // zahlen ist ein Array von 24 integern
        Ausgabe( zahlen + 10, 12 ); // Gibt 12 Werte ab zahlen[10] aus
        // >>>>>>>>
        //Ausgabe( zahlen[10], 12 ); // kompiliert nicht! -> Error
        // <<<<<<<<
    }
    

    Der Fehler den mir Gcc in der auskommentierten Zeile ausspuckt:

    g++ main2.cpp -o main2
    main2.cpp: In function »int main()«:            
    main2.cpp:20: Fehler: ungültige Umwandlung von »int« in »int*«
    main2.cpp:20: Fehler:   Argument 1 von »void Ausgabe(int*, int)« wird initialisiert
    

    Ist in jedem Fall aussagekräftiger als die von dir mit dem "reinterpret_cast".

    // Nachtrag:
    Vllt. um das noch genauer zu erklären:
    Du hast ein Array. Wie du an den Parametern erkennen kannst kann man ein Array auch über Pointer ansprechen. Man kann diesen Pointer mit hoch- und runterzählen im Array "verschieben".
    Der Index-Zugriff auf das Array Dereferenziert aber gleich den Pointer, es wird ein Wert zurückgegeben!

    Zur Veranschaulichung ein kleines Programm:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int* a1 = array;
        cout << a1[0] << endl;
        a1 += 3;
        cout << a1[0] << endl;
        int* a2 = a1 + 3;
        cout << a2[0] << endl;
        cout << *(a2 + 1) << endl;
    }
    

    Ausgabe:

    1
    4
    7
    8
    


  • 😮 also wenn ich die Ausgabe Funktion nicht als template mache, sondern normal mit void mach

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include "Ausgabe.h"
    using namespace std;
    
    void Ausgabe(int aArray[12])
    {
      for(int i=0;i<=11;i++)
      {
        cout<<aArray[i]<<" ";
      }
      cout<<"\n";
    
    }
    

    dann geht es 😡 . Wie blöd ist nur, das ich nun den aWort auch noch ausgeben lassen soll und dann ein template machen muss, denn dann bekomme ich wieder die Fehlermeldung!!!

    Schlussfolgerung, er mag die template nicht!!!! Sry, aber deine bsp sind leider ohne Schablone!!! Dafür habe ich in zwischenzeit wie oben gepostet ne Lösung gefunden.

    Wegen den Fehlermeldungen, ich verwende MVS 2005 😉 die müssen immer alles komplizierter machen 😉



  • Dass das überhaupt ordentlich kompiliert würde mich auch schwer wundern!
    Ausgabe.h deklariert ein "void Ausgabe(int aZahlen[12]);"
    In deinem .cpp fängst du dann mit template an. Das passt nicht zusammen!
    Bei Templates kommt die Definition (=Implementierung) IMMER in das Headerfile!
    Nebendem haben die in dem .h und dem .cpp angebotenen Funktionen abslout unterschiedliche Rückgabetype (void vs. T). Geschweige denn dass eine Template-Funktion keine Templatelose Funktion ist.

    Ein funktionierendes Beispiel sähe z.B. so aus:
    Ausgabe.h

    #ifndef MY_AUSGABE_TEMPLATE_FUN
    #define MY_AUSGABE_TEMPLATE_FUN
    
    #include <iostream>
    
    template <typename T>
    void Ausgabe(T arr[12])
    {
        for(int i=0; i<12; i++)
            std::cout << arr[i] << "\n";
    }
    
    #endif
    

    main.cpp

    #include "Ausgabe.h"
    
    int main()
    {
        int nums[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
        Ausgabe(nums);
        char name[12] = "Komasaeufer";
        Ausgabe(name);
    }
    


  • Ok, hier mal meine bescheißer Lösung 😉

    //main.cpp

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include "Ausgabe.h"
    
    using namespace std;
    
    int main()
    {
    	int aZahlen[12]={3,4,77,45,34,22,33,45,6,67,8,9};
    	char aWort[12]="Algorithmen";
        int *a1 = aZahlen;
    	Ausgabe(aWort , aZahlen);
    
    	system("PAUSE");
      return 0;
    }
    

    //Ausgabe.h

    #ifndef AUSGABE_H
    #define AUSGABE_H
    
    void Ausgabe(char aWort[12], int aZahlen[12]);
    
    #endif
    

    //Ausgabe.cpp

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include "Ausgabe.h"
    using namespace std;
    
    void Ausgabe(char aArray[12],int  aArrayb[12])
    {
      int a = 0;
      for(int i=0;i<=22;i++)
      {
          if (aArray[i]>=11)
    	  {
    	    cout<<aArray[i]<<" ";
    	      if (i == 10)
    		  {
    		    cout<<"\n";
    		  } 
    	  }
    	  else
    	  {
    	    cout<<aArrayb[a]<<" ";
    	    a++;
    	  }
      }
      cout<<"\n"; 
    }
    

    mit Verwendung von templates wäre es zwar weniger zu schreiben gewesen, jedoch bekam ich immer Fehler, mit denen ich nichts anfangen konnte, vlt poste ich hier nochmal wenn ich es mit templates schaffe.

    Danke an alle Helfer.

    LG samkirchner



  • l'abra d'or schrieb:

    Ausgabe.h

    #ifndef MY_AUSGABE_TEMPLATE_FUN
    #define MY_AUSGABE_TEMPLATE_FUN
    
    #include <iostream>
    
    template <typename T>
    void Ausgabe(T arr[12])
    {
        for(int i=0; i<12; i++)
            std::cout << arr[i] << "\n";
    }
    
    #endif
    

    main.cpp

    #include "Ausgabe.h"
    
    int main()
    {
        int nums[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
        Ausgabe(nums);
        char name[12] = "Komasaeufer";
        Ausgabe(name);
    }
    

    Danke, das hat mir geholfen 😉 nun ist es schlank und sauber, danke!!!

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    template <typename T>
    void Ausgabe(T aArray[12])
    {
      for(int i=0; i<12; i++)
      {
        cout<<aArray[i]<<" ";
      }
      cout<<"\n";
    }
    
    int main()
    {
    	int aZahlen[12]={3,4,77,45,34,22,33,45,6,67,8,9};
    	Ausgabe(aZahlen);
    	char aWort[12]="Algorithmen";
    	Ausgabe(aWort);
    
    	system("PAUSE");
      return 0;
    }
    

Anmelden zum Antworten