2016-04-27 2 views
-1

Ich arbeite an einem Projekt, das ein n-Wege-assoziatives Cache-Mapping simuliert. Das Problem tritt jedoch auf, wenn versucht wird, das Array Adresse [i] in einer nachfolgenden Gleichung zu verwenden. Ich verstehe nicht, warum das Array nicht erhalten bleibt. Jede Hilfe würde sehr geschätzt werden. Ich bin nicht der Beste mit C-Codierung. Im Moment besteht das Problem darin, aus der Datei zu lesen und diese Werte in Arrays zu scannen. Alles andere, wovon ich überzeugt bin, kann ich herausfinden.Beim Parsen mit sscanf bleiben die Arrays für die nachfolgende Verwendung nicht erhalten

Hier ist der Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 


/*global variables */ 
int mainSize, cacheSize, blockSize, cmSet, cnumBlocks, mnumBlocks,address[50],mmBlkNum[50], mappedCMset[50],hit_miss[50],address[50]; 
char mode[50]; 
int totMemRefs=0; 


int main(void) 
{ 
    /*Variables */ 

    int i; 
    char replacePolicy; 
    char filename[50]; 
    char *result = NULL; 
    char line[50]; 
    FILE *fp; 
    fp = fopen(filename, "r"); 


    /*Gathers input from user */ 
    printf("Enter the main memory size between between 4 and 32K bytes: "); 
    scanf("%d",&mainSize); 
    if (mainSize < 4 || mainSize > 32768) 
    { 
     printf("Invalid main memory size."); 
     //errorCheck() 
    } 

    printf("Enter the size of the cache between 2 and 32K bytes: "); 
    scanf("%d", &cacheSize); 
    if (cacheSize < 2 || cacheSize > 32768) 
    { 
     printf("Invalid cache memory size."); 
     //errorCheck() 
    } 


    printf("Enter the size of the block/line between 2 and 32K bytes: "); 
    scanf("%d",&blockSize); 
    if (blockSize < 2 || blockSize > 32768) 
    { 
     printf("Invalid block/line size."); 
     //errorCheck 
    } 

    printf("Enter the degree of set-associativity: "); 
    scanf("%d", &cmSet); 


    cnumBlocks = cacheSize/blockSize; 
    printf("Number of blocks in cache = %d\n", cnumBlocks); 

    mnumBlocks = mainSize/blockSize; 
    printf("Number of blocks in main memory = %d\n", mnumBlocks); 

    printf("Enter replacement policy (L = LRU, F = FIFO): "); 
    scanf("%s", &replacePolicy); 




    printf("Enter the name of the file containing the list of memory referenced: "); 
    scanf("%s", filename); 


    /* checks if filename is valid/exits */ 
    if ((fp = fopen(filename, "r")) == NULL) 
    { 
     printf("Invalid input."); 
     //errorCheck(); 
    } 

    /* gets total number of mem references from first line of file and stores in variable totMemRefs*/ 
    fgets(line,sizeof(line),fp); 
    result = strtok(line,"\n"); 
    totMemRefs = atoi(result); 
    printf("Total Mem Refs = %d\n", totMemRefs); 


    /*skips second line of white space */ 
    fgets(line, sizeof(line),fp); 

    i=0; 
    //reads each line of file and tokenizes into mode and address 
    while (fgets(line, sizeof(line), fp)!=NULL) 
    { 

     if (sscanf(line,"%s %d",&mode[i],&address[i]) == 2) 
     { 
      printf("Mode: %c Address: %d\n",mode[i],address[i]); 
      i++; 
     } 


    }//end of parsing while loop 

    fclose(fp); //close file after reading 


    for (i=0; i<totMemRefs; i++) 
    { 
     /* calculates the corresponding block number of the address */ 
     mmBlkNum[i]=address[i]/blockSize; 

     /* calculates the corresponding cache mem set that mm block is in */ 
     mappedCMset[i]=mmBlkNum[i]%cnumBlocks; 
     printf("Mode = %c Address = %d MM Block Num = %d Cm Set = %d\n", mode[i],address[i],mmBlkNum[i],mappedCMset[i]); 

    } 

}//end of main 

Dies ist der Inhalt des example_test_data.txt:

6 

R 0 
R 1 
R 4 
R 36 
R 0 
R 4 

Dies sind die Merkmale des Hauptspeichers und Cache-Speicher sind:

main mem size = 128 bytes 
cache mem size = 32 bytes 
block size = 4 bytes 
set associativity = 2 
filename = example_test_data.txt 

Dies ist die Ausgabe für die Arrays in der While-Schleife:

Mode: R Address: 0 
    Mode: R Address: 1 
    Mode: R Address: 4 
    Mode: R Address: 36 
    Mode: R Address: 0 
    Mode: R Address: 4 

Dies ist die Ausgabe für die Arrays nach Parsing - in der folgenden for-Schleife:

Mode = R Address = 4 MM Block Num = 1 Cm Set = 1 
    Mode = Address = 0 MM Block Num = 0 Cm Set = 0 
    Mode = Address = 0 MM Block Num = 0 Cm Set = 0 
    Mode = Address = 0 MM Block Num = 0 Cm Set = 0 
    Mode = Address = 0 MM Block Num = 0 Cm Set = 0 
    Mode = Address = 0 MM Block Num = 0 Cm Set = 0 

