Array mit unbestimmter Größe erstellen
-
Apley schrieb:
Jedoch wenn ich das gecastete int weglasse, dann funktioniert die malloc funktion bei mir nicht.
das muss gehen.
welchen compiler benutzt du?Apley schrieb:
Es hat nicht zufällig jemand lust mal einen blick über meine ganzen Programm einen Blick zu werfen oder?
poste es doch hier...
-
Als compiler benutze ich Visual C++ Express Edition 2005.
denn code würde ich ja gerne hier reinposten, aber wenn das ein anderer Mitstreiter das sieht und es kopiert dann wäre ich im Arsch gekniffen, denn es würde dann nicht mehr bewertet werden.
Apley
-
Apley schrieb:
Als compiler benutze ich Visual C++ Express Edition 2005.
achso, dann hast du die quelltextdatei bestimmt .cpp genannt?
bennen sie um in .c, dann klappts...
-
Hintergrund ist der, dass der VC++ über die Dateiendung entscheidet ob er einen C oder einen C++ Compiler verwenden soll. In C++ bräuchte man den Cast, aber in C (und nur um C geht es hier) nicht.
-
ich hab das jetzt in *.c umgeändert, aber jetzt bringt er mir über 14 Fehler raus. Es soll ja alles in ANSI C programmiert werden.
Kann man das einlesen der String mit der Funktion fgets() relisieren?
wie müsste man die malloc() Funktion ändern das die dann auch funktioniert?
Ich hab zwar ein bischen daran gebastelt aber ich bekomm das nicht hin. Kümmere mich jetzt um eine andere Baustelle im Programm.Apley
-
Apley schrieb:
Kann man das einlesen der String mit der Funktion fgets() relisieren?
so etwa:
fgets (wohin, anzahl_bytes, stdin);
wobei das 'stdin' ein vordefinierter FILE* für die eingabe ist (tastatur etc.)
aber beachte: fgets hängt noch ein '\n' hinten dran...Apley schrieb:
wie müsste man die malloc() Funktion ändern das die dann auch funktioniert?
z.b. so
int *p = malloc (anzahl * sizeof(int));
das 'sizeof(...)' braucht man aber nur, wenn die elemente grösser als 'char' sind, bei char z.b. reicht:
char *p = malloc (anzahl);
-
naja, was soll ich sagen, ich bekomm das nicht hin.
Hab jetzt alles probiert aber ich komm nicht hin.
Das was ich möchte ist das eine betimmte Anzahl von Zeichen (Strings) eingegeben werden, die länge jedoch immer unterschiedlich ist. Die malloc Funktion musste ich casten, denn sonst meldet er es mir immer als Fehler.Desweiteren habe ich dann vor das ich den String mit einem anderem String zu vergleichen. jedoch denke ich nicht das das so schwierig ist. Ich hoffe das Ihr mir da ein bischen ordnung schaffen könnt, denn ich weiß jetzt wirklich nicht weiter. Denn ohne diesen Eingabe-String kann ich mein weiteren Code nicht prüfen, da ich am Anfang String und int vermischt habe. Vielen Dank
Apley#include <stdio.h> #include <stdlib.h> int main(void){ int numbers; char pointer[100]; printf("Bitte geben Sie die Anzahl der Ziffern an: \n"); scanf("%i", &numbers); printf("Bitte geben Sie die Ziffernreihenfolge ein: \n "); for(int i = 0; i < numbers; i++) { fgets(pointer, 100, stdin); } *pointer = (char*) malloc((sizeof(int))*numbers); //*pointer = malloc (pointer); return EXIT_SUCCESS; }
-
Also ich bin auch noch Anfänger, und mit meinem jetzigen Wissensstand löse ich das Problem noch folgendermaßen: Ich übergebe die einzulesenden Werte (bei Dir Integer-Werte) gleich beim Aufruf des Programms über die Windows-Eingabeaufforderung. Damit die Hauptfunktion weiß, dass Ihr Werte übergeben werden, muss sie zum Beispiel so deklariert werden:
int main (int argc, char** argv)
Du rufst dann dein Programm über die Eingabeaufforderung zum Beispiel so auf:
C:\MyWorkspace>deinprogramm 12 4 56 45 (und viele weitere Zahlen)
Der Übergabeparameter int argc aus obigem Beispiel enthält dann die Anzahl der (vorerst) chars, die der Hauptfunktion übergeben wurden. argv enthält alle übergebenen Werte. Die kannst Du dann mit zum Beispiel
for(i=1; i<argc; i++)
in ein Int-Array einlesen (vielleicht mit atoi). Die for-Schleife geht erst bei 1 los, weil argv[0] den Namen deines Programms enthält (hier: "deinprogramm").
Mit dem Wert argc kannst Du dann auch malloc sagen, wie groß das Array werden soll.
Ich hoffe dass ich Dir helfen konnte,
Anne
Edit: Oder Du fragst einfach nach dem Programmstart, wie viel Zahlen eingegeben werden sollen (wenn das von der Aufgabenstellung her erlaubt ist). Dann
scanf("%d", anzahl); deinarray=malloc(anzahl*sizeof(int)); for(i=0;i<anzahl;i++) { // Zahl einlesen deinarray[i]= ... }
Dabei musst Du aber darauf achten, dass Du "deinarray" am Anfang richtig deklarierst!
-
oder sowas
// neuen string auf dem heap anlegen // 'max' ist die maximale länge // gibt 0 aus, wenn nichts eingegeben wurde // oder bei fehlern // der string muss nach gebrauch mit 'free' // gelöscht werden char *new_string (unsigned int max) { // speicher holen char *p = malloc(max+1); // hat nicht geklappt? dann 0 zurückgeben if (!p) return 0; // string von eingabe mach 'p' kopieren // fehler beim einlesen oder nur 'enter' gedrückt... // ... dann alles zurück if (!fgets (p, max+1, stdin) || *p == '\n') { free (p); return 0; } // alles ok, dann hinten das '\n' löschen { char *cr = strchr(p, '\n'); if (cr) *cr = 0; } // ...und den string zurückgeben return p; }
-
ten schrieb:
// alles ok, dann hinten das '\n' löschen p[strlen(p)] = 0;
Best NOP ever
-
TactX schrieb:
ten schrieb:
// alles ok, dann hinten das '\n' löschen p[strlen(p)] = 0;
Best NOP ever
hab's ausgebessert...
-
@ ten
hey das du so eine Geduld mit mir mitbringst ..respekt!Desweiteren habe ich mir mal so Gedanken gemacht über die ganze Aufgabe. eigentlich kommt nur in einer Textpassage vor das die "unabhängige Länge des Strings" gefordert wird. Dieses jedoch im späterem Programmablauf. Anbei dazu mal die Textpassage.
http://img124.imageshack.us/img124/6336/stringwl8.th.jpg
Versteh ich das jetzt richtig, das mein Eingabestring nicht unendlich sein muss, sondern nur diese geforderte Prüfziffer muss unendlich viele Strings verarbeiten könne? Denn das wäre ja schon erledigt.
Obwohl es dann irgendwie kein Sinn macht sowas zu fordern. (Ja ich weiß, ich will es mir jetzt einfach machen :), weil ich den unendlichen String einfach nicht in den Griff bekomme.)
In der Aufgabe davor wird einfach nur ein eingabe-String verlangt und diesen soll man dann analysieren und dann etnscheiden ob er der richtige oder falsche ist. Und dann halt diese Prüfziffergeschichte drüberlaufen lassen. Und eben auch aus diesem Grund habe ich gedacht das der Eingabestring auch unendlich sein muss.Denn sonst würde ich das jetzt einfach so lösen
char Anzahl[100]; printf("Anzahl eingeben: "); scanf("%s", anzahl);
Gruß
Apley
-
Apley schrieb:
Desweiteren habe ich mir mal so Gedanken gemacht über die ganze Aufgabe.
An Deiner Stelle würde ich damit nicht zu schnell wieder aufhören...
-
@Würd_gern_C_können
Also so schnell gib ich generel nicht auf, jedoch läuft mir die Zeit davon. Muss die Aufgabe schon am Montag abgeben. Also du siehst bei mir ist es kurz vor 12Jaja, ich weiß etwas spät angefangen
Danke für dein Beispiel, jedoch soll alles in Strings eingelesen werden, und daran bin ich verzweifelt. Int wären ja noch relativ einfach, aber stringsDesweiteren ist die Aufgabe sehr unklar gestellt.
Als Bsp. wird da eine Prüfzifferberechnung gefordert wenn der Funktion einen gültigen Zeigerwert (!=0) übergeben wird.Zeigerwert wovon? Also das kann verstehen wer will, ich habs inzwischen aufgegeben.
Ich hab jetzt meine Aufgabe fast fertig gelöst. Hab es mir teilweise auch etwas leichter gemacht.
Es gibt insgesamt 3 Dateien. Eine header mit angehörigem cpp und meine main.cpp. Bevor jemand meckertes wird alles in cpp verlangt.
Leider funktioniert jetzt ein Funktionsaufruf nicht.
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "123456.h" void Pruefzifferberechnung(void); void richtigezahl(void); float 123456(char); //Prototyp int main(void) printf("Bitte geben Sie die Ziffern ein: \n "); char pointer[100]; for(int i = 0; i < numbers; i++) scanf("%s", &pointer[i]); if(497628(pointer) == 0.0) // <<< Hier meldet er mir einen Fehler richtigezahl(); else if (497628(pointer) == 1.0) Pruefzifferberechnung (); else if (123456(pointer) == 2.0) void abort(void); //------------------------ float z497628 (const char Martikelnr[]) //....hier sollten dann die eingehenden Strings bearbeitet werden und am Ende // per Return als Float zurückgegeben werden Bsp: return = 2;
Naja, wie gesagt so war mein Plan, aber leider meldet er folgenden Fehler 3 x;
cannot convert parameter 1 from 'char [100]' to 'char'
bei if(123456(pointer) == 0.0))
Ich hoffe ihr könnt mir helfen. Oder hat jemand lust sich das ganze mal anzusehen? Das würde mir sehr viel helfen. Posten kann ich es nicht, höchstens am Sonntag abend oder montag früh, dann bräuchte ich aber eine ganz schnelle hilfe
So, gute Nacht
Apley
-
Bitte freunde Dich mit dem Gedanken an, das C und C++ zwei verschiedene Sprachen sind!
#include <stdio.h> // \ #include <string.h> // > gibt's in C++ alle 3 nicht #include <stdlib.h> // / #include "123456.h" // ...ein wahrlich selbstbeschreibender Dateiname :( void Pruefzifferberechnung( void ); // Das void in einer leeren Parameterliste ist überflüssig void richtigezahl( void ); // dito float 123456( char ); // Bezeichner müssen in C und C++ mit einem Buchstaben // oder einem Unterstrich beginnen. Unbenannte Parameter // in forward declarations sind sicher nicht best practice... int main( void ) // Hier ist das void nicht nur überflüssig sondern schon sehr an // der grenze der Legalität: Erlaubt sind 'int main( )' und // 'int main( char *argv[ ], int argc )', wobei die Parameternamen // in zweiter Variante frei wählbar sind. // Hier fehlt der Rumpf von main( )! // edit { // /edit printf("Bitte geben Sie die Ziffern ein: \n "); char pointer[100]; // Naja, eher ein Array. // Wieso benennst Du Variablen nicht einfach nach // ihrem Inhalt? zB. 'input' ? for(int i = 0; i < numbers; i++)// ist numbers definiert? Vielleicht in '123456.h' ? { // Klammern um Blöcke sind nie verkehrt... scanf( "%s", &pointer[ i ] ); } if(497628(pointer) == 0.0) // Die Funktion '497628' kann nicht aufgerufen werden, // weil Du die Regeln für Bezeichner in C und C++ mit // Füßen trittst... richtigezahl(); // ^ definiert? else if( 497628(pointer) == 1.0 ) Pruefzifferberechnung(); // ^ definiert? else if( 123456(pointer) == 2.0 ) void abort(void); // ^ Was Du hier machst ist grober Unfug! (Lokale Funktionsdefinition) // edit } // den Rumpf von main wieder schließen // /edit // ab hier hab ich keinen Plan mehr, was du wohl meinen magst...
greetz, Swordfish
-
scanf() kann doch auch Zahlen einlesen!
http://www.cplusplus.com/reference/clibrary/cstdio/scanf.html
d Decimal integer: Number optionally preceeded with a + or - sign.
float 123456( char );
497628(pointer) == 0.0
Zwar hat es Swordfish schon gesagt, aber WTF?
-
ach verdammter Mist.... Ich hab mich ja öfters vertippt als mir lieb war. Ich hatte denn code etwas veralgemeinert, und das ist dann daraus geworden
Das man eine Funktion mit einem Buchstaben anfangen sollte wusste ich nicht.
In der Aufgabe fängt das mit einem Buchstaben. Nur ich hab es hier ohne Buchstabe geschrieben.
Es ist mir bewusst das C und C++ zwei Sprachen sind, jedoch wird das so in der Aufgabe gefordert.Am Anfang steht " Gefordert ist eine Ansi C implementierte Funktion, deren Form so auszusehen hat...." . Als abgabe wird dann eine header mit cpp und main.cpp verlangt. Was soll ich machen?! Hier mal einen Link zur Aufgabe
http://193.23.171.171/download/Inf1_Praktikum2006/Zusatzaufgabe0607.pdf@DEvent
Es werden Strings als Eingabe verlangt. Mit int wäre ich schon längst fertig.Ich verzweifle was Strings angeht. Diese umwandelei raubt mir den letzten Nerv
Auch wenn ich mich etwas blamiere, aber was heist WTF?
Ok, noch mal einen versuch. Diesmal ist es der Originalcode ohne viel verändert zu haben. Nicht schlagen weil er so lang ist.
#include <stdio.h> #include <stdlib.h> #include "w123456.h" void Pruefzifferberechnung(void); // Prüefziffer wird berechnet und am Bildschirm ausgegeben void richtigezahl(void); // Zahl = OK , wird also am Bildschirm ausgegeben float w123456(char); // Check was für einen Eingabe getätigt wurde int numbers; int eingabe[100]; void main() { char input[100]; int r; printf("Bitte geben Sie die Anzahl der Ziffern an: \n"); scanf("%i", &numbers); printf("Bitte geben Sie die Ziffern einzeln ein \n "); for(int i = 0; i < numbers; i++) // Schleife für die Aufnahme der Ziffern { scanf("%s", &input[i]); } for(int r = 0; r < numbers; r++) // Wandelt die eingegebenen char in int um - eingabe[] { if (48 == input[r]) eingabe[r] = 0; else if(49 =...) . . . // printf("eingabe %i = pointer %s \n", eingabe[r], input); } if(w123456(input) == 0.0) // Prüfen welche Ausgabe das Programm durchführen muss richtigezahl(); else if (w123456(input) == 1.0) Pruefzifferberechnung (); else if (w123456(input) == 2.0) void abort(void); } void richtigezahl(void) // Printausgabe richtige Martikelnummer { printf(" 123456 \n"); } void Pruefzifferberechnung(void) { int r; int summeeinzelprodukte = 0; for(i = 0; i < numbers; i++) // Schleife für Berechnung der Pruefziffer { if ((i % 2) == 0) { summeeinzelprodukte = summeeinzelprodukte + eingabe[i] + 3; // printf("Summe einzelprodukte = %i \n", summeeinzelprodukte); } else { summeeinzelprodukte = summeeinzelprodukte * eingabe[i]; // printf("Summe einzelprodukte = %i\n", summeeinzelprodukte); } } int modulo10 = summeeinzelprodukte % 10; // printf("Modulo10 = %i \n", modulo10); int pruefziffer = (10-modulo10)%10; switch (pruefziffer) // Printanweisung für die Prüfziffer { case 1: printf("1\n\n\n"); break; case 2: printf("2\n\n\n"); break; case 3: printf("3\n\n\n"); break; case 4: printf("4\n\n\n"); break; case 5: printf("5\n\n\n"); break; case 6: printf("6\n\n\n"); break; case 7: printf("7\n\n\n"); break; case 8: printf("8\n\n\n"); break; case 9: printf("9\n\n\n"); break; } }
dazu noch die header.cpp w123456
#include "w123456.h" float w123456 (const char Martikelnr[]) // Der Funktionname muss so aussehen. Darf nicht verändert werden { n = sizeof(Martikelnr) / sizeof(char); for (r = 0; r < n-1; r++) // prüfen der Martikelnr auf Fehleingabe { if(Martikelnr[r] > d || Martikelnr[r] < e) /* es wird getestet ob das Zeichen nach ASCII über 9 oder unter 0 liegen */ return rueckwert_an_main = 2; else if (Martikelnr[r] != EigeneMartikelnr[r]) return rueckwert_an_main = 1; /* Falsche Martikelnummer */ else return rueckwert_an_main = 0; /* Richtige Martikelnummer */ } }
[url]
-
DEvent schrieb:
float 123456( char );
497628(pointer) == 0.0
Zwar hat es Swordfish schon gesagt, aber WTF?
was mich mal echt geschockt hat, ist sowas:
char a[] = {1,2,3}; 3[a] = 10; // <-- kein syntax error!
ich weiss jetzt noch nicht mal in welcher sprache das ging, php glaub' ich...
-
Apley schrieb:
Am Anfang steht " Gefordert ist eine Ansi C implementierte Funktion, deren Form so auszusehen hat...." . Als abgabe wird dann eine header mit cpp und main.cpp verlangt. Was soll ich machen?!
Dem Prof sagen, dass er hierherkommen soll um C zu lernen.
ten schrieb:
was mich mal echt geschockt hat, ist sowas:
char a[] = {1,2,3}; 3[a] = 10; // <-- kein syntax error!
ich weiss jetzt noch nicht mal in welcher sprache das ging, php glaub' ich...
a[3]
*(a + 3)
*(3 + a)
3[a]Dass er dabei an nicht-reservierten Speicher schreibt ignorieren wir mal
-
Erstens: Du hast zwei verschiedene Funktionen mit dem Namen w123456() (die im Hauptrpogramm erwartet einen char, die in der w123456.cpp ein char-Array). Unter C++ wäre das womöglich legal (Überladung - könnte höchstens vom Linker moniert werden), in C definitiv nicht.
Zweitens: Diese sizeof-Konstruktion funktioniert nur recht eingeschränkt - und in deinem Fall liefert sie nicht das richtige Ergebnis. Nimm lieber strlen(), um die Länge des übergebenen Strings zu bestimmen.
Drittens: Wo hast du die lokalen Variablen der w123456() definiert?
Viertens: Der Ausdruck
void abort(void);
ist kein Funktionsaufruf - an der Stelle brauchst du einabort();
Fünftens @Swordfish: Dies ist das ANSI C Board, da bringt es nichts, C++ spezifische Faktoren zu diskutieren (C-Header, void-Paramterlisten, int main(void), etc. - btw sind die auch in C++ legal zu verwenden).
@ten: Das geht sogar in C
Der []-Operator
p[i]
ist eine Kurzform für*(p+i)
- und der ist witzigerweise kommutativ.