calloc -- Problem mit Suse 10.0

Dieses Thema im Forum "C/C++" wurde erstellt von magjo, 25.02.2006.

  1. magjo

    magjo Grünschnabel

    Dabei seit:
    03.02.2005
    Beiträge:
    9
    Zustimmungen:
    0
    Hi

    Problem:
    Ich muss ein 2 Dimensionales Feld a[j] je nach Eingabeparameter im laufenden Programm erstellen und anschließend an ein Fortranunterprogramm (pgplot) weitergeben.

    eigentlich ganz einfach dachte ich:


    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    main()
    {
    int x=512, y=512,i;
    float **data;
    
    data = (float**)calloc(x,sizeof(float*));
        for(i=0;i<x;i++) 
          data[i] = (float*)calloc(y,sizeof(float));
    
    
    printf("\n%lu %lu \n\n",(long)&(data[1][0])-(long)&(data[0][0]),(long)&(data[0][1])-(long)&(data[0][0]));
    }
    
    Compiliere ich das Programm mit gcc unter FreeBSD liefert es das korrekte Erbebnis:
    Code:
    joachim@pythagoras:~/MFM> ./feld
    
    2048 4
    mache ich das gleiche mit Suse 10.0 bekomme ich das Ergebnis
    Code:
    joachim@pythagoras:~/MFM> ./feld
    
    2056 4
    wenn ich dieses Feld an die Fortranroutine (pgplot) weitergebe verschiebt sich alles.

    ich hab es bei Suse schon mit gcc-3.3.5 versucht gleiches Ergebnis. Ich hab in diesem Fall leider die Vorgabe, dass das Programm unter Suse erstellt werden soll.

    Danke
    Joachim
     

    Anhänge:

  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. MTS

    MTS Kaiser

    Dabei seit:
    09.11.2002
    Beiträge:
    1.242
    Zustimmungen:
    0
    Ort:
    NRW, Bochum
    Hi!
    Also bei mir gibt er auch 2056 4 aus! (slackware)
    (Natürlich kann es immer an den Konvertierungen liegen- die solltest du mal einzeln testen), aber eigentlich:

    Du gehst ja wahrscheinlich davon aus, dass der Speicherplatz den du reservierst komplett an einem stück ist.. und Subrahierst dann die Adressen.
    Ich wüsste aber nicht, dass ein Standard (zB. ansi) festlegt, dass das auch wirklich so sein muss.
    Beim jedem calloc aufruf bekommst du deinen Speicherbereich an einem Stück, dazwischen darf doch aber das OS machen was es will, oder?!
    Ich will nochmal betonen, dass ich mich da wirklich nicht im Detail auskenne.
    Aber ich würde behaupten, dass bei der Reservierung Linux anders vorgeht als dein Freebsd..
     
  4. magjo

    magjo Grünschnabel

    Dabei seit:
    03.02.2005
    Beiträge:
    9
    Zustimmungen:
    0
    Hi

    das eigentliche Problem dabei ist, dass ein:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    main()
    {
    
    float data[512][512];
    
    printf("\n%lu %lu \n\n",(long)&(data[1][0])-(long)&(data[0][0]),(long)&(data[0][1])-(long)&(data[0][0]));
    }
    bei Suse auch 2048 4 ausgibt und das Fortranunterprogramm von pgplot nur mit dieser Speicherallokierung richtig arbeitet. Sieht richtig Sch.... aus wenn jede Zeile in einem Bild immer um 8 Byte verschoben wird.


    Joachim
     
  5. MTS

    MTS Kaiser

    Dabei seit:
    09.11.2002
    Beiträge:
    1.242
    Zustimmungen:
    0
    Ort:
    NRW, Bochum
    also ist dein Fotran Programm absolut Architektur und OS abhängig ...

    kannst du dir die Speicherverteilung nicht evtl. hintricksen? Indem du erstmal den gesamten Speicherplatz reservierst und dort mit Pointerarithmetik arbeitet?
    calloc lefert ja void Pointer , die kannst du doch konvertieren wie du willst ...

    Wie sieht denn die Übergabe an das Fortran Programm aus ... was erwartet das genau
     
  6. #5 magjo, 25.02.2006
    Zuletzt bearbeitet: 25.02.2006
    magjo

    magjo Grünschnabel

    Dabei seit:
    03.02.2005
    Beiträge:
    9
    Zustimmungen:
    0
    Hi
    Das versuche ich seit gestern.

    ist natürlich schöner (für meine Mitmenschen) wenn man mit data[x][y] arbeitet, anstatt mit *(data+x*xdim+y) oder so ähnlich.

    Joachim


    /*---------------------------------------------------------------------------*/
    Hab die Lösung nicht schön aber selten





    Danke für die Anregung
    Joachim
     
  7. MTS

    MTS Kaiser

    Dabei seit:
    09.11.2002
    Beiträge:
    1.242
    Zustimmungen:
    0
    Ort:
    NRW, Bochum
    Also dein Problem liegt ja schon eher beim Fortran Programm, oder?
    Vielleicht lohnt es sich, dass etwas allgemeiner zu halten (da kenn ich mich wirklich gar nicht aus :-) )

    Ansonsten sind doch die [] Klammern nur ne andere Schreibweise für das *(..+..)

    Wenn du also einfach die Bytes alloziierst die du brauchst. dann den Pointer nach float* konvertierst und die ersten 512 Bytes entsprechend auf die richtigen Adressen setzt, solltest du doch alles fertig haben ?

    Der Nutzer kann dann einfach über die[] zugreifen ?
    Sollte doch gehen ...

    das ist Geraten: Alternativ kannst du ja mal nen man gcc versuchen, vielleicht gibt es ja ne Option um ne andere Speicherverwaltung zu erzwingen
     
  8. magjo

    magjo Grünschnabel

    Dabei seit:
    03.02.2005
    Beiträge:
    9
    Zustimmungen:
    0
    Danke für die Hilfe

    Problem gelöst siehe oben


    Joachim
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. #8 MrFenix, 25.02.2006
    MrFenix

    MrFenix Executor

    Dabei seit:
    16.10.2004
    Beiträge:
    480
    Zustimmungen:
    0
    Ort:
    Siegen, NRW
    Ich denke das lag an dem sizeof(float*), das muss glaube ich sizeof(float) sein...
     
  11. magjo

    magjo Grünschnabel

    Dabei seit:
    03.02.2005
    Beiträge:
    9
    Zustimmungen:
    0
    hi

    nee (float *) denke ich ist richtig, kannste ja mal mit "double" ausprobieren.

    der folgende code sollte besser funktionieren als der oben, da er allgemeingültiger ist


    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    main()
    {
    int x=512, y=512,i;
    float **data;
    
    data = (float**)calloc(x,sizeof(float*));
    data[0]=(float *) calloc (x*y,sizeof(float));
    for(i=0;i<x;i++)
       data[i] = (float*)(data[0]+i*y);
    
    printf("\n%lu %lu \n\n",(long)&(data[1][0])-(long)&(data[0][0]),(long)&(data[0][1])-(long)&(data[0][0]));
    }
    
    
    Danke
    Joachim
     