Wie Sie sehen können, die zweite Iteration der Modus und Adressfelder sind nicht die gleichen wie die Einsen in der Datei while-Schleife. Ich bin verwirrt, warum das der Fall ist. Ich habe versucht, so beschreibend wie möglich zu sein. Ich weiß auch nicht, warum das Format nicht angezeigt wurde. Tut mir leid, wenn das das Lesen erschwert. Auch hier wird jede Hilfe oder jeder Schritt in die richtige Richtung sehr geschätzt!

EDIT: Die Ausgabe sollte:

Mode = R Address = 0 MM Blk Num = 0 CM Set = 0 
    Mode = R Address = 1 MM Blk Num = 0 CM Set = 0 
    Mode = R Address = 4 MM Blk Num = 1 CM Set = 1 
    Mode = R Address = 36 MM Blk Num = 9 CM Set = 1 
    Mode = R Address = 0 MM Blk Num = 0 CM Set = 0 
    Mode = R Address = 4 MM Blk Num = 1 CM Set = 1 

Ich kenne die Gleichungen ich die richtigen Werte erhalten müssen. Ich weiß, wie man diese von Hand bearbeitet, kein Problem. Also zu wissen, was das Ergebnis sein sollte, ist nicht das Problem. Zuvor habe ich fscanf und strtok verwendet und keiner von beiden hat die gewünschten Ergebnisse erzielt. Grundsätzlich funktioniert es, wenn ich es während des Scannens in der while-Schleife drucke, aber die Werte in den Arrays sind nicht gleich, wenn ich versuche, mmBlkNum und gemappedCMset zu berechnen.

Code wurde aktualisiert !!

+0

Sie müssen etwas arbeiten, um ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen. Niemand wird auf deine Codewand schauen. Wenn Sie das minimale vollständige Beispiel herausfinden, das Ihr Problem zeigt, helfen Sie uns nicht nur, aber es gibt eine gute Chance, dass Sie das Problem selbst finden. – davidbak

+0

@davidbak Ich habe Tage damit verbracht, das Problem sowie verschiedene Methoden zu finden, um das Ziel zu erreichen, und immer noch ohne Erfolg. Ich weiß, was der Code tun soll, und ich habe ein Beispiel für korrekte Ausgabe hinzugefügt, aber ich sehe das Problem nicht. Danke für den Kommentar trotzdem. – Tmphillips

+0

Ich würde das Gegenteil von Davidbak sagen. Der Code ist nicht so lang, aber es ist kein vollständiges und überprüfbares Beispiel. Bitte stellen Sie ein ** vollständiges ** Programm zur Verfügung, das kompiliert und getestet wurde, um sicherzustellen, dass es die von Ihnen angegebenen Ausgaben erzeugt (manchmal entfernen Leute Code, um ihn kleiner zu machen und ein Programm ohne Fehler in seiner Frage zu veröffentlichen)). – jdarthenay

Antwort

0

Erster Fehler sehe ich:

scanf("%s", &filename); 

mit korrektem Argumente ersetzen:

scanf("%s", filename); 

Bitte kompilieren mit -Wall so diesen Dingen wird durch den Compiler gesagt werden. Kombinieren mit -Werror. -Wextra wird ebenfalls empfohlen.

Mein complier Ausgang mit Ihrem Programm:

stackoverflow.c: In function 'main': 
stackoverflow.c:246:11: error: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[50]' [-Werror=format=] 
    scanf("%s", &filename); 
     ^
cc1.exe: all warnings being treated as errors 

Zweiter Fehler sehe ich: Sie setzen alle auf denselben Index i = 0 in Ihrer while Schleife lesen.Verwenden Sie entweder eine for oder benutzen while richtig:

i = 0; 
    while (fgets(line, sizeof(line), fp)!=NULL && i < totMemRefs) 
    { 
     if (sscanf(line,"%s %d",&mode[i],&address[i]) == 2) 
     { 
      printf("Mode: %c Address: %d\n",mode[i],address[i]); 
      i++; 
     } 


    }//end of parsing while loop 

    if (i < totMemRefs) 
    { 
     fprintf(stderr, "Missing inputs.\n"); 
     return 1; 
    } 

Auch habe ich Überprüfung Eingabe nicht über die Anzahl von Eingaben geht Benutzer, sagte er zur Verfügung stellt und die Überprüfung Benutzer alle Linien liefern. Erwägen Sie so etwas wie die am Anfang des Programms:

#define MAX_INPUT_LINES 50 

und verwendet MAX_INPUT_LINES statt 50.

+0

Obwohl ich aufgrund meines schlechten Rufes nicht antworten kann, schätze ich es sehr, dass Sie sich die Zeit genommen haben, durch meinen Code zu gehen !! @jdarthenay Ich habe nicht viel Erfahrung mit C, aber mit der Hilfe von Menschen, die bereit sind, ein wenig ihrer Zeit zu widmen, lerne ich !! Danke nochmal! – Tmphillips

+0

@Tmphillips Wenn meine Antwort Ihr Problem löst, sollten Sie es akzeptieren, es sollte irgendwo unter dem Ergebnis meiner Antwort sein. – jdarthenay

Verwandte Themen