if löscht array???



  • 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