main.cpp:17:84: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]



  • Hallo zusammen, ich bin neu hier und auch "neu" in in c. Ich bekomme folgende Fehlermeldung und weiß nicht mehr weiter:
    main.cpp:17:84: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

    Kann mir bitte bitte irgendwer erklären was ich falsch mache? Danke im Voraus.

    [[code="cpp"]
    #include "aufgabe2.h"
    #include <pthread.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    #define ANZAHL_TEAMS 4
    #define ANZAHL_RUNDEN 10
    
    /* Diesen Code nicht modifizieren */
    struct Team teams[] = {
        {.name = "The Runtime Exceptions", .runtime = 1, .staffelstab = 1, .hand = 1},
        {.name = "Ueberholverbot", .runtime = 2, .staffelstab = 2, .hand = 2},
        {.name = "WiSo nur", .runtime = 5, .staffelstab = 3, .hand = 3},
        {.name = "Die laufenden Kopplungen", .runtime = 3, .staffelstab = 4, .hand = 4}
    };
    
    /* Sockel zum Halten des Staffelstabs */
    staffelstab_t sockel;
    
    /* Ab hier euren Code einfuegen */
    
    void* Runden(void *arg) {
    
        for (int i = 0; i < 10; i++) {
            if (i != 0) {
                if (sockel == 0) {
                    printf("Teamname: %c kein Stab auf Sockel->disqualifiziert\n", &teams[arg].name);
                    break;
                } else {
                    sleep(1);
                    teams[arg].hand = sockel;
                    sockel = 0;
                }
            }
            sleep(teams[arg].runtime);
            if (i != 9) {
                sockel = teams[arg].hand;
            }
            printf("Teamname: %s  hat die Runde %d  abgeschlossen.\n", &teams[arg].name,&i);
        }
    
    }
    
    int main(void) {
    
        for (int i = 0; i < 4; i++) {
    
            int status;
            pthread_t laufen;
            status = pthread_create(&laufen, NULL, &Runden, &i);
            if (status) {
                printf("Problem bei pthead_create Teamname: %s \n", teams[i].name); /*Fehlerbehandlung*/
            }
            status = pthread_join(laufen, NULL);
            if (status) {
                /*Fehlerbehandlung*/
            }
            pthread_exit(NULL);
        }
    
    }
    

    ]



  • das steht es in der Warnung: "deprecated conversion from string constant to ‘char*’".

    .name Attribut struct Team darf kein char* sein, sondern const char* , denn Stringliterate (alles was in Hochkommas steht) sind konstant.



  • Bei main.cpp:17:84: gibt die erste Zahl die Zeile und die Zweite die Spalte an, in der der Fehler auftritt.
    Das passt nicht zu dem Code.

    Aber das ist noch das kleinst Problem.
    Einen void-Pointer als Index von einem Array 😮
    Ausgabe von Strings mit %c 🙄
    Angabe vom Adressoperator bei Strings 😕



  • danke, das ist mir etwas zu hoch, bitte etwas einfacher



  • Die Definition von struct Team (die du nicht zeigst) muss geändert werden.

    Und noch was: Du hast kein return bei einer Funktion mit Rückgabewert

    Und es ist besser, C-Programme auch im C-Modus zu compilieren. Meist reicht es, den Quellcode mit .c statt .cpp zu benennen.



  • ok hab das etwas abgeändert:

    #include "aufgabe2.h"
    #include <pthread.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    #define ANZAHL_TEAMS 4
    #define ANZAHL_RUNDEN 10
    
    /* Diesen Code nicht modifizieren */
    struct Team teams[] = {
        {.name = "The Runtime Exceptions", .runtime = 1, .staffelstab = 1, .hand = 1},
        {.name = "Ueberholverbot", .runtime = 2, .staffelstab = 2, .hand = 2},
        {.name = "WiSo nur", .runtime = 5, .staffelstab = 3, .hand = 3},
        {.name = "Die laufenden Kopplungen", .runtime = 3, .staffelstab = 4, .hand = 4}
    };
    
    /* Sockel zum Halten des Staffelstabs */
    staffelstab_t sockel;
    
    /* Ab hier euren Code einfuegen */
    
    void* Runden(void *arg) {
    
        int a=(int)&arg;
    
        for (int i = 0; i < 10; i++) {
            if (i != 0) {
                if (sockel == 0) {
                    printf("Teamname: %s kein Stab auf Sockel->disqualifiziert\n", &teams[a].name);
                    break;
                } else {
                    sleep(1);
                    teams[a].hand = sockel;
                    sockel = 0;
                }
            }
            sleep(teams[a].runtime);
            if (i != 9) {
                sockel = teams[a].hand;
            }
            printf("Teamname: %s  hat die Runde %d  abgeschlossen.\n", &teams[a].name,i);
        }
    
    }
    
    int main(void) {
    
        for (int i = 0; i < 4; i++) {
    
            int status;
            pthread_t laufen;
            status = pthread_create(&laufen, NULL, &Runden, &i);
            if (status) {
                printf("Problem bei pthead_create Teamname: %s \n", teams[i].name); /*Fehlerbehandlung*/
            }
            status = pthread_join(laufen, NULL);
            if (status) {
                /*Fehlerbehandlung*/
            }
            pthread_exit(NULL);
        }
    
    }
    


  • saver schrieb:

    ok hab das etwas abgeändert:

    Und? Was kommt raus?

    Da ich deinen Code nicht compilieren kann, da dein Code nicht vollständig ist, solltest du die Fehlermeldungen liefern.

    Zeile 24 macht nicht das, was du erwartest.

    Und vergeliche mal Zeile 32, 44 und 58 miteinander. Die machen so ziemlich das Gleich, aber nur eine ist richtig.



  • so die Fehlermeldungen sind weg. Und nu mit Header-Datei. Bekomme jetzt aber:
    /tmp/ccqNCKFe.o: In Funktiion 'main':
    aufgabe2_a.c:(.text+0x11e): Nicht definierter Verweis auf 'pthread_create'
    aufgabe2_a.c:(.text+0x156): Nicht definierter Verweis auf 'pthread_join'

    was heißt hier nicht definierter Verweis???

    #ifndef AUFGABE2_H
    #define AUFGABE2_H
    
    #define LEER 0
    
    /* Diese Header-Datei wird nicht mit ins AsSESS uebertragen. 
     * Bitte keine Aenderungen an dieser Datei vornehmen.
     * /
    
    /* Typdefinition fuer den Staffelstab */
    typedef int staffelstab_t;
    
    /* Struktur fuer Teamrepraesentation. 
     * name: Name des Teams
     * runtime: Zeit fuer eine Runde
     * staffelstab: Staffelstab, der der Gruppe zugeordnet ist
     * hand: Aktuelle Staffelstab in der Hand des Laeufers. Zu Beginn hat der erste Laeufer des Teams
     *       den Staffelstab des Teams bereits in der Hand. 
     */
    struct Team {
        char* name;
        int runtime;
        staffelstab_t staffelstab;
        staffelstab_t hand;
    };
    
    #endif
    
    #include "aufgabe2.h"
    #include <pthread.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    #define ANZAHL_TEAMS 4
    #define ANZAHL_RUNDEN 10
    
    /* Diesen Code nicht modifizieren */
    struct Team teams[] = {
        {.name = "The Runtime Exceptions", .runtime = 1, .staffelstab = 1, .hand = 1},
        {.name = "Ueberholverbot", .runtime = 2, .staffelstab = 2, .hand = 2},
        {.name = "WiSo nur", .runtime = 5, .staffelstab = 3, .hand = 3},
        {.name = "Die laufenden Kopplungen", .runtime = 3, .staffelstab = 4, .hand = 4}
    };
    
    /* Sockel zum Halten des Staffelstabs */
    staffelstab_t sockel;
    
    /* Ab hier euren Code einfuegen */
    
    void* Runden(void *arg) {
    
        int a = (int) &arg;
    
        for (int i = 0; i < 10; i++) {
            if (i != 0) {
                if (sockel == 0) {
                    printf("Teamname: %s kein Stab auf Sockel->disqualifiziert\n", teams[a].name);
                    break;
                } else {
                    sleep(1);
                    teams[a].hand = sockel;
                    sockel = 0;
                }
            }
            sleep(teams[a].runtime);
            if (i != 9) {
                sockel = teams[a].hand;
            }
            printf("Teamname: %s  hat die Runde %d  abgeschlossen.\n", teams[a].name, i);
        }
        pthread_exit(NULL);
    }
    
    int main(void) {
    
        for (int i = 0; i < 4; i++) {
    
            int status;
            pthread_t laufen;
            status = pthread_create(&laufen, NULL, &Runden, &i);
            if (status) {
                printf("Problem bei pthead_create Teamname: %s \n", teams[i].name); /*Fehlerbehandlung*/
            }
            status = pthread_join(laufen, NULL);
            if (status) {
                printf("Problem bei pthead_join Teamname: %s \n", teams[i].name);/*Fehlerbehandlung*/
            }
            pthread_exit(NULL);
        }
    }
    


  • saver schrieb:

    was heißt hier nicht definierter Verweis???

    Der Linker findet kein Objekt mit diesem Namen. (Er kennt die Funktionen nicht.)

    Du musst dem Compiler (der es dem Linker mitteilt) mit angeben, wo er diese Funktionen findet.

    Nochmal:

    int a = (int) &arg;
    

    ist ziemlicher Blödsinn!



  • DirkB schrieb:

    saver schrieb:

    was heißt hier nicht definierter Verweis???

    Der Linker findet kein Objekt mit diesem Namen. (Er kennt die Funktionen nicht.)

    Du musst dem Compiler (der es dem Linker mitteilt) mit angeben, wo er diese Funktionen findet.

    Nochmal:

    int a = (int) &arg;
    

    ist ziemlicher Blödsinn!

    ich hab doch include pthread.h, wenn er pthread_t findet, wieso dann nicht auch pthread_create ?

    ok ich will der Funktion Runden einen int übergeben und dann auch verwenden. Wie mach ich das?


  • Mod

    saver schrieb:

    ich hab doch include pthread.h, wenn er pthread_t findet, wieso dann nicht auch pthread_create ?

    Weil Compiler und Linker unterschiedliche Stationen sind. Der Compiler ist zufrieden. Dem Linker musst du noch sagen, wo er sein Zeug findet und das ist eben nicht in irgendeiner Headerdatei.

    ok ich will der Funktion Runden einen int übergeben und dann auch verwenden. Wie mach ich das?

    Dann erklär doch mal, was die ganzen verschiedenen Zeichen im Zusammenhang mit Zeigern bedeuten: &, *
    Dann denk mal darüber nach, ob das wirklich das ist, was du machen möchtest.



  • *a heißt a ist ein Zeiger auf eine Adresse wo ich etwas finde, &a gibt die Adresse zurück, an welchem etwas abgelegt ist



  • saver schrieb:

    ich hab doch include pthread.h, wenn er pthread_t findet, wieso dann nicht auch pthread_create ?

    Im Header (das was du mit #include dazu lädst) stehen nur Deklarationen und typedefs.
    Die Definitionen (der Code) steht in einer .c Datei bzw., wenn der schon compiliert wurde, in einer Objektdatei oder Library.

    Die Headerdatei (.h) ist nicht die Library

    saver schrieb:

    ok ich will der Funktion Runden einen int übergeben und dann auch verwenden. Wie mach ich das?

    Da du an pthread_create die Adresse von i übergibst, kommt bei Runden auch die Adresse von i an.
    Du musst also erstmal aus arf einen Zeiger auf int machen und diesen dann dereferenzieren.

    int a = *(*int)arg;
    

    Da du die Adresse übergibst, haben alle Threads dasselbe i.

    Du solltest nochmal über den Sinn vom & nachdenken.
    Nicht überall wo eine Adresse gebraucht wird, gehört ein & hin.
    ~
    Edit: Da habe ich wohl etwas zu lange geschrieben~



  • danke, hab es nun etwas abgeändert. Nun übergebe ich einen Zeiger auf einen int. Wenn ich nun wie du vorschlägst
    int a = *(*int)arg;

    schreibe, sagt er, expected expression before 'int'

    int *j=&i;
    
            int status;
            pthread_t laufen;
            status = pthread_create(&laufen, NULL, &Runden, j);
    


  • saver schrieb:

    danke, hab es nun etwas abgeändert. Nun übergebe ich einen Zeiger auf einen int. Wenn ich nun wie du vorschlägst
    int a = *(*int)arg;

    schreibe, sagt er, expected expression before 'int'

    int *j=&i;
    
            int status;
            pthread_t laufen;
            status = pthread_create(&laufen, NULL, &Runden, j);
    

    Was steht denn before int?



  • hab es mittlerweile soweit umgeschrieben, dass ich einen Zeiger auf ein struct Team übergebe. Thanks.. Ich mach für heute Abend Schluss-


Log in to reply