Wie kopiert man float in strukturen???



  • Hallo Community,
    also mein problem ist folgendes:
    Ich habe eine Struktur mit verschiedenen variablentypen.(char, int und float).

    struct Artikeldaten
    {
        char artnummer[MAX];
        char artbezeich[MAX];
        int istmenge;
        int sollmenge;
        int mengensta1;
        int mengensta2;
        int mengensta3;
        int mengensta4;
        float rabatsta1;
        float rabatsta2;
        float rabatsta3;
        float rabatsta4;
        float einkpreis;
        float durchpreis;
        float verkpreis;
        char liefartnr[MAX];
        char lnummer[MAX];
        char lvorname[MAX];
        char lnachname[MAX];
        char ltelefon[MAX];
        char lfax[MAX];
    }artikel[100];
    

    Die eingabe und das speichern habe ich hinbekommen.
    Aber jetzt will ich eine löschfunktion haben und da bekomme ich problem.
    Meine löschfunktion läuft folgendermaßen ab:

    void ArtLoeschen(int nra)
    {
        for (x = nra; x < Anz_A; x++)
        {
            strcpy(artikel[x].artnummer, artikel[x+1].artnummer);
            strcpy(artikel[x].artbezeich, artikel[x+1].artbezeich);
            strcpy(artikel[x].istmenge, artikel[x+1].istmenge);
            strcpy(artikel[x].sollmenge, artikel[x+1].sollmenge);
            strcpy(artikel[x].mengensta1, artikel[x+1].mengensta1);
            strcpy(artikel[x].mengensta2, artikel[x+1].mengensta2);
            strcpy(artikel[x].mengensta3, artikel[x+1].mengensta3);
            strcpy(artikel[x].mengensta4, artikel[x+1].mengensta4);
            strcpy(artikel[x].rabatsta1, artikel[x+1].rabatsta1);
            strcpy(artikel[x].rabatsta2, artikel[x+1].rabatsta2);
            strcpy(artikel[x].rabatsta3, artikel[x+1].rabatsta3);
            strcpy(artikel[x].rabatsta4, artikel[x+1].rabatsta4);
            strcpy(artikel[x].einkpreis, artikel[x+1].einkpreis);
            strcpy(artikel[x].durchpreis, artikel[x+1].durchpreis);
            strcpy(artikel[x].verkpreis, artikel[x+1].verkpreis);
            strcpy(artikel[x].liefartnr, artikel[x+1].liefartnr);
            strcpy(artikel[x].lnummer, artikel[x+1].lnummer);
            strcpy(artikel[x].lvorname, artikel[x+1].lvorname);
            strcpy(artikel[x].lnachname, artikel[x+1].lnachname);
            strcpy(artikel[x].ltelefon, artikel[x+1].ltelefon);
            strcpy(artikel[x].lfax, artikel[x+1].lfax);
        }
        Anz_A--;
        HelpToArtikel(nra);
        ArtikellMenu(0,0);
    }
    

    Damit sollen alle nachfolgenden Arrays um eins hoch kopiert werden und der letzte wird gelöscht, was auch funktioniert solange nur chars in der struktur enthalten sind.
    Jetzt bekomme ich aber bei den int arrays schon eine warnung
    1358|warning: passing arg 1 of strcpy' makes pointer from integer without a cast| 1358|warning: passing arg 2 ofstrcpy' makes pointer from integer without a cast|

    und für die float arrays folgende abruchursache:
    1370|error: incompatible type for argument 1 of strcpy'| 1370|error: incompatible type for argument 2 ofstrcpy'|

    Nun meine frage, wie kann ich die int und float arrays um eins hoch kopieren?
    Oder wie kann ich überhaupt ein floatarray in ein anderes floatarray kopieren?
    BS = WinVista
    Compiler = CodeBlocks(MinGW)

    Ich hoffe das ist alles vernünftig gepostet und schonmal
    danke für eure hilfe

    Sorry hatte vergessen zu schreiben: Mit memcpy habe ichs auch versucht
    und das klappt auch nicht. Auch sprintf hatt nicht funktioniert aber das kann auch an falscher programierung gelegen haben!!!



  • wtf?



  • Mal ne schüchterne Frage: Wie lange programmierst du schon C? Dein Code ist ja Horror!
    string funktionen (fangen mit str an) sind dazu da mit strings zu arbeiten... Zahlen kann man seit eh und je mit a=b kopieren.
    Schau dir doch mal die Funktion

    memset
    

    an... kann dir einige Zeilen Code ersparen.



  • Also ich programmiere seit ca 2 bis 3 monaten.
    Aber ich gebe zu ich habe mich mit einer kompletten Firmenverwaltung
    die mit Masken arbeitet und eine endlosschleife für eine permanente Tastaturabfrage hat, etwas überfordert.
    Aber ich will das fertig bekommen und nicht mittendrin aufhören.
    Und in wie fern ist mein code horror????Du kennst ja nur das bisschen was ich gepostet habe!!!
    Habe nun versucht:
    artikel[x].rabatsta1 = artikel[x+1].rabatsta1;(klappt auch nicht)
    schaue mir jetzt erstmal das mit dem memset an.Vieleicht bringts mich ja weiter.

    Danke trotzdem
    XcrAckX



  • Die sollen doch um eins hoch kopiert werden,
    also eher

    artikel[x].rabatsta1 = artikel[x-1].rabatsta1;
    

    Dabei muss die Schleife allerdings rückwärts laufen
    also

    for (x = Anz_A-1; x >= nra; --x)
    

    sonst kopierst du den 1. Wert einfach nur bis nach oben durch.



  • Nein sie sollen um eins runter kopiert werden also, array[0] bekommt den inhalt von array[1] und array[1] den inhalt von array[2] und array[2] den inhalt von array[3]. array 3 wird gelöscht.

    Ich habe das selbe prinzip schon für Kundenadressen. Da funktioniert das wunderbar weil alles nur chararrays sind. Hier kommen aber auch int und float arrays dazwischen und da funzt es halt mit strcpy nicht weil strcpy ja zum kopieren von strings gedacht ist.



  • Sorry memset war falsch, wollte memcpy schreiben. memset ist zum löschen...
    Das Tastenturabfrage würde ich dir einen Separaten Thread empfehlen, wenn du nicht schon einen Hast...
    Horror ist gemaint, weil du jeder einzelne Member einer Struktur kopierst, anstat mit

    memcpy(&artikel[1],&artikel[0],sizeof(Artikeldaten));
    

    alles auf einmal zu kopieren...



  • jo super, ich danke dir vielmals. Das ist auch eine viel bessere und einfachere
    art und weise als meine.
    Naja ich lerne jeden tag dazu 😉
    Besten Dank nochmal, klappt wunderbar!!!



  • Schreib doch

    typedef struct
    {
    ...
    ...
    }TagArtikel;
    TagArtikel tagArtikel[100];
    

    Dann kannst du TagArtickel as grösse nehmen... So mache ich das normalerweise.

    Gruss Binggi



  • Strukturelemente zu kopieren, nur um ein Element zu löschen, ist viel zu rechenintensiv, also ineffizient.
    Man macht es häufig so, dass man einem Strukturelement einen bestimmten Wert zuweist, der sonst nicht in den Nutzdaten vorkommen kann und damit die Struktur als gelöscht markiert.
    Hier wäre eventuell die Verwaltung der Artikeldaten in einer verketteten Liste oder einem Array vom Typ struct Artikeldaten** von Vorteil.



  • XcrAckX schrieb:

    Nein sie sollen um eins runter kopiert werden also, array[0] bekommt den inhalt von array[1] und array[1] den inhalt von array[2] und array[2] den inhalt von array[3]. array 3 wird gelöscht.

    Ich habe das selbe prinzip schon für Kundenadressen. Da funktioniert das wunderbar weil alles nur chararrays sind. Hier kommen aber auch int und float arrays dazwischen und da funzt es halt mit strcpy nicht weil strcpy ja zum kopieren von strings gedacht ist.

    Trotzdem sprengst du mit dem Index x+1 die Arraygrenze, wenn Anz_A die Anzahl der Strukturen ist.



  • memcpy(&artikel[1],&artikel[0],sizeof(Artikeldaten));
    

    Das wird so nichts.
    Eher

    memmove(artikel,&artikel[1],99*sizeof(*artikel));
    

    Für solche Sachen gibt es memmove, memcpy führt sehr wahrscheinlich zu Fehlern!



  • Binggi schrieb:

    Sorry memset war falsch, wollte memcpy schreiben. memset ist zum löschen...
    Das Tastenturabfrage würde ich dir einen Separaten Thread empfehlen, wenn du nicht schon einen Hast...
    Horror ist gemaint, weil du jeder einzelne Member einer Struktur kopierst, anstat mit

    memcpy(&artikel[1],&artikel[0],sizeof(Artikeldaten));
    

    alles auf einmal zu kopieren...

    und funktioniert hats nicht weil die cpy funktionen einen pointer erwarten, also müsste den variablen & vorangestellt werden. wie hieß das, Variablen refferenzieren oder derefferenzieren?


Log in to reply