2010-07-21 4 views
0

Puis-je toujours supposer que si ...mémoire programme Problème

int main() 
{ 
    ... 
    foo1(); 
    foo2(); 
    foo3(); 
    ... 
    return 0; 
} 

que foo1() précédera toujours foo2() et foo2() précédera toujours foo3() à la fin du programme (en référence à l'abstraction le plus élevé d'achèvement)? Dans mon programme actuel, si foo2() et foo3() se produisent, cela dépend si foo1 est une fonction très "longue", c'est-à-dire s'il y a un géant pour la boucle dans foo1(), arriver à la fin du programme, foo2(), et foo3() ne se produisent pas. Dans mon programme, foo1() - foo3() accède à la même carte. f001() initialise tous les éléments utilisables dans la carte et foo2(), foo3() puis remplace les initialisations par les données d'alias lues dans les fichiers. Une raison pour laquelle cela se passe?

Voici les 2 fonctions, le reste du programme est sortof grand et hors sujet:

void loadDEADBEEF() 
{ 
    for (long long i=0; i<=268435888; i+=4)//268435888 
    { 
      MainMemory[i] = 3735928559; 
      HEXMainMemory[i] = "DEADBEEF"; 
    } 
} 

void LoadMemory(string str)//load hex dump into memory 
{ 
    filecounter++; 
    vector<int> V;//temperary vector 
    vector<string> tempV;//temperary vector 
    ifstream inClientFile(str.c_str(),ios::in); //stream object 
    vector<string> words; 
    string word; 
    int offset=0; 
    if (!inClientFile) cerr << "File couldn't be opened" << endl;//test if instruction file can be opened 
    //fill string vector with all file values and determines length of program 
    while (inClientFile >> word)words.push_back(word);//capture raw code from file 
    const int wordCount=words.size();//determine most efficient sizing for vectors 
    tempV.reserve(wordCount);//size vector 
    for(int i=0; i<wordCount; i++) 
    { 
     if (i==0 && words[i].length()==10) tempV.push_back(words[i]);//include first word to obtain data offset (memory insertion point) 
     if (words[i].length()==8 
       && words[i].find(".")==string::npos) 

      tempV.push_back(words[i]);//cut out undesired strings from vector 
    } 
    for(int y=2; y<10; y++) offset+=hexCharValue(tempV[0][y])<<(4*(9-y));//convert offset from hex to decimal 
    tempV.erase(tempV.begin());//delete offset from vector 
    V.resize(tempV.size());//resize vector 
    for(int j=0; j<tempV.size(); j++)//convert string hex to numerical decimal 
    { 

     for(int y=0; y<8; y++) V[j]+=hexCharValue(tempV[j][y])<<(4*(7-y));//4194608+4* 
     if (load_memory) 
     { 
      MainMemory.insert(mapType::value_type(4*j+offset,V[j]));//insert (location in memory,data) 
      HEXMainMemory.insert(pair<int, string>(4*j+offset,tempV[j])); 
     }  
    } 
    if(filecounter == 1) PC_start = offset-4; 
} 

Ainsi, la première fonction est « toto1() » et le second est « foo2() ». Voici la principale:

#include 
... 
typedef map<int, int> mapType;//format of map: (address, data) 
typedef map<int, string> mapType2;//format of map: (address, data) 
mapType MainMemory; 
mapType2 HEXMainMemory; 
... 
int main(int argc, char **argv) 
{ 
    ... 
    loadDEADBEEF(); 
    LoadMemory("hello_1.txt");//reginfo 
    ... 
    return 0; 
} 
+0

Est-ce que 'foo1()' fait quelque chose avec plusieurs threads?S'il n'y a aucun threading, 'foo2()' et 'foo3()' seront exécutés séquentiellement après 'foo1()' comme terminé. S'il y a des discussions, tous les paris sont désactivés et la réponse est un peu plus compliquée. – mjschultz

+0

Vous faites allusion à la mémoire dans le titre, mais votre question ne mentionne pas du tout l'utilisation de la mémoire. Est-ce qu'il manque quelque chose? –

+0

Est-ce que foo1 déborde une variable globale qui affecte alors foo2 et foo3? Essayez un débogueur et placez un point d'arrêt à la fin de foo1 et commencez le traçage; voir ce qui se passe. – Rich

Répondre

1

sans code réel est très difficile vous aider.

utilisation « impression » sorties à suivre votre code (déversoir, mais aide)

si vous n'utilisez des fils foo2 .. Foon se produira, sauf que certains sortie anormale se produit. pour vérifier cette impression d'utilisation ou quelque chose d'autre à "trace" où votre programme sont.

+0

On dirait que foo1 2 et 3. Peut-être que le problème est dans le foo2 n'est pas capable d'écrire dans la mémoire des éléments remplis de deadbeef pour une raison quelconque ... –

+0

Si un pointeur a la valeur 0xdeadbeef, cela signifie qu'il est probablement invalide. Vous devriez vérifier pour vous assurer que tout votre point Les initiales sont initialisées correctement. –

0

Oui, ils apparaîtront toujours dans cet ordre.

Vous voulez afficher les résultats de votre code qui montrent comment cela ne se passe pas?

+0

Il est peut-être beaucoup plus rapide de le décrire ... J'ai beaucoup arbitré mon programme ... Fondamentalement, foo1 charge" deadbeef " "dans un tas d'éléments de mémoire dans une carte, alors foo2 et 3 chargent la même carte de mémoire avec des données réelles si nécessaire (remplaçant ainsi le deadbeef.) Malheureusement, le deadbeef est dans les emplacements de mémoire où foo2 aurait dû écrire. N'écrivez pas dans la mémoire correctement ... –

1

En supposant que vous n'avez pas de threads ou quoi que ce soit, vous pouvez toujours supposer que foo1() arrivera avant foo2(), ce qui arrivera aussi avant foo3().

Vous pouvez vérifier cela en utilisant un débogueur ou la console. Essayez de mettre cela dans chaque fooX():

std::out << "This is foo1()" << std::endl 
0

foo2 et foo3 aura toujours lieu à moins que quelque chose avant leurs invocations (comme dans foo1) provoque le programme pour sortir (très probablement anormalement).

0

Si foo2() et foo3() ne sont pas en cours d'exécution, il est probable que foo1() lève une exception ou quitte l'application. Comme une étape de débogage, vous pouvez essayer d'envelopper foo1() dans un bloc try...catch.

1

Votre programme se termine-t-il proprement lorsque foo1() a une 'grosse boucle'? Pouvez-vous poster le code? Il est possible que le gros cas de boucle cause un crash et donc foo2() et foo3() ne s'exécutent jamais.

0

C'est le genre de problème où un débogueur serait probablement utile. Je suggère de placer des points d'inflexion dans des endroits stratégiques pour déterminer où l'exécution du programme se termine une fois que foo1 est terminée. Ma conjecture serait que le programme se termine au milieu de foo1 en raison d'un appel à exit ou un accident.