cannot convert 'mystruct' to 'mystruct*' for argument '1' to 'void myfunction(mystruct *)'



  • Hallöchen zusammen. Ich habe vor einer Weile mal um Hilfe gebeten in Bezug auf die Übergabe von Arraystructs. Damals hatte ich nur strings in meinem Struct, jetzt habe ich versucht mit der fscanf Funktion zu arbeiten in Bezug auf CSV Dateien etc. nun habe ich das Problem dass mit dem folgenden Code DevCPP mir folgenden Fehler ausgibt:

    [Error] cannot convert 'personaldaten' to 'personaldaten*' for argument '1' to 'void import(personaldaten*)'

    #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    
    using namespace std;
    
    struct personaldaten {
    	   char name[20];
           char vorname[20];
           char geburtsdatum[11];
           char geschlecht[2];
           int personalnr;
    };
    
    void import(personaldaten *);
    
    int main(int argc, char *argv[]){
    
    	struct personaldaten mitarbeiter;
    
    	import(mitarbeiter);
    
        return EXIT_SUCCESS;
    }
    
    void import(personaldaten *){
    	int iEingabe;
        int i , j, position, runden;
    	char line[40];
    
    	FILE *myfile;
    
    	myfile = fopen("personaldaten.txt", "r");
    	if(myfile == NULL){
    		cout << "Fehler beim Oeffnen der Datei!" << endl;
    		exit(1);
    	}
    
    	while(!feof(myfile)){
    		i = 0;
    		j = 0;
    		position = 0;
    		fscanf(myfile, "%s", line);
    		while(line[i] != ';'){
    			if(position == 0){
    				mitarbeiter.name[i] = line[i];
    				i++;
    				if(line[i] == ';'){
    					mitarbeiter.name[i] = '\0';
    					position++;
    					i++;
    				}
    			}
    			if(position == 1){
    				mitarbeiter.vorname[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.vorname[j] = '\0';
    					position++;
    					i++;
    					j = 0;
    				}
    			}
    			if(position == 2){
    				mitarbeiter.geburtsdatum[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.geburtsdatum[j] = '\0';
    					position++;
    					i++;
    					j = 0;
    				}
    			}
    			if(position == 3){
    				mitarbeiter.geschlecht[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.geschlecht[j] = '\0';
    					position++;
    					j = 0;
    				}
    			}
    		}
    
    		while(line[i] != '\0'){
    			if(line[i] != ';'){
    				mitarbeiter.personalnr = line[i];
    				j++;
    			}
    			i++;
    		}
    
    		//if(line[i] == '\0'){
    		//	mitarbeiter.geschlecht[i] = '\0';
    		//	j++;
    		//}
    		cout << "Name: " << mitarbeiter.name << endl;
    		cout << "Vorname: " << mitarbeiter.vorname << endl;
    		cout << "Geburtsdatum: " << mitarbeiter.geburtsdatum << endl;
    		cout << "Geschlecht: " << mitarbeiter.geschlecht << endl;
    		cout << "Personalnr: " << mitarbeiter.personalnr << endl << endl;
    	}
    	fclose(myfile);
    }
    

    Ich hoffe ihr könnt mir helfen. Grüße.



  • An die Funktion import() musst du eine Adresse auf eine struct personaldaten übergeben.
    In der main() übergibst du aber den Wert, nicht die Adresse. Um an die Adresse zu kommen, musst du den Adressoperator & verwenden.

    import(&mitarbeiter);
    

    BTW: dieses includen von cstdlib und stdlib kam in letzter Zeit öfters. Welches Tutorial/Buch verwendest du? Lass da lieber die Finger von.


  • Mod

    Nathan schrieb:

    BTW: dieses includen von cstdlib und stdlib kam in letzter Zeit öfters. Welches Tutorial/Buch verwendest du? Lass da lieber die Finger von.

    😮 Das ist deine Hauptkritik an dem Code? Der ist doch ein lupenreines Beispiel für das gefürchtete C + cout = C++



  • Öhm Programmentwicklung mit C/C++ und HTML vim Bildungsverlag EINS. Haben wir in der Schule bekommen.

    Mal eine Frage, wenn ich dass dann mit einer Adressübergabe mache sagt er mir: [Error] variable or field 'import' declared void.

    Könnte mir vielleicht jemand sagen, wie der Funktionsprototyp dann aussehen muss? Scheinbar passt ihm das void ja nicht.



  • Zeige mal Code.

    @SeppJ:
    Natürlich. Mein Code sieht genauso aus. 🙄
    Nein, aber das war das einzige, was mich an den anderen Code erinnert hat.



  • #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    
    using namespace std;
    
    struct personaldaten {
    	   char name[20];
           char vorname[20];
           char geburtsdatum[11];
           char geschlecht[2];
           int personalnr;
    };
    
    void import(personaldaten *);
    
    int main(int argc, char *argv[]){
    
    	struct personaldaten mitarbeiter;
    
    	import(&mitarbeiter);
    
        return EXIT_SUCCESS;
    }
    
    void import(&mitarbeiter){
    	int iEingabe;
        int i , j, position, runden;
    	char line[40];
    
    	FILE *myfile;
    
    	myfile = fopen("personaldaten.txt", "r");
    	if(myfile == NULL){
    		cout << "Fehler beim Oeffnen der Datei!" << endl;
    		exit(1);
    	}
    
    	while(!feof(myfile)){
    		i = 0;
    		j = 0;
    		position = 0;
    		fscanf(myfile, "%s", line);
    		while(line[i] != ';'){
    			if(position == 0){
    				mitarbeiter.name[i] = line[i];
    				i++;
    				if(line[i] == ';'){
    					mitarbeiter.name[i] = '\0';
    					position++;
    					i++;
    				}
    			}
    			if(position == 1){
    				mitarbeiter.vorname[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.vorname[j] = '\0';
    					position++;
    					i++;
    					j = 0;
    				}
    			}
    			if(position == 2){
    				mitarbeiter.geburtsdatum[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.geburtsdatum[j] = '\0';
    					position++;
    					i++;
    					j = 0;
    				}
    			}
    			if(position == 3){
    				mitarbeiter.geschlecht[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.geschlecht[j] = '\0';
    					position++;
    					j = 0;
    				}
    			}
    		}
    
    		while(line[i] != '\0'){
    			if(line[i] != ';'){
    				mitarbeiter.personalnr = line[i];
    				j++;
    			}
    			i++;
    		}
    
    		//if(line[i] == '\0'){
    		//	mitarbeiter.geschlecht[i] = '\0';
    		//	j++;
    		//}
    		cout << "Name: " << mitarbeiter.name << endl;
    		cout << "Vorname: " << mitarbeiter.vorname << endl;
    		cout << "Geburtsdatum: " << mitarbeiter.geburtsdatum << endl;
    		cout << "Geschlecht: " << mitarbeiter.geschlecht << endl;
    		cout << "Personalnr: " << mitarbeiter.personalnr << endl << endl;
    	}
    	fclose(myfile);
    }
    


  • Die Funktionsdefinition muss gleich bleiben.
    Du schreibst ja auch nicht (hoffe ich):

    int main()
    {
        int foo;
        func(foo);
    }
    
    void func(foo)
    {
    
    }
    


  • Krieg es nicht hin 😕 Selbe Problem wie vor 2 Posts ^^



  • Zeig Code, bitte.



  • Immernoch wie oben...

    #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    
    using namespace std;
    
    struct personaldaten {
    	   char name[20];
           char vorname[20];
           char geburtsdatum[11];
           char geschlecht[2];
           int personalnr;
    };
    
    void import(personaldaten *);
    
    int main(int argc, char *argv[]){
    
    	struct personaldaten mitarbeiter;
    
    	import(&mitarbeiter);
    
        return EXIT_SUCCESS;
    }
    
    void import(&mitarbeiter){
    	int iEingabe;
        int i , j, position, runden;
    	char line[40];
    
    	FILE *myfile;
    
    	myfile = fopen("personaldaten.txt", "r");
    	if(myfile == NULL){
    		cout << "Fehler beim Oeffnen der Datei!" << endl;
    		exit(1);
    	}
    
    	while(!feof(myfile)){
    		i = 0;
    		j = 0;
    		position = 0;
    		fscanf(myfile, "%s", line);
    		while(line[i] != ';'){
    			if(position == 0){
    				mitarbeiter.name[i] = line[i];
    				i++;
    				if(line[i] == ';'){
    					mitarbeiter.name[i] = '\0';
    					position++;
    					i++;
    				}
    			}
    			if(position == 1){
    				mitarbeiter.vorname[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.vorname[j] = '\0';
    					position++;
    					i++;
    					j = 0;
    				}
    			}
    			if(position == 2){
    				mitarbeiter.geburtsdatum[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.geburtsdatum[j] = '\0';
    					position++;
    					i++;
    					j = 0;
    				}
    			}
    			if(position == 3){
    				mitarbeiter.geschlecht[j] = line[i];
    				i++;
    				j++;
    				if(line[i] == ';'){
    					mitarbeiter.geschlecht[j] = '\0';
    					position++;
    					j = 0;
    				}
    			}
    		}
    
    		while(line[i] != '\0'){
    			if(line[i] != ';'){
    				mitarbeiter.personalnr = line[i];
    				j++;
    			}
    			i++;
    		}
    
    		//if(line[i] == '\0'){
    		//	mitarbeiter.geschlecht[i] = '\0';
    		//	j++;
    		//}
    		cout << "Name: " << mitarbeiter.name << endl;
    		cout << "Vorname: " << mitarbeiter.vorname << endl;
    		cout << "Geburtsdatum: " << mitarbeiter.geburtsdatum << endl;
    		cout << "Geschlecht: " << mitarbeiter.geschlecht << endl;
    		cout << "Personalnr: " << mitarbeiter.personalnr << endl << endl;
    	}
    	fclose(myfile);
    }
    


  • Es geht um Zeile 29.
    Woher soll der Compiler da wissen, was &mitarbeiter ist?
    Er kennt mitarbeiter nicht. mitarbeiter existiert nur innerhalb der main.
    Du musst ihm sagen welcher Typ da hin kommt. Der ist struct personaldaten *. Zusätlich braucht das Argument dann noch einen Namen, mitarbeiter. Das ist zwar praktisch das selbe wie mitarbeiter in main, allerdings gibt es für den Compiler Unterschiede.
    Zeile 29 muss also sein:

    void import(struct personaldaten *mitarbeiter);
    

    Aber ich empfehle dir ein gutes Buch, schaue mal in die Linkliste für Neulinge.
    Dein Buch ist Schrott.


Anmelden zum Antworten