Neudefinition; unterschiedliche Basistypen
-
Liebe Community,
ich bin relativ neu in dem Bereich Programmierung, dehalb bitte ich um etwas Nachsicht. Mein Problem wie in Titel bereits erwaehnt, bezieht sich auf folgende Hilfsfunktion.Ich rufe eine Fuktion aus der main auf, die wiederum eine Hilsfunktion aufruft. Bei den Funktionsparametern hadelt es sich bei beiden Funktionen um Pointer.
Um euch das Konstrukt etwas besser darzustellen:
main --(Uebergabe von den entsprechenden Referenzen &Z_Milch und &Z_Zucker)--> Funktion --(Uebergabe von den gleichen Referenzen(&Z_Milch,&Z_Zucker), wie von der main an die Funktion)--> HilfsfunktionAufruf der Funktion
unsigned char beide; UI_zusaetze_kaffee(beide, &pz_milch, &pz_zucker);
Prototyp der Funktion:
void UI_zusaetze_kaffee(char beide, char *pz_milch, char *pz_zucker)
-
Deine Frage ist?
-
Wie bekomme ich die entsprechede Fehlermeldung weg, damit ich das Programm kompilieren kann ?
-
Welche Fehlermeldung?
Und um schon einmal der nächsten Frage zuvor zu kommen:
Zu welchem Code gehört die Fehlermeldung?Bitte lies deine Beitrage hier noch einmal und frag dich, wie ein Fremder verstehen soll, was du wissen möchtest. Wir können weder in deinen Kopf noch auf deinen Computerbildschirm gucken. Du musst dein gesamtes Problem genau beschreiben.
Du brauchst Hilfe?
Wie man Probleme nachstellbar und nachvollziehbar macht
-
Da du relevanten Code ja nicht zeigst:
Was soll falsch sein, kompiliert doch anstandslos:
void UI_zusaetze_kaffee(char beide, char *pz_milch, char *pz_zucker) {} int main(void) { unsigned char beide = 0; char pz_milch = 'M'; char pz_zucker = 'Z'; UI_zusaetze_kaffee(beide, &pz_milch, &pz_zucker); }
Wenn ich jetzt mal raten sollte, würde ich wetten, dass deine pz-Variablen schon Zeiger sind und somit kein & beim Aufruf stehen darf.
-
Ins Blaue geraten, hat er eine weitere Indirektion:
void weitere_unterfunktion(char *pz_milch, char *pz_zucker) { } void UI_zusaetze_kaffee(char beide, char *pz_milch, char *pz_zucker) { weitere_unterfunktion(pz_milch, pz_zucker); // Hier dann kein & mehr, sonst hätte man schließlich einen Zeiger auf einen Zeiger } int main(void) { unsigned char beide = 0; char pz_milch = 'M'; char pz_zucker = 'Z'; UI_zusaetze_kaffee(beide, &pz_milch, &pz_zucker); }
-
int UI(char *pz_kaffee, char *pz_milch, char *pz_zucker, char *pz_espresso, char *pz_service) { system("cls"); printf("Herzlich Willkommen beim Kaffee-Automaten! \n"); printf("Bitte w\x84hlen Sie aus:\n"); printf("(k) Kaffee \n"); printf("(e) Espresso \n"); printf("(s) Service-Mode \n"); char Eingabe = _getch(); switch (Eingabe) { case'k': *pz_kaffee = 1; system("cls"); char beide = 1; printf("Sie haben sich f\x81r Auswahl Kaffee entschieden.\n"); UI_zusaetze_kaffee(beide, &pz_milch, &pz_zucker); break; case'e': *pz_espresso = 1; system("cls"); beide = 0; printf("Sie haben sich f\x81r Auswahl Espresso entschieden.\n"); UI_zusaetze_kaffee(beide, NULL, &pz_zucker); break; case's': *pz_service = 1; break; case'b': return 1; break; default: printf("\nUng\x81ltige Eingabe.\nUm fortzufahren druecken Sie bitte eine beliebige Taste."); _getch(); break; } return 0; } void UI_zusaetze_kaffee(char beide, char *pz_milch, char *pz_zucker) { if (beide == 1) { printf("\nMoechten Sie Milch ? [j] = JA [n] = NEIN\nIhre Eingabe: "); char wahlk = _getche(); if (wahlk == 'j') { *pz_milch = 1; //Milch = Mich - P_Milch; } else if (wahlk == 'n') { *pz_milch = 0; } else { printf("\nUngueltige Eingabe !"); } printf("\nMoechten Sie Zucker [j] = JA [n] = NEIN ?\nIhre Eingabe: "); wahlk = _getche(); if (wahlk == 'j') { *pz_zucker = 1; //Zucker = Zucker - P_Zucker; } else if (wahlk == 'n') { *pz_zucker = 0; } else { printf("\nUngueltige Eingabe !"); } } else { printf("Moechten Sie Zucker [j] = JA [n] = NEIN ?\nIhre Eingabe: "); char wahle = _getch(); if (wahle == 'j') { *pz_zucker = 1; } else if (wahle == 'n') { *pz_zucker = 0; } else { printf("\nUngueltige Eingabe !"); } } }
Die Fehlermeldung bei der Funktion
void UI_zusaetze_kaffee(char beide, char *pz_milch, char *pz_zucker)
ist folgender :error C2371: "UI_zusaetze_kaffee": Neudefinition; unterschiedliche Basistypen
-
Deine Programmstruktur ist miserabel (die Codierung auch), für den Gebrauch von Funktionen verwendet man deren Deklarationen als sogenannten Prototyp und in separaten Header-Dateien *.h.
Der C-Compiler sieht den Aufruf der Funktion UI_zusaetze_kaffee in UI bevor er die genaue Signatur von UI_zusaetze_kaffee kennt (Rückgabetyp der Funktion fehlt und lässt sich auch aus dem Kontext heraus nicht bestimmen), weil die Definition (wo der Rückgabetyp void definiert wird) erst später folgt und er nimmt - standardkonform - int als Rückgabetyp an.
Später merkt er dann, dass diese "Annahme" falsch war und weist dich auf deinen Fehler hin.
Hier würde es einfach ausreichen, die Funktion UI_zusaetze_kaffee vor UI zu definieren, besser wäre eine eigene Headerdatei mit den Prototypen beider (aller deiner) Funktionen anzulegen, und die dann in deinem C-Modul und im main-Modul anzugeben.
-
Meine Güte! Du willst echt keine Hilfe, oder? Welche Zeile für die Fehlermeldung? Wieso muss man dir alles so mühsam aus der Nase ziehen?
Noch einmal geraten: Du hast UI_zusaetze_kaffee nicht deklariert, bevor du es benutzt. Die dann automatisch generierte Deklaration ist zu der späteren nicht kompatibel.
Das ist aber das letzte Mal, dass ich hier rate oder Rückfragen stelle. Wenn meine Vermutung nicht stimmt, liegt es an dir, eigenständig ausreichend Information zur Beschreibung des Problems zu liefern.
-
Zur Info:
Der Compiler läuft einmal über deinen Code.
Wenn er etwas nicht kennt, macht er Annahmen.In Zeile 20 findet er eine Funktion die er nicht kennt und rät aus dem Aufruf, wie die Deklaration aussieht.
int UI_zusaetze_kaffee(char, char**, char**);
Und das passt nicht zu dem, was er in Zeile 57 vorfindet.