Fehlersuche Anfänger



  • Hallo, folgender Code:

    #include <iostream>
    #include "SkaliereVektor.h"
    
    using namespace std;
    
    int main()
    {
    	int l=5;
    	float d[l]={0,0,0,0,0};
    	float f=0;
    	cout << "Geben Sie " << l << " Zahlen fuer das Array an : ";
    	for (int i=l; i>0; i--){
    		cin >> d[l-i];	
    	}
    	cout << "Geben Sie den Faktor an : ";
    	cin >> f;
    
    	skaliereVektor(d[l],l,f);
    
    	cout << d[0] << endl;
    
        return 0;
    }
    

    und

    void skaliereVektor(float x[], int laenge, float faktor){
        for(int i=0;i<laenge;i++){
            x[i]=x[i]*faktor;
        }
    }
    

    liefert mir ständig den Fehler

    $ g++ Labor4.cpp
    Labor4.cpp: In function ‘int main()’:
    Labor4.cpp:25:25: error: cannot convert ‘float’ to ‘float*’ for argument ‘1’ to ‘void skaliereVektor(float*, int, float)’
      skaliereVektor(d[5],l,f);
                             ^
    

    dazwischen ist noch die SkaliereVektor.h Datei.
    An was liegt es und benötige ich immer eine *.h und eine *.cpp datei für eine eingebundene Funktion oder kann ich alles komplett in die *.h Datei schreiben?
    -thx



  • d[5] ist ein float, Deine Funktion erwartet einen float*. Willst Du eventuell d statt d[l] übergeben?

    Ausserdem ist d[5] ein Zugriff ausserhalb der Array-Grenzen. Keine Gute Idee.



  • jetzt bekomme ich

    $ g++ Labor4.cpp
    /tmp/ccH2YbJs.o: In function `main':
    Labor4.cpp:(.text+0x270): undefined reference to `skaliereVektor(float*, int, float)'
    collect2: error: ld returned 1 exit status
    


  • Benutze einen std::vector. Der kennt sogar seine Größe. Dein Array ist nicht standardkonform, da l nicht const ist. -pedantic würde auch eine entsprechende Meldung ausgeben.



  • Tim_tim schrieb:

    jetzt bekomme ich

    $ g++ Labor4.cpp
    /tmp/ccH2YbJs.o: In function `main':
    Labor4.cpp:(.text+0x270): undefined reference to `skaliereVektor(float*, int, float)'
    collect2: error: ld returned 1 exit status
    

    Du hast die Funktion in einer eigenen cpp definiert? Dann musst du die dem Compiler auch übergeben oder eine fertige .o.



  • thx an manni66 und SG1
    jetzt funktioniert alles :). ja das mit der konstante stimmt. jedoch soll ich nach der aufgabe mehrere längen ausprobieren. oder ist es dann passender eine konstane festzulegen und diese je nach auszuprobierender länge zu verändern?
    und wie binde ich bei der Funktion die *.cpp in die *.h datei ein? (insgesammt habe ich 2 .cpp und eine .h) jetzt wo's grad funtkioniert habe ich den einen teil von der cpp datei in .h reinkopiert. also, SkaliereVektor.h :

    void skaliereVektor(float x[], int laenge, float faktor){
        for(int i=0;i<laenge;i++){
            x[i]=x[i]*faktor;
        }
    }
    

    ach ja, und gibt es ein programm bei dem ich meinen c++ code speicher kann und zwar mit den highlights und gleichzeitig noch text bunt makieren kann (zB bei Fehlern die ich häufig mache oder sachen die wichtig sind) (kommentare überlese ich sehr leicht)



  • Tim_tim schrieb:

    thx an manni66 und SG1
    jetzt funktioniert alles :). ja das mit der konstante stimmt. jedoch soll ich nach der aufgabe mehrere längen ausprobieren. oder ist es dann passender eine konstane festzulegen und diese je nach auszuprobierender länge zu verändern?

    Nutze einen std::vector<double> ! Siehe zum Beispiel http://www.cplusplus.com/reference/vector/vector/operator[]/

    und wie binde ich bei der Funktion die *.cpp in die *.h datei ein?

    Gar nicht. Die cpp-Datei bindet die .h-Datei ein, nicht umgekehrt.

    jetzt wo's grad funtkioniert habe ich den einen teil von der cpp datei in .h reinkopiert.

    Das ist eine schlechte Idee und funktioniert nicht mehr, wenn du mehrere Übersetzungseinheiten hast.

    Stattdessen musst du entweder dem Compiler alle relevanten cpp-Dateien mitgeben, also z.B.

    g++ -Wall -Wextra -Wpedantic -std=c++14 -o meineExecutable ersteCppDatei.cpp zweiteCppDatei.cpp
    

    oder aber du kompilierst jeweils beide cpp-Dateien einzeln und linkst sie dann zusammen:

    g++ -Wall -Wextra -Wpedantic -std=c++14 -c -o erste.o ersteCppDatei.cpp
    g++ -Wall -Wextra -Wpedantic -std=c++14 -c -o zweite.o zweiteCppDatei.cpp
    g++ -Wall -Wextra -Wpedantic -std=c++14 -o meineExecutable erste.o zweite.o
    

    Das -c bedeutet "nicht linken", d.h. der Compiler beschwert sich nicht, wenn kein main vorhanden ist. Statt c++14 kannst du auch einen anderen Standard wählen, z.B. c++17, wenn dein Compiler aktuell ist. Wie auch immer, in größeren Projekten macht man das natürlich nicht von Hand, sondern nutzt ein Buildsystem dafür (das kann ein einfaches Makefile sein oder was auch immer).

    Mein Vorschlag für den Anfang (am einfachsten und am Anfang ist die Compiledauer eh nicht relevant): kompiliere einfach alle *.cpp-Dateien deines Projektes zusammen. (es sollte klar sein, dass das keine Dauerlösung sein kann)

    PS: bei anderen Compilern können die Parameter natürlich anders lauten.


Log in to reply