getc in parallel programmierung
-
Du hast recht. Es ist ein Nullzeiger. Warum weiß ich es aber nicht.
Ich habe fopen in if klausel geschoben. Trotzdem liefert NULLIch bin sicher dass die Datei existiert. Ich habe es zuerst normal programmiert danach parallelisiert. Es hat vor der parallelisierung geklappt also die Datei ist da.
Ich mach irregendwo beim Parallelisierung ein Fehler.
Bitte HILFE
-
disconnectus schrieb:
FILE *fp1, *fopen();
Was soll das '*fopen()' hier? Mach das mal weg.
-
Ich habe es weggemacht. Trotzdem kriege ich ein Null beim fopen().
Das Problem muss mit der parallelisierung zu tun haben.
-
Glaub ich nicht. Zum Zeitpunkt des fopen ist doch noch gar nichts anderes passiert ...
-
Belli schrieb:
Glaub ich nicht. Zum Zeitpunkt des fopen ist doch noch gar nichts anderes passiert ...
was meinst du?
Falls ich die Paralleliseirung auskommentiere (wie es daunten aussieht) und das Program mit normalem Kompiler ausführe, läuft alles ganz gut. Ich kann den Wert bekommen.
#include <stdio.h> #include <math.h> #include "mpi.h" int a; int rank; int size; FILE *fp1; main (int argc, char* argv[]) { fp1 = fopen("garb34", "rb"); a = getc(fp1); printf("%d\n", a); //MPI_Init (&argc, &argv); //MPI_Comm_rank(MPI_COMM_WORLD, &rank); //MPI_Comm_size(MPI_COMM_WORLD, &size); // //if (rank==1 ) { // a = getc(fp1); // printf("%d", a); //} // //MPI_Finalize(); }
-
disconnectus schrieb:
Ich habe es weggemacht. Trotzdem kriege ich ein Null beim fopen().
Das Problem muss mit der parallelisierung zu tun haben.
Lass doch mal die Systemfehlermeldung ausgeben, falls fp == NULL ist, z.B.
perror("garb34");
-
disconnectus schrieb:
Belli schrieb:
Glaub ich nicht. Zum Zeitpunkt des fopen ist doch noch gar nichts anderes passiert ...
was meinst du?
Ich meine, daß die Parallelisierung doch erst mit den Instruktionen nach dem fopen() beginnt. Deshalb würde es mich sehr wundern, wenn diese Instruktionen Auswirkungen auf den vorher durchgeführten fopen haben sollten.
-
disconnectus schrieb:
Falls ich die Paralleliseirung auskommentiere (wie es daunten aussieht) und das Program mit normalem Kompiler ausführe, läuft alles ganz gut. Ich kann den Wert bekommen.
Kompiliert den dein normaler und der unnormale Compiler in das selbe Verzeichnis?
-
DirkB schrieb:
Kompiliert den dein normaler und der unnormale Compiler in das selbe Verzeichnis?
Warum sollte er einen unnormalen Compiler haben?
Ich würde es mal mit absoluten Pfadangaben probieren. Damit kannst du zumindest das Verzeichnisproblem ausschließen.
Gibt es den die Datei auch auf jedem Cluster im richtigen Verzeichnis?
-
disconnectus schrieb von einem normalen Compiler für nicht parallele Programme benutzt. Daher denke ich das er für die Parallelisierung einen anderen Compiler benutzt. Und der kann ja auch woanders hin compilieren.
-
Keine Ahnung, was MPI ist (Multi Processing Interface?), aber vielleicht funktioniers ja so:
#include <stdio.h> #include <math.h> #include "mpi.h" int a; int rank; int size; FILE *fp1, *fopen(); main (int argc, char* argv[]) { MPI_Init (&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); fp1 = fopen("garb34", "rb"); if (rank==0 ) { a = getc(fp1); } MPI_Finalize(); }
-
Ich habe das Programm auch in verschiedene Verzeichnisse compiliert. Trotzdem bekomme ich das gleichen Fehler.
Kurz zu meinem Kompiler: Es ist local windows debugger.
Kurz zu perrors:
Ich habe in dem Text 4 perrors eingefügt. So sieht jetzt das code und die Ausgaben.Erste und Zweite hat habe ich no error gehabt.
3. perror ist no such a file or directory
4. perror ist nie ausgeführt, weil ich bei der "getc()" funktion schon einen Fehler bekomme.#include <stdio.h> #include <math.h> #include "mpi.h" int a; int b; void load () { FILE *fp1; perror("garb34"); // 2. perror fp1 = fopen( "garb34", "rb"); perror("garb34"); // 3. perror b = getc(fp1); perror("garb34"); // 4. perror //b =0; printf("%d", b); } main(int argc, char* argv[]) { int rank; int size; MPI_Init (&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); /*a = 1;*/ if (rank==1 ) { //b = getc(fp1); a = 5; printf("%d\n", a); perror("garb34"); // 1. Perror load (); } MPI_Finalize(); }
-
Naja, da gibt es nicht viel zu sagen, die Fehlermeldung ist schließlich eindeutig. Mögliche Abhilfen:
- Absolute Pfade benutzen.
- Mal eine Datei erstellen lassen und gucken, in welchem Verzeichnis sie erstellt wird.
- Nochmals kontrollieren ob die Datei auch GANG GANZ SICHER existiert.
-
disconnectus schrieb:
Kurz zu meinem Kompiler: Es ist local windows debugger.
Bist du dir sicher, dass so der Compiler heißt?
disconnectus schrieb:
3. perror ist no such a file or directory
Hast du mal den Tipp mit den absoluten Pfaden befolgt? Damit ist dein Verzeichnis erstmal egal, du musst nur die entsprechenden Rechte besitzen.
Evtl. ändert auch die MPI-Umgebung das Arbeits-Verzeichnis.
-
Visual Studio ändert schon das Arbeitsverzeichnis beim umschalten von Release auf Debug.