ISO C++ forbids comparison between pointer and integer|



  • DirkB schrieb:

    Deine Zeiger (first und sec) zeigen auf Stringliterale.
    Du die darf man nicht verändern.

    Danke, das sollte man sich merken...

    DirkB schrieb:

    Was soll eigentlich die Zeile 7?
    Wann ändert sich in deiner Funktion denn t1?
    Gar nicht. Dann brauchst du den Vergleich auch nicht im while.
    Willst du da wirklich überprüfen ob die Adresse von dem Zeiger ungleich NULL ist?

    Da habe ich wohl ein [i] vergessen 😉
    Am Anfang habe ich das mit 2 Eingaben gemacht daher die \0, aber das zweimalige einlesen mit gets hat trotz getschar!='\0' nicht funktioniert daher hab ich dies dann hardgecodet bevor mir das Zeit frisst 😉

    #include <stdio.h>
    #include <ctype.h>
    
    void ana(char *t1,char* t2){
         int i=0, j=0,next=0, kill = 0;
    
         while(t1[i] && kill == 0){
             j=0;
    
             while(t2[j] != '\0' && next == 0){
    
                 if(tolower(t1[i]) == tolower(t2[j])){
                     next=1;
                 }
    
                 j++;
             }
             if(next == 0){
                 printf("Hier kann es sich nicht um ein Annagramm handeln \n");
                 kill = 1;
             }
             else {
                 i++;
                 next = 0;
             }
         }
    
         if(next == 0&&kill==0){printf("Annagramm");}
    }
    
     main(){
         char first[] = "Hallo";
         char sec[] = "ollah";
    
        ana(first,sec);
    }
    

    so funktioniert er



  • Statt "EMPTY" wäre ein Leerstring "" besser.
    NULL kannst du nicht nehmen, das du die Adresse eines Arrays nicht verändern kannst.

    Strings vergleicht man nicht mit != oder == oder .... Dafür gibt es eine Funktion.



  • Ups 😉 Danke 😉

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_BESTELLUNGEN 100
    #define MAX_BESTELLPOSITIONEN 10
    
    struct Bestellposition {
        char artikelBezeichnung[50];
        float artikelPreis;
        int anzahlArtikel;
        };
    struct Bestellung {
        char kundenname[101];
        struct Bestellposition *positionen[10];
    };
    
    struct Bestellung *bestellungsListe[MAX_BESTELLUNGEN];
    
    int neueBestellPosition(int bi, char *p, float pr, int instanz){
        int i = 0;
    
        struct Bestellung *np;
        np = bestellungsListe[bi];
    
        while(np->positionen[i]!=NULL){
            i++;
        }
        struct Bestellposition *tmp;
        tmp = (struct Bestellposition*)malloc(sizeof(struct Bestellposition));
        strcpy(tmp -> artikelBezeichnung,p);
    
        tmp -> artikelPreis = pr;
        tmp -> anzahlArtikel = instanz;
        np -> positionen[i] = tmp;
        i++;
        np -> positionen[i] = NULL;
    }
    
    void initBestellListe(){
        int i = 0;
        for (i=0;i<MAX_BESTELLUNGEN;i++){
            bestellungsListe[i] = (struct Bestellung *) malloc(sizeof(struct Bestellung));
            strcpy(bestellungsListe[i]->kundenname,""); //NULL wäre besser
        }
    }
    
    int neueBestellung(char *n){
        struct Bestellung *lp;
        int i=0;
        while (i < MAX_BESTELLUNGEN && strcmp(bestellungsListe[i]->kundenname,"")!=0){
            i++;
            printf("%d. %s\n",i,bestellungsListe[i]->kundenname);
        }
    
        if(i < MAX_BESTELLUNGEN){
            lp = bestellungsListe[i];
            strcpy(lp->kundenname,n);
            lp->positionen[0] = NULL;
            return i;
        } else {
            printf("ERROR max Bestellungen erreicht");
            return -1;
        }
    
    }
    
    void printBestellungen(){
        int i =0;
        int j=0;
    
        while (i <MAX_BESTELLUNGEN && strcmp(bestellungsListe[i]->kundenname,"")!=0) {
            printf("Name: %s\n",bestellungsListe[i]->kundenname);
            while(bestellungsListe[i]->positionen[j] != NULL){
    
                printf("Bez: %s\n",bestellungsListe[i]->positionen[j]->artikelBezeichnung); //hier müsste pointter reichen
                printf("Preis: %.2f\n",bestellungsListe[i]->positionen[j]->artikelPreis);
                printf("Anzahl: %d\n",bestellungsListe[i]->positionen[j]->anzahlArtikel);
                j++;
            }
            j=0;
            i++;
        }
    }
    
    int main(void) {
        int bestellungsID;
        initBestellListe();
        bestellungsID = neueBestellung("Mueller");
        neueBestellPosition(bestellungsID, "Milch", 0.99, 1);
        neueBestellPosition(bestellungsID, "Butter", 1.50, 2);
        printBestellungen();
        return 0;
    }
    

    Wann kann ich jetz eigentlich in ein Struct einen String einfach so kopieren
    z.B. Zeile 31 tmp->artikelBezeichnung = p;
    und wann nicht? Mache mittlerweile schon sicherheitshalber immer mit strcpy. Ich dachte das geht immer wenn es nicht als string pointer sondern als array deklariert ist!?



  • Kopieren kannst du einen String nicht "einfach so".
    Die einzige Stelle wo du einen String mit dem = füllen kannst ist die Initialisierung bei der Definition der Variable.

    char text[] = "Hallo"; // Definition mit Initialisierung
    

    Kopieren kannst du mit strcpy (oder gleichwertiges Verefahren). Dafür muss beim Ziel aber entsprechend Platz sein.

    Zeiger kannst du mit dem = zuweisen. Dann wird aber auch nichts kopiert.

    Zu deinem Programm:
    In initBestellListe solltest du das Array positionen mit sinnvollen Werten füllen. Da das ein Array of Pointer ist, bietet sich da NULL an.

    Wegen der ZEiger:
    Kennst du die Verknüpfungen vom Windows-Desktop?
    Was passiert wenn du nur die Verknüpfung kopierst und das Original löscht?



  • #include <stdio.h>
    
    void erstelleBaum(unsigned int);
    //WIE GEHT HIER ein entsprechender Prototyp zu baum2 -> void erstelleBaum2(char matrix[][],unsigned int) <-- funktioniert nicht **matrix auch nicht
    
    void ausgabe (char matrix[][]){ //diese Zeile ist mir vorgegeben, aber wie soll die Übername funktionieren?? kenne nur *matrix[] oder matrix[][spalten]
        int x=0,y=0,yn=1;
    
        for (x=0;x<20;x++){ //alle 20 Zeilen
            while(matrix[x][y] == ' ' || matrix[x][y] == 'x'){
                printf("%c",matrix[x][y]);
            }
        }
    }
    
    void erstelleBaum2(char matrix[20][20],unsigned int n){
        int zeile = n*2;
        if(zeile<=20){ //prüfen ob feste matrix groß genug, da zeilen =spalte max 10+9 =19
            int y=0,l=0,xl=0,xss=0,xs=0,z=0;
            //Zeile doppelt, Anzahl leerzeichen, pro leerzeichen, sterne
            int x = 0; //0 weil Array
    
            while(x<n){
    
                for(y=0;y<2;y++){//Zeile doppelt
                    l = 9-x+1; //Anzahl Leerzeichen, hälfte von 20 Feldern
                    for(xl=0;xl<l;xl++){
                        matrix[z][xl] = ' '; //z ist eigener Zähler da man alles doppelt schreiben muss ist dies mit xl nicht möglich
                    }
                    xl ++;
                    if(x==0){//erste Zeile
                        matrix[z][xl] = '*';
                    } else {
                        xs=x+x+1; //da beim x=1 eigentlich x=2
                        for(xss=0;xss<xs;xss++){
                            matrix[z][xl] = '*';
                            xl++;
                        }
                    }
                    z++;
                }
    
                x++;
            }
        }else{
            printf("n ist zu groß");
        }
    }
    
    void erstelleBaum(unsigned int n){
        int x=1,xl=0,l=0,xss=0,xs=0,y=0;
        while(x<=n){
            for(y=0;y<2;y++){
                l=10-x; //max 10 n kann man sicher besser lösen
                for(xl=0;xl<l;xl++){
                    printf(" ");
                }
    
                if(x==1){
                    printf("*\n");//beim ersten mal einzeln
                }else{
                    xs=x+x-1; //den vorgänger für die anzahl der sterne mitzählen
                    for(xss=0;xss<xs;xss++){
                        printf("*"); //pro Stern
                    }
                    printf("\n");
                }
    
            }
        x++;
        }
    }
    
    main(){
    
    char matrix[20][20];
    erstelleBaum(3);
    erstelleBaum2(matrix,3);
    ausgabe(matrix);
    
    }
    

    Fragen Zeile 4 und 6 kommentiert...



  • Die Variablennamen dürfen auch im Protyp stehen.
    Die Namen müssen nicht die selben wie bei der Definition sein.
    Wenn sie gut gewählt sind, weiß man auch gleich was für eine Variable erwartet wird.

    void erstelleBaum2(char matrix[20][20],unsigned int n);
    


  • DirkB schrieb:

    Die Variablennamen dürfen auch im Protyp stehen.
    Die Namen müssen nicht die selben wie bei der Definition sein.
    Wenn sie gut gewählt sind, weiß man auch gleich was für eine Variable erwartet wird.

    void erstelleBaum2(char matrix[20][20],unsigned int n);
    

    Ah okay danke da war ich mir noch nicht sicher, was die ausgabe betrifft denke ich des ist ein Fehler in der Aufgabenstellung... da kommt ja eig nur matrix[][spalten] in frage...



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct person {
    char *name;
    struct person *next;
    };
    
    void drucke(struct person * a){
        struct person *tmp;
        tmp = a;
        while (tmp != NULL){
            printf("%s ",tmp->name);
            tmp=tmp->next;
        }
    
    }
    
    struct person * invertiere (struct person *a){
        int i=0, j=0;
        struct person *b,*tmp, *tmp2,*ne,*b2;
        tmp = a;
        while(tmp != NULL){
            i++;
            tmp=tmp->next;
        }
        tmp = NULL;
        tmp2=a;
    
        for(j=0;j<i;j++){
            tmp2 = a;
            while(tmp2 != NULL && tmp2 != tmp){
                tmp2 = tmp2->next;
            }
    
            ne =(struct person*) malloc(sizeof(struct person));
            char *nam;
            nam = (char*)malloc(sizeof(char)*10);
            ne->name = nam;
    strcpy(ne->name,tmp2->name);
            ne->next = NULL;
            b2=b;
    
            while(b2 != NULL){
                b2=b2->next;
    
            }
    
            b2->next = ne;
            tmp = tmp2;
        }
        return b;
    }
    
    int main(void) {
    struct person p3 = {"Schulze", NULL};
    struct person p2 = {"Meier", &p3};
    struct person p1 = {"Kohl", &p2};
    struct person *liste = &p1;
    drucke(liste); /* Kohl Meier Schulze */
    drucke(invertiere(liste)); /* Schulze Meier Kohl */
    return 0;
    }
    

    wieso geht in Zeile 38 der strcpy nicht? Sind doch beides mal die adresse? Speicher auch angelegt... hmm



  • Du meinst Zeile 40?
    Wie kommst du darauf das das strcpy nicht funktioniert?

    Wird bei drucke etwas falsches ausgegeben?

    Das kann daran liegen, das du in invertiere das b zurück gibst.
    Und ich kann nirgends sehen, das du b einen Wert zuweist.



  • DirkB schrieb:

    Du meinst Zeile 40?
    Wie kommst du darauf das das strcpy nicht funktioniert?

    Wird bei drucke etwas falsches ausgegeben?

    Das kann daran liegen, das du in invertiere das b zurück gibst.
    Und ich kann nirgends sehen, das du b einen Wert zuweist.

    Ich hab einen Print nach jeder Zeile abgesetzt und nach 40 hat er den nicht mehr angezeigt und ist abgestürzt... aber ist jetz auch wayne 😉

    Prüfung ist rum, lief ganz ok - danke für deine Hilfe!


Anmelden zum Antworten