Strings in einer Funktion deklarieren -> Compiler-Errors!?



  • Hallo c-plusplus-Forum!

    Tut mir wirklich leid, in weniger als 7 Tagen das Forum schon wieder für eine Frage zu benutzen, ich kriege das nicht hin - Google will auch nicht sprechen (finde nix über mein Problem)...

    Also, ich versuche einfach (eigentlich nicht sooo einfach^^) Monopoly komplett über die Konsole zu programmieren.
    Habe mir gedacht, ich teile das Riesenproblem "Monopoly" in kleine Probleme auf, das 1.:
    dice.c
    Eine Datei mit Würfelfunktionen.

    Hier erstmal der relevante Code:

    3 #define MAX_SIZE 32
      4 
      5 void printblaasdf() {
      6         char line1[MAX_SIZE] = "0";
      7         char line2[MAX_SIZE] = "0";
      8         char line3[MAX_SIZE] = "0";
      9         char lineud[MAX_SIZE] = "---------";
     10 
     11         line1 = "| o   o |";
     12         line2 = "| o   o |";
     13         line3 = "| o   o |";
     14 
     15         printf("%s\n", lineud);
     16         printf("%s\n", line1);
     17         printf("%s\n", line2);
     18         printf("%s\n", line3);
     19         printf("%s\n", lineud);
     20 }
    

    Der Code sollte einfach eine visuell - wie auf nem echten Spielwürfel - dargestellte 6 ausgeben.
    Das Problem daran sind die Strings line1, line2, line3, lindud:

    Entweder die Strings lassen sich korrekt deklarieren (gezeigter Code) und der Compiler meckert bei den printf()s rum wegen

    gcc asdf.c 
    asdf.c: In function ‘printblaasdf’:
    asdf.c:11:8: error: incompatible types when assigning to type ‘char[32]’ from type ‘char *’
    asdf.c:12:8: error: incompatible types when assigning to type ‘char[32]’ from type ‘char *’
    asdf.c:13:8: error: incompatible types when assigning to type ‘char[32]’ from type ‘char *’
    

    oder ich versuche die Strings mit

    char line1[];
    ...
    

    (also ohne MAX_SIZE als Konstante) zu deklarieren, dann meckert der Compiler etwas von missing array size:

    error: array size missing in ‘line1’
    

    Ich habe mich nochmal und noch zweimal (um sicher zu gehen) im Internet nochmal (<- und nochmal^^) über die Deklaration von Strings informiert: Alles schlug fehl.

    Ich weiss nicht, ob das an dem liegt, dass ich versuche in einer Funktion die Variablen zu deklarieren, aber das muss doch gehen (ich mein, hier brauch ich das in der Funktion ja bzw. in meiner originalen dice.c, das hier ist eine Teilproblem-asdf.c).

    Hoffentlich könnt ihr mir helfen und mich eines Besseren belehren, zukünftig mit Stringdeklarationen umzugehen. Danke für alles im Voraus!

    Beste Grüße
    Tw1x

    PS: vor noch nicht mal 1 jahr dachte ich mir, compilererrors, dass die leute da immer threads in foren aufmachen... google & los... und jetzt!? jetzt hats mich selber erwischt xD



  • strcpy



  • oder ich versuche die Strings mit
    C:
    char line1[];
    ...

    (also ohne MAX_SIZE als Konstante) zu deklarieren, dann meckert der Compiler etwas von missing array size:
    Code:
    error: array size missing in ‘line1’

    Der Beitrag hätte hier enden können... als Antwort auf deinen, Nathan.
    Ernsthaft: Formulierst du vielleicht bitte deine Meinung etwas aus?

    strcpy könnte ich verwenden, ja, aber wie deklarieren ohne Compiler-Errors zu kriegen?
    Oder deklarieren mit

    char line1[MAX_SIZE];
    

    ?
    sprich: ohne

    ... = "";
    

  • Mod

    Das sind einige Dinge, die du nicht verstehst:
    1. Wie man Arrays und Zeiger deklariert
    2. Den Unterschied zwischen Arrays und Zeigern
    3. Wie man mit Arrays umgeht
    4. Welche Konventionen beim Umgang mit char-Arrays gelten

    Da fällt auf, in jedem Satz taucht das Wort Array auf. Hast du denn kein Lehrbuch oder so? Falls du keines hast: Hol dir eines, zum Beispiel das gute, bewährte K&R.

    Was soll deine Funktion überhaupt tun? Unter einem Namen wie printblaasdf kann ich mir absolut nichts vorstellen. Wenn das wirklich nur den Würfel mit sechs Augen ausgeben soll, dann mach doch einfach:

    void printblaasdf()
    {
      puts("--------\n"
           "| O  O |\n"
           "| O  O |\n"
           "| O  O |\n"
           "--------");
    }
    

    printf für Zeichenketten ist ohnehin eine Verschwendung.

    Allgemeine Anmerkung: Du läufst hier in zwei typische Anfängerfallen:
    1. Grafik
    Grafik kann im Prinzip jeder. Grafik ist nur Fleißarbeit. Aber du lernst dabei absolut 0. Wertlose Schönschreibnote. Schreib gute Programme, konzentrier dich nicht auf die Schönheit der Ausgabe. Meinetwegen als allerletzter Schritt am Ende. (Letzteres zwingt dich übrigens auch zu der guten Designphilosophie, Programmlogik und Ausgabe getrennt zu halten.)
    2. Spiele und andere große Projekte
    Für jemand, der nicht mit Arrays umgehen kann, ist das Projekt viel zu ambitioniert. Abgesehen davon, dass du die grundlegenden Sprachmittel noch nicht beherrscht, weißt du auch nicht, wie man ein Projekt dieser Größe angeht. Woher ich das weiß? Weil du die grundlegenden Sprachmittel kennen würdest, wenn du kleine Projekte bearbeitet hättest.
    Rat: Übernimm dich nicht. Ja, Galgenmännchen und Taschenrechner sind langweilig. Aber die ganzen Aufgaben aus Lehrbüchern stehen aus gutem Grund da drin. So kannst du im überschaubaren Rahmen lernen, Fehler machen, die Fehler verstehen und daraus lernen. Wenn du sofort groß loslegst, endest du bloß mit 1000 Zeilen Schrott, in dem gar nichts funktioniert und ein Verstehen ausgeschlossen ist.



  • Tw1x schrieb:

    oder ich versuche die Strings mit
    C:
    char line1[];
    ...

    (also ohne MAX_SIZE als Konstante) zu deklarieren, dann meckert der Compiler etwas von missing array size:
    Code:
    error: array size missing in ‘line1’

    Der Beitrag hätte hier enden können... als Antwort auf deinen, Nathan.
    Ernsthaft: Formulierst du vielleicht bitte deine Meinung etwas aus?

    strcpy könnte ich verwenden, ja, aber wie deklarieren ohne Compiler-Errors zu kriegen?
    Oder deklarieren mit

    char line1[MAX_SIZE];
    

    ?
    sprich: ohne

    ... = "";
    

    Dein erster Fehler war incompatible types. Die Lösung ist, strcpy zu verwenden.
    Den Rest hab ich gar nicht mehr gelesen.



  • Hallo SeppJ,
    danke für deine Antwort.
    Dass ich mit Zeigern nicht umgehen kann, weiß ich (ich verstehe das Ganze so halb, hab aber keine Übungsaufgaben dazu gemacht, da ich mir gedacht hab: "pointer wird man sicher irgednwie umgehen können, dass ich diese nicht brauch"), hingegen mit Arrays komme ich schon klar normal. Nur was mich schon immer verwirrt hat sind Strings, weil die bei java z.B. ja keine char-Arrays sind, bei c jetzt wieder schon, bei c# wieder nicht (oder doch?) (ich mein jetz immer direkt char arrays, klar, jeder String ist ja ein char-array...), das heißt, ich komme irgendwie durcheinander und hab dann keine Ahnung mehr, wie was geht.

    Das mit dem Buch - wie? K&R? - heißt das mit dem Titel so? Ich habe ein Buch über C (Grundkurs C, Jürgen Wolf. Galileo Computing, 2010) und eins über C++ (Spielerisch C++ lernen [gerade nicht zur Hand...]), das C++ kurz mal angefangen zu lesen (das läuft mit irgendwelchen Käfern und Games oder sowas?!) und das Grundkurs C fast komplett gelesen (da steht nicht allzuviel über Strings...).

    Warum ich mich an ein Riesenprojekt, wie Monopoly stürze:
    In der Schule (bin 11. Klasse, Gymnasium) haben wir ein Programmierprojekt, wo wir uns für Monopoly entschieden haben. Das "Tolle" ist, dass wir mit denen aus der 12. Klasse zusammen Informatik hatten (jetzt sinn die ja schon weg, Abitur is ja vorbei...) und daher den Stoff der 12. Klasse gelernt haben, was dazu führt, dass wir aus der 11. Klasse jetzt keine Ahnung von irgendwelchen Algorithmen etc. geschweige denn Programmiererfahrung haben/sammeln konnten. Und jetzt sollen wir ein Programmierprojekt auf die Füße stellen, dass für uns mehr oder weniger unschaffbar ist. Ich würde mal behaupten, dass im Programmieren aus dem Kurs ein anderer und Ich ziemlich gleichgut und die Besten des Kurses so sind. (Wir 2 kümmern uns um den Code (Spielablauf) und der Rest des Kurses gestaltet die Karten/Spielplan/Figuren/... und eine andere kleine 3-Mann-Gruppe erstellt mit Visual Basic die GUI.) Das ganze Projekt wird in C# geschrieben (von dem ich noch weniger Ahnung als von Linux allgemein habe (und da weiß ich die Grundlagen der shell und das wars eigentlich...)) und soll bis Schuljahresende (1x./2x.07.2013 irgendwann!?) fertig sein und wird dann bewertet.
    Bis jetzt haben wir so gut wie nichts (paar structs definiert, 3 oder 4 Funktionen, die kaum was machen und alle Variablen als Liste uns überlegt, die wir brauchen...) und ich persönlich will nicht noch weniger Punkte als ich schon in der Klausur hatte (6).
    Daraus folgt jetzt mein Elan, dass ich alleine eine Konsolenanwendung mit Monopoly schreibe. (Man nehme ein Monopoly-Spiel und befolge die Anweisungen des Programms. [<- so in der Art ungefähr...]).

    Deswegen will ich jetzt was machen, dass wir am Ende nicht mit leeren - Händen?, eher USB-Sticks 😃 - dastehen.

    Das mit dem dice.c sollte zum Einstieg in das Ganze ein wenig Rumgespiele sein (man macht sich ja auch Gedanken, dass es nicht nur hingeschi***n aussieht, sondern etwas Stil sollte es ja dann doch haben 👍 ), also keinesfalls werde ich das durchs komplette Monopoly so durchziehen und das ausschmücken.

    Ich hoffe, die Antwort ist nicht zu lang, aber ich glaube, so wisst ihr am Besten, wie weit ich in der Programmierung und Informatik so bin.

    Beste Grüße
    Tw1x

    EDIT1:
    @Nathan: Achso, also beim Werte (Zeichenfolgen) zuweisen nicht = "asdfblabla"; sondern strcpy? Werde ich gleich mal testen, danke^^



  • Tw1x schrieb:

    Das ganze Projekt wird in C# geschrieben (von dem ich noch weniger Ahnung als von Linux allgemein habe[...])

    Und warum ärgerst du dich dann mit C herum? Und in welchem Zusammenhang stehen deiner Meinung nach C# und Linux? Und wie wollt ihr eine VB-GUI mit einem C-Programm kombinieren?

    Wenn du/ihr tatsächlich so wenig Zeit und Ahnung habt, mach es lieber in C#, damit wirst du als Anfänger schneller zum Ziel kommen.



  • Naja, ich mag C# gar nicht, aber da es ähnlich wie java ist, hab ich mich halt wieder mal überreden lassen... (Der Andere meinte, dass wir das mit Objektorientierung - sprich Klassen & Objekte anzulegen und so weiter - besser hinkriegen würden, und die GUI wäre auch einfacher zu erstellen)

    Die Rede war auch nie von einer Kombination meines C-Programms mit VB-GUI, das können die Grafik-Leute dann in C# transscripten, wenn die wollen (denke aber nicht, dass dazu die Zeit in diesem Schuljahr noch reicht...).

    Also, mein Problem ist mehr oder weniger geklärt, jetzt läuft mein Programm, jetzt gehts dann auch los mit dem Plan für die einzelnen Funktionen...

    Ach halt, bevor ichs vergess: Was mich schon noch interessiert: Welches Buch ist dieses K&R, hab grad gegoogled, aber dabei kam nur raus, dass es irgendein Buch gibt mit K&R oder so und, dass K... & R... die Gründer von C sind... oder Erfinder(?), ach sagen wir einfach Väter. Wäre also cool, wenn mir jemand Verlag und Titel des Buches nennen könnte.

    Danke für alles!

    Beste Grüße
    Tw1x



  • Tw1x schrieb:

    Der Andere meinte, dass wir das mit Objektorientierung - sprich Klassen & Objekte anzulegen und so weiter - besser hinkriegen würden, und die GUI wäre auch einfacher zu erstellen

    Da hat er recht. Zumindest bei euren Voraussetzungen.

    Brian W. Kernighan und Dennis Ritchie: The C Programming Language.



  • yo, mag sein, dass es besser geht, aber können tuts er auch nicht (objektorientiert das ganze durchziehn...), und die syntax von java finde ich auch unlogisch, seit ich die von c kenne...

    das buch werde ich mir dann holen, danke an alle!

    bin erstmal schlafen, gn8 @all
    Tw1x



  • C ist nicht C++ ist nicht C# ist nicht Java.

    Das sind alles unterschiedliche Sprachen.

    Das sind zwar imperative Sprachen, bis auf C auch objektorientiert, aber es sind unterschiedliche Sprachen.

    Du kannst nicht von dem Verhalten einer Sprache auf eine andere schließen.

    Und C ist ein besserer Assembler mit wenig Komfort.

    Und mach die Aufgaben aus den Büchern. Verändere den Code, spiele damit rum.
    Mache Fehler, daraus wirst du lernen.


  • Mod

    Tw1x schrieb:

    Das mit dem Buch - wie? K&R? - heißt das mit dem Titel so? Ich habe ein Buch über C (Grundkurs C, Jürgen Wolf. Galileo Computing, 2010) und eins über C++ (Spielerisch C++ lernen [gerade nicht zur Hand...]), das C++ kurz mal angefangen zu lesen (das läuft mit irgendwelchen Käfern und Games oder sowas?!) und das Grundkurs C fast komplett gelesen (da steht nicht allzuviel über Strings...).

    K&R steht für Brian Kernighan und Dennis Ritchie, die Erfinder von C und deren Lehrbuch:
    http://en.wikipedia.org/wiki/The_C_Programming_Language
    (das wäre auch leicht googlebar gewesen: Google: K&R C)

    Im Gegensatz zu deinen sonstigen Büchern lernt man daraus auch etwas. Deine anderen Bücher sind bekannter Schrott, aus dem du nur Müll lernst. Klingt hart, ist aber so:
    http://www.c-plusplus.net/forum/272350
    Das gilt auch für spielerisches Lernen. Besser nicht benutzen.


Anmelden zum Antworten