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 !!
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
@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
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