Das Programm soll Personen verwalten. In der Bibliothek ist die Struktur definiert. Die hier aufgeführte Unterfunktion(nur ein Ausschnitt) liest die Daten von der Tastatur ein und speichert sie in einem Hilfsfeld ab. Danach wird ein dynamisches Feld erzeugt, mit der Größe der eingegebenen Datensätze.
Mein Problem ist die Konvertierung der Zeiger: Der Kompiler spuckt andauernd char* kann nicht in int konvertiert werden.
Über Hilfe würde ich mich sehr freuen.
Bibliothek
C/C++ Code:
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
typedef struct person_e { // Etikett: Struktur Person
ui_t identNr;
nam_t fNam, vNam;
gd_t gebDat;
} person_t;
typedef person_t* pperson_t; // Typname: Zeiger auf Struktur typedef pperson_t* ppperson_t; // Typname: Zeiger auf Zeiger auf Struktur
C/C++ Code:
1 2 3 4 5 6 7 8
typedef struct person_e { // Etikett: Struktur Person
ui_t identNr;
nam_t fNam, vNam;
gd_t gebDat;
} person_t;
typedef person_t* pperson_t; // Typname: Zeiger auf Struktur typedef pperson_t* ppperson_t; // Typname: Zeiger auf Zeiger auf Struktur
C/C++ Code:
1 2 3 4 5 6 7 8
typedef struct person_e { // Etikett: Struktur Person
ui_t identNr;
nam_t fNam, vNam;
gd_t gebDat;
} person_t;
typedef person_t* pperson_t; // Typname: Zeiger auf Struktur typedef pperson_t* ppperson_t; // Typname: Zeiger auf Zeiger auf Struktur
In der oberen for-Schleife brauchst du nichts zu korrigieren(außer da liegt das eigentliche Problem), da kommen wir schon selber hinter(ist aber vllt für den Zusammenhang wichtig). Aber für den Rest wärs echt cool. Und mit den Grenzen hattest du natürlich Recht.
Wenn ich das so mache wie du sagst bekomme ich die Meldung:
Zitat:
error C2440: '=': 'void *' kann nicht in 'pperson_t *' konvertiert werden
Dann verwendest du den C++-Compiler, obwohl dein Code eigentlich ziemlich nach C aussieht. In dem Fall ist der Cast schon nötig. Wenn du bei reinem C bleiben willst, kannst du deine cpp-Datei einfach nach .c umbenennen (oder in den Projektsettings auf C-Compiler umschalten).
_________________ Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?
Diese Typnamen halte ich für dringend verbesserungswürdig.
Irgendjemand außer dir soll die Code ja vielleicht auch noch mal lesen und verstehen können ohne gleich einen größeren Vorrat Betablocker aufzubrauchen.
#ifdef __cplusplus
#error Ich übersetze C Code mit einem C++ Compiler, was Anfängerschrott ist
#endif
pperson_t ReadPerFromKbd (void) {
person_t person[10]; /* ein temporäres 10er Array zum Einlesen der Daten */
pperson_t pPerArr = 0; /* Definition eines Zeigers mit NULL-Initialisierung */ int datenAnz,i;
for(datenAnz=i=0; i < 10; i++,datenAnz++) {
printf("Familiennamen: "); fgets(person[i].fNam, NAMLEN+1, stdin); /* evtl. vorhandenes abschließendes '\n' muss hier noch entfernt werden... */ if(strlen(person[i].fNam) != 1) {
printf("Vorname : "); fgets(person[i].vNam, NAMLEN+1, stdin); /* evtl. vorhandenes abschließendes '\n' muss hier noch entfernt werden... */
printf("Geburt Tag : "); scanf("%u", &person[i].gebDat.gdTag);
printf("Geburt Monat : "); scanf("%u", &person[i].gebDat.gdMonat);
printf("Geburt Jahr : "); scanf("%u", &person[i].gebDat.gdJahr);
printf("Personal-Nr. : "); scanf("%u", &person[i].identNr);
}
}
pPerArr = calloc (datenAnz, sizeof *pPerArr); /* '*' hast du hier entfernt, ohne zu wissen warum; */
for(i=0; i < datenAnz; i++) {
pPerArr[i] = person[i]; /* hier werden die StrukturelementINHALTE in den vorbereiteten calloc-Speicherplatz kopiert */
}
return pPerArr; /* return hast du auch noch vergessen */
}
#ifdef __cplusplus
#error Ich übersetze C Code mit einem C++ Compiler, was Anfängerschrott ist
#endif
pperson_t ReadPerFromKbd (void) {
person_t person[10]; /* ein temporäres 10er Array zum Einlesen der Daten */
pperson_t pPerArr = 0; /* Definition eines Zeigers mit NULL-Initialisierung */ int datenAnz,i;
for(datenAnz=i=0; i < 10; i++,datenAnz++) {
printf("Familiennamen: "); fgets(person[i].fNam, NAMLEN+1, stdin); /* evtl. vorhandenes abschließendes '\n' muss hier noch entfernt werden... */ if(strlen(person[i].fNam) != 1) {
printf("Vorname : "); fgets(person[i].vNam, NAMLEN+1, stdin); /* evtl. vorhandenes abschließendes '\n' muss hier noch entfernt werden... */
printf("Geburt Tag : "); scanf("%u", &person[i].gebDat.gdTag);
printf("Geburt Monat : "); scanf("%u", &person[i].gebDat.gdMonat);
printf("Geburt Jahr : "); scanf("%u", &person[i].gebDat.gdJahr);
printf("Personal-Nr. : "); scanf("%u", &person[i].identNr);
}
}
pPerArr = calloc (datenAnz, sizeof *pPerArr); /* '*' hast du hier entfernt, ohne zu wissen warum; */
for(i=0; i < datenAnz; i++) {
pPerArr[i] = person[i]; /* hier werden die StrukturelementINHALTE in den vorbereiteten calloc-Speicherplatz kopiert */
}
return pPerArr; /* return hast du auch noch vergessen */
}
#ifdef __cplusplus
#error Ich übersetze C Code mit einem C++ Compiler, was Anfängerschrott ist
#endif
pperson_t ReadPerFromKbd (void) {
person_t person[10]; /* ein temporäres 10er Array zum Einlesen der Daten */
pperson_t pPerArr = 0; /* Definition eines Zeigers mit NULL-Initialisierung */ int datenAnz,i;
for(datenAnz=i=0; i < 10; i++,datenAnz++) {
printf("Familiennamen: "); fgets(person[i].fNam, NAMLEN+1, stdin); /* evtl. vorhandenes abschließendes '\n' muss hier noch entfernt werden... */ if(strlen(person[i].fNam) != 1) {
printf("Vorname : "); fgets(person[i].vNam, NAMLEN+1, stdin); /* evtl. vorhandenes abschließendes '\n' muss hier noch entfernt werden... */
printf("Geburt Tag : "); scanf("%u", &person[i].gebDat.gdTag);
printf("Geburt Monat : "); scanf("%u", &person[i].gebDat.gdMonat);
printf("Geburt Jahr : "); scanf("%u", &person[i].gebDat.gdJahr);
printf("Personal-Nr. : "); scanf("%u", &person[i].identNr);
}
}
pPerArr = calloc (datenAnz, sizeof *pPerArr); /* '*' hast du hier entfernt, ohne zu wissen warum; */
for(i=0; i < datenAnz; i++) {
pPerArr[i] = person[i]; /* hier werden die StrukturelementINHALTE in den vorbereiteten calloc-Speicherplatz kopiert */
}
return pPerArr; /* return hast du auch noch vergessen */
}
Eine robuste Eingabepufferlöschung für DAU-Eingaben fehlt natürlich noch.
_________________ Java, the best argument for Smalltalk since C++. -- Frank Winkler
Zuletzt bearbeitet von Wutz am 16:35:30 23.01.2012, insgesamt 1-mal bearbeitet
@Wutz: Die Typnamen sind so vorgegeben. Wir arbeiten mit VisualStudio2008 und machen da eine CLR-Konsolenanwendung unter C++. Es ist also ein C++ Compiler. Wir sollen aber trotzdem C programmieren. Mein Professor meinte das C auch komplett unter C++ funktioniert.
Das ich das return vergessen hatte war mir auch schon aufgefallen . Und vielen Dank für die anderen Tipps.
Wenn ich die Funktion jetzt aufrufe kommen folgende Fehlermeldungen mit welchen ich nun wirklich gar nix mehr anfangen kann.
C/C++ Code:
error LNK2028: Nicht aufgelöstes Token (0A00000F) ""struct person_e * __cdecl ReadPerFromKbd(void)" (?ReadPerFromKbd@@$$FYAPAUperson_e@@XZ)", auf das in Funktion ""int __cdecl main(void)" (?main@@$$HYAHXZ)" verwiesen wird.
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""struct person_e * __cdecl ReadPerFromKbd(void)" (?ReadPerFromKbd@@$$FYAPAUperson_e@@XZ)" in Funktion ""int __cdecl main(void)" (?main@@$$HYAHXZ)".
C/C++ Code:
error LNK2028: Nicht aufgelöstes Token (0A00000F) ""struct person_e * __cdecl ReadPerFromKbd(void)" (?ReadPerFromKbd@@$$FYAPAUperson_e@@XZ)", auf das in Funktion ""int __cdecl main(void)" (?main@@$$HYAHXZ)" verwiesen wird.
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""struct person_e * __cdecl ReadPerFromKbd(void)" (?ReadPerFromKbd@@$$FYAPAUperson_e@@XZ)" in Funktion ""int __cdecl main(void)" (?main@@$$HYAHXZ)".
C/C++ Code:
error LNK2028: Nicht aufgelöstes Token (0A00000F) ""struct person_e * __cdecl ReadPerFromKbd(void)" (?ReadPerFromKbd@@$$FYAPAUperson_e@@XZ)", auf das in Funktion ""int __cdecl main(void)" (?main@@$$HYAHXZ)" verwiesen wird.
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""struct person_e * __cdecl ReadPerFromKbd(void)" (?ReadPerFromKbd@@$$FYAPAUperson_e@@XZ)" in Funktion ""int __cdecl main(void)" (?main@@$$HYAHXZ)".
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.