Thema:

calloc -- Problem mit Suse 10.0

Die Seite wird geladen...

calloc -- Problem mit Suse 10.0 - Ähnliche Themen

  1. Virtualboxproblem

    Virtualboxproblem: Hallo Folgnedes Problem: Ich kann ohne Probleme In Debian-Sid, 64Bit und virtualbox-dkms Unixoide installieren, wenn es sich um eine...
  2. grub-pc Probleme bei upgrade

    grub-pc Probleme bei upgrade: Hallo, ich habe beim dist-upgrade folgendes Problem: ---------- Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt. Trigger für...
  3. Problem bei apt-get upgrade (Kali 2.0)

    Problem bei apt-get upgrade (Kali 2.0): Hi, seit paar Tagen habe ich einige Probs. Dachte es sei mal an der Zeit für ein Update und nun tauchen da einige Fehler auf: Es müssen noch 0 B...
  4. Probleme mit YUM

    Probleme mit YUM: Hallo, ich habe CentOs 7 als Dualboot mit Windows 7 auf einen Dell Latitude E5510 installiert. Dies hat soweit auch alles geklappt. Leider habe...
  5. Problem mit Win-Zugriff auf SAMBA

    Problem mit Win-Zugriff auf SAMBA: Hallo rundherum, vielleicht hat jemand eine Idee... Habe jetzt schon 1 1/2 Tage damit verbraten und den Fehler nicht gefunden. Problem:...