typedef struct Funktion
-
Hiho zusammen. Ich bin an einem Programmierproblem am verzweifeln und bin dabei über euer forum gestolpert und dachte mir, dass mir hier bestimmt jemand helfen kann.
Zum Problem: Ich hab erst vor kurzem mit C angefangen und hab mir das meiste bisher anhand des galileo-Openbooks selbst beigebracht, da ich die selbe Aufgabe habe wie hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-272479-and-highlight-is-typedef+struct.html.
Ich hänge jetzt aber leider an einer anderen Stelle fest als TobiasK.
Ich habe ebenfalls den BigInt-Typ erstellt
typedef unsigned int uint32; typedef struct { uint32 n; uint32* words; }BigInt;
und versuche nun 2 BigInt Elemente zu addieren. Dazu verwende ich folgende Funktion:
BigInt add() { BigInt s = {1, malloc(4)}; //Berechnung return s; }
Das funktioniert soweit und lässt sich auch gut kompilieren. Versuche ich aber nun diese Funktion in der main-Funktion mittels
add();
oder
BigIntVariable = add();
aufzurufen, so bekomme ich jedes Mal beim kompilieren den Fehler:
error C2371: 'add': Neudefinition; unterschiedliche Basistypen
Ich habe schon versucht alles außer dem Funktionsaufruf und der Funktion auszudokumentieren, habe den Fehler aber immernoch. Er verschwindet aber, sobald ich einen anderen Typ als BigInt für die Funktion verwende.
Ich hoffe jemand hat dazu eine Idee. Ich bedanke mich schonmal im Vorraus :).
mfg Asgalor
-
Die Fehlermeldung lässt darauf schließen, dass du irgendwo im Sichtbarkeitsbereich deines Programms noch eine Funktion "add" definiert hast, die keinen BigInt zurückliefert. Benenne dein add doch einfach mal um in einen signifikanteren Namen.
-
Danke für den Tipp, aber das hab ich schon versucht. Hab ja auch deswegen alles andere auskommentiert. Interessanterweise hab ich den Fehler ja auch nicht direkt sondern erst, wenn ich die Funktion aufrufe.
-
Dieser Code geht:
#include <stdlib.h> typedef unsigned int uint32; typedef struct { uint32 n; uint32* words; } BigInt; BigInt add( void ) { BigInt s = {1, malloc(4)}; //Berechnung return s; } int main( void ) { BigInt BigIntVariable = add(); }
Für VC mußte noch casten, damit keine Warnung kommt:
BigInt s = {1, (uint32*)malloc(4)};
Grüße,
Chriss
-
Ah, Vielen Dank. Nachdem ich den die add-Funktion vor die main Methode gestellt hab funktionierts^^
Wenn jetzt noch jemand weiß, warum ich meine anderen Funktionen nach der main Methode deklarieren kann und nur die BigInt-Funktionen vorher, bin ich vollends begeistert :).
mfg Asgalor
-
Dafür benötigst du lediglich die Deklaration des Funktionskopfes vor der Main-Funktion:
BigInt add( void ); // <- nur deklarieren int main( void ) { // ... } BigInt add( void ) { BigInt s = {1, malloc(4)}; //Berechnung return s; }
-
Asgalor schrieb:
Ah, Vielen Dank. Nachdem ich den die add-Funktion vor die main Methode gestellt hab funktionierts^^
Dann kann ich dir das Problem erklären. In C muss man eine Funktion nicht unbedingt deklarieren, bevor man sie aufruft. Dann wird angenommen, dass sie
int
zurückgibt und beliebig viele Parameter annehmen kann, also etwaint add(); // Erinnerung: () heißt beliebig viel, keine Parameter heißt in C (void) ...
Später definierst du
add
mit einem anderen Rückgabetyp als int, und das haut dir der Compiler um die Ohren.
-
cmdev schrieb:
Für VC mußte noch casten, damit keine Warnung kommt:
BigInt s = {1, (uint32*)malloc(4)};
Oder einfach die Dateiendung einfach auf .c ändern, wie es bei ANSI C üblich ist
-
Ah. danke Bashar. Das wusste ich noch gar nicht. das erklärt auch, warum ich die int funktionen nach der main deklarieren konnte.
@all: Danke für eure Hilfe. Problem ist damit wohl gelöst