Länge eines Arrays begrenzen?



  • D.h. also wenn ich den Array dynamisch deklariere, so wie von Janjan und supertux beschrieben, müsste es klappen?

    Das müsste dann so aussehen?
    dateien = (char 😉 malloc(strlen(ent->d_name)-4);



  • Den Rückgabewert von malloc soll man nicht casten. Und bedenke, dass du ein zusätzliches Byte für die Stringendemarkierung brauchst.



  • Also ich habs nochmal fix getestet ... Du hast recht MFK 🙂
    Die Namen der Bilder in dem Ordner waren länger als z.B. Bild1, Bild2.
    Wenn ich also das char-Array dateien nicht also "temp", sondern als "temporäredatei" deklariere funktioniert es.
    Also ist die beste Möglichkeit ein dynamisches Array zu erstellen.

    MFK schrieb:

    Den Rückgabewert von malloc soll man nicht casten. Und bedenke, dass du ein zusätzliches Byte für die Stringendemarkierung brauchst.

    Meinst du so?
    char *dateien = malloc(strlen(ent->d_name)-4);
    dateien [strlen(ent->d_name)-5] = '\0';

    und zum schluss free(dateien);



  • Saul schrieb:

    Meinst du so?
    char *dateien = malloc(strlen(ent->d_name)-4);

    Nein.
    Wenn du strlen-4 Zeichen reinkopieren willst, musst du für (strlen-4)+1 = strlen-3 Zeichen Speicher reservieren.

    Saul schrieb:

    dateien [strlen(ent->d_name)-5] = '\0';

    Du musst nur mehr Speicher reservieren. Die Endmarkierung war schon an der richtigen Stelle.
    Auch wenn ich nicht verstehe, warum du die Endung erst abschneidest und dann wieder dranhängst.



  • Also irgendwie raff ich das nicht 😞
    Habs jetzt so geschrieben

    char *dateien = malloc(strlen(ent->d_name)-3);
    

    Dann kommt ein Initialisierungs-Fehler: 'void *' kann nicht in 'char *' konvertiert werden und somit übersetzt er das Prog nicht.
    Wenn ich aber auf (char 😉 caste dann übersetzt er zwar, aber gibt dann ein Debug-Fehler aus: Invalid allocation size.

    MFK schrieb:

    ...
    Auch wenn ich nicht verstehe, warum du die Endung erst abschneidest und dann wieder dranhängst.

    Das ist dazu gedacht, um den Bildnamen weitere Daten von dem bearbeiteten Bild zu übergeben und dann wieder zusammen zu setzen,
    z.B. Breite und Höhe -> Bild1 (800*600).jpg
    Gruß Saul



  • Saul schrieb:

    Also irgendwie raff ich das nicht 😞
    Habs jetzt so geschrieben

    char *dateien = malloc(strlen(ent->d_name)-3);
    

    Dann kommt ein Initialisierungs-Fehler: 'void *' kann nicht in 'char *' konvertiert werden und somit übersetzt er das Prog nicht.
    Wenn ich aber auf (char 😉 caste dann übersetzt er zwar, aber gibt dann ein Debug-Fehler aus: Invalid allocation size.

    Das ist in C++ so, nicht jedoch in C. Wie kompilierst du denn?
    In C wird void* implizit in jeden anderen Zeigertypen gecastet.
    In C++ musst du void* explizit in einen anderen Zeigertypen casten.



  • Also eigentlich programmiere ich in C.



  • Und wie kompilierst du bitte? Ärgerlich, wenn man Fragen doppelt stellen muss.



  • Sorry, aber dann scheine ich die Frage nicht zu verstehen 😞
    ?Ich drücke den Debuggen starten Knopf bzw. F5 in Visual Studio und kompiliere im Debug Modus?



  • Also mit Visual Studio. Hast du auch daran gedacht in den Projektoptionen einzustellen, dass du den Code als C-Code und nicht als C++-Code kompilieren willst? Dies geht unter der Rubrik "C/C++" in den Projektoptionen. Am besten auch gleich die Warnstufe hochstellen.



  • Saul schrieb:

    Sorry, aber dann scheine ich die Frage nicht zu verstehen 😞
    ?Ich drücke den Debuggen starten Knopf bzw. F5 in Visual Studio und kompiliere im Debug Modus?

    Schalte in den Projekteinstellungen einfach um auf den C-Compiler (im Moment nutzt du nämlich den C++-Compiler; C ist eben doch nicht ganz eine Teilmenge von C++, wie du gerade merkst).

    Du findest das hier: C/C++ => Erweitert => Kompilierungsart



  • Ok, habe ich befolgt. Aber nun bekomme ich : bzw. { Syntaxfehler in den Dateien cstdio und cstdlib.



  • Saul schrieb:

    Ok, habe ich befolgt. Aber nun bekomme ich : bzw. { Syntaxfehler in den Dateien cstdio und cstdlib.

    "cstdio" und "cstdlib" gibt es in C nicht. Das sind C++ Header.

    Richtig wären "stdio.h" und "stdlib.h".


Anmelden zum Antworten