if löscht array???



  • In dem Array sind daten wenn ich das if auskommentier wird alles ordentlich angezeigt lass ich das if drinnen wird bei process[z][2] immer 0 angezeigt und nachdem einmal process[z][1] angezeigt wurde (mit wert) bricht er ab (ohne if 10 ausgaben mit if nur 7)

    Is ziemlich langer text, gruß HiFish

    while(process[z][0] !=0)
                    {
                    //      if(pro[z]>=anf  && pro[z]<=end)
                            {
                                    printf("PID: %d\n",process[z][0]);
                                    printf("CPUT: %d\n",process[z][2]);
                                    printf("WALLT: %d\n",process[z][1]);
                                    printf("CPUT/WALLT: %d\n\n",pro[z]);
                            }
                            z++;
                    }
    

    Ausgabe mit if:

    PID: 800539
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 800739
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 800771
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 806604
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 806605
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 806610
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 880149
    CPUT: 0
    WALLT: 41700
    CPUT/WALLT: 0
    

    Ausgabe ohne if: (das die Walltime bei 7 net ganz uebereinstimmt ist ok da ich das hier paar sec später abgerufen hab)

    PID: 800539
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 800739
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 800771
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 806604
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 806605
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 806610
    CPUT: 0
    WALLT: 0
    CPUT/WALLT: 0
    
    PID: 880149
    CPUT: 0
    WALLT: 41820
    CPUT/WALLT: 0
    
    PID: 886785
    CPUT: 34205
    WALLT: 343562
    CPUT/WALLT: 0
    
    PID: 886786
    CPUT: 24963
    WALLT: 343504
    CPUT/WALLT: 0
    
    PID: 892730
    CPUT: 31444
    WALLT: 264663
    CPUT/WALLT: 0
    
    PID: 892732
    CPUT: 30601
    WALLT: 264663
    CPUT/WALLT: 0
    


  • Erklär mal bitte genau was du erwartest und was passiert. Ich kann mit den beiden Ausgaben nicht viel Anfangen.



  • Ich erwarte bei den Elementen eigentlich das gar keines zurückkommt wenn das if da ist (da ich oben den wert con C/W zwischen 0.9 un 1.0 defeniert habe). Und da ich die C/W gar net ausrechnen lass (die produziert auch komische sachen) ist die ueberall 0 also duerfte gar nixs kommen bei gesetztem if, was mich nur wundert wieso setzt das if die CPU-Time auf 0 ?!? un bricht dann bei der ersten vorhandenen Walltime ab ?!?

    2.tes problem

    proz[i]=process[i][2]/process[i][1]
    

    Das ist die Zeile die die C/W Berechnen soll wenn ich die drinnen lass (ohne das if) wird in der ausgabe die Walltime ueberall auf 1 gesetzt un C/W is dann logischerweise die Cputime. Ich hab echt keine ahnung wieso un weshalb das passiert ?!?!?!
    Vielleicht sieht ja jemand irgendwie den Fehler
    Gruß HiFish



  • jetzt mal langsam und von vorne. keiner kann dir folgen.

    was ist gegeben, was soll rauskommen?
    gib uns code (kompilierbar), mit dem wir selbst sehen, was los ist.
    aber wenns geht nicht dein gesamtes projekt, sondern ein reduziertes beispiel.

    http://www.lugbz.org/documents/smart-questions_de.html
    mach es uns einfach, dir zu helfen.



  • den code habe ich leider nicht hier zuhause sondern nur in der Firma,
    im Array process[10000][3] stehen die Prozess ID die verbrauchte CPU Zeit und die Zeit die der Job schon anliegt (Walltime):

    process[i][0]= PID
    process[i][1]=Cpu Zeit
    process[i][2]=Walltime

    Im Array proz[10000] steht die CPU Zeit/Walltime.

    Die Daten stehen da alle ordentlich drinne wenn ich sie nicht filtern bzw die C/W ausrechne kann ich sie ohne probleme ausgeben.

    Die Zeile:

    proz[z]=process[i][1]/process[i][2];

    rechnet die C/W aus, ist sie nicht auskommentier wird in der Ausgabe die Walltime durch 1 ersetzt und die C/W ist damit gleich der CPU Zeit
    C/1 =C.
    (Und es liegt nur an der Zeile wo ich obendran geschrieben hab ist die auskommentiert werden die Daten ganz normal ausgegeben nur die C/W is dann halt 0 weil sie ja nicht berechnet wird.)

    2. Problem da es ja bis zu 10k Prozesse gibt soll man die filtern können mit den Variablen "anf" und "end" die im Methodenkopf uebergeben werden bei den Ausgaben war anf=0.9 und end = 1.0, und mit dem if soll gefiltert werden, nur wenn ich das nicht auskommentier gibt er alle Prozesse aus (die wo noch am warten sind) bis einer kommt der bereits bearbeitet wurde d.h. schon min. Walltime besitzt (gegebenenfalls auch eine CPU-zeit), nach dieser Ausgabe bricht er dann ab.

    Also ich hab früher noch nie erlebt das eine stinknormale Division ein array löscht oder ein if sich so komisch verhält ?!?

    Ich hoffe man verseht es jetzt halbwegs an den Code komm ich erst wieder am Montag ran.

    Gruß HiFish



  • ich wette, du blickst durch deinen code nicht mehr durch...

    ne division ist nicht daran schuld. dein fehler ist ganz wo anders.
    ganzen code bitte, wenns geht reduziert aber funktionstuechtig.

    im uebrigen hat ansi c keine methoden oder klassen, sondern nur funktionen.



  • Hier ist der Code ist zwar nicht kompilierbar, würde aber eh nichts nuetzen da ihr ja die prozesse net abfragen könnt. Probleme sind dieselben wie vorher, die C/W wird nicht ausgrechnet etc.

    int cpu_wall(float anf,float end)
    {
            system("qstat>prozessliste");
            system("touch temp_proz");
    
            int i=0,pid=0,z=0;
            char s [6]="";
            char sys [27]="";
            char platzhalter[100]="";
            int  process[10000][3];
            //process[x][0]=PID
            //process[x][1]=Walltime
            //process[x][2]=CPUtime
            float pro[10000]; //C/W
            float x=0,y=0;
            FILE *fp;
            FILE *proz;
    
            fp = fopen("prozessliste","r");
            proz=fopen("temp_proz","w");
    
            if(fp == NULL)
            {
                    printf("Can't open file! \n Check File ~/prozessliste");
                    return(-1);
            }else
            {
                    fgets(platzhalter,100,fp);
                    fgets(platzhalter,100,fp);
                    while(feof(fp)==0 && i<20)
                    {
                            fgets(s,7,fp);
                            fgets(platzhalter,100,fp);
                            strcat(sys,"qstat -f ");
                            strcat(sys,s);
                            pid=atoi(s);
                            strcat(sys," >temp_proz");
                            system(sys);
             /*               printf("PID: %s\n",s);
                            printf("CPUT: %d\n",getcpu());
                            printf("WALLT: %d\n",getwall());
            */              process[i][0]=pid;
                            process[i][1]=getwall();
                            process[i][2]=getcpu();
                            if(process[i][1]!=0)
                            {
                                    x=process[i][2];
                                    y=process[i][1];
                                    pro[i]=(float)(x/y);
                            }
    
                            printf("PID: %d\n",process[i][0]);
                            printf("CPUT: %d\n",process[i][2]);
                            printf("WALLT: %d\n",process[i][1]);
                            printf("C/W: %d\n\n",pro[i]);
    
                            strcpy(sys,"");
                            i++;
                    }
                    fclose(fp);
                    fclose(proz);
    
            }
    //      system("rm prozessliste");
    //      system("rm temp_proz");
            return(0);
    }
    

    EDIT:
    Hab den code aktualisiert.



  • HiFish schrieb:

    Hier ist der Code ist zwar nicht kompilierbar, würde aber eh nichts nuetzen da ihr ja die prozesse net abfragen könnt. Probleme sind dieselben wie vorher, die C/W wird nicht ausgrechnet etc.

    Kein Wunder, wenn du die Berechnung auskommentierst - pro wird nicht initiatilisert und enthält deshalb undefinierte Werte (= irgendwas).



  • ja das hab ich grad eben auskommentiert um was zu testen, aber auch wenns nicht auskommentiert wird steht ueberall 0 drinnen.

    EDIT: habs jetzt ma abgaendert un es mit 2 float variablen probiert:

    if(process[i][1]!=0)
                            {
                                    x=process[i][2];
                                    y=process[i][1];
                                    pro[i]=(float)(x/y);
                            }
    

    Die Ausgabe davon is jedoch nach wie vor falsch:

    PID: 926029
    CPUT: 122
    WALLT: 308643
    C/W: 0
    
    PID: 937782
    CPUT: 784
    WALLT: 231123
    C/W: -1610612736
    
    PID: 937783
    CPUT: 842
    WALLT: 231123
    C/W: -1610612736
    
    PID: 938729
    CPUT: 2
    WALLT: 221885
    C/W: -2147483648
    


  • versuch's mal mit Gleitkomma-Arithmetik: "pro[i]=(float)process[i][2]/process[i][1];" - bei der Division zweier ganzer Zahlen wird der Nachkomma-Teil abgeschnitten, also bleibt dort höchstwahrscheinlich eine 0 übrig.



  • geht auch nicht -.-



  • Für float gibt es eine eigene Format-Kennung, "printf("C/W: %d\n\n",pro[i]);" interpretiert den Wert als Integer-Zahl - und da kann nur Müll herauskommen. Versuch's stattdessen mal mit "printf("C/W: %f\n\n",pro[i]);". (eventuell auch mit Präzisionsangabe, siehe man: printf(3))



  • omg *kopf an die wand hau* doofheit tut weh -.-

    danke jetzt gehts!


Anmelden zum Antworten