Speicher allokieren



  • Hallo!

    Habe folgendes Progrämmchen geschreiben und dabei dynamisch Speicher allokiert aber scheinbar einen Fehler den ich leider nicht finden kann. mir überschreibt es die Werte im Array "B" irgendwann und ich komm nicht drauf warum...

    Hatt jemand einen Tipp für mich ?

    #include <stdio.h>
    #include <stdlib.h>
    
    double* allokieren(int anzZ,int anzSp)
    {
    	double *p;
    
    	// Speicher dynamisch anfordern...
    	p=(double*)malloc(anzZ*anzSp*sizeof(p));
    
    	// Abfrage ob Anfordern erfolgreich war...
    	if (p==NULL)
    		printf("\nDas Anfordern des Speichers war NICHT erfolgreich!\n");
    	else
    		printf("\nDas Anfordern des notwendigen Speichers war erfolgreich!\n");
    	return p;
    }
    
    void print(double* hugo)
    {
     int i = 0;
     for(i=0; i < 9;i++)
      {
    	 printf("%d --- %f \n",i,hugo[i]);
      }
    
    }
    
    main()
    {
     int zeilen = 3;
     int spalten = 3;
     int i, j, k = 0;
    
     double *A = allokieren(zeilen,spalten);
     double *B = allokieren(zeilen,spalten);
     double *erg = allokieren(zeilen,spalten);
    
     double summe = 0.0;
    
      A[0] = 1.0;
      A[1] = 2.0;
      A[2] = 3.0;
      A[3] = 4.0;
      A[4] = 5.0;
      A[5] = 6.0;
      A[6] = 7.0;
      A[7] = 8.0;
      A[8] = 9.0;
      B[0] = 11.0;
      B[1] = 12.0;
      B[2] = 13.0;
      B[3] = 14.0;
      B[4] = 15.0;
      B[5] = 16.0;
      B[6] = 17.0;
      B[7] = 18.0;
      B[8] = 19.0;
    
      print(B);
      for(i=0;i<zeilen;i++)
       {
         for(j=0;j<spalten;j++)
         {
            for(k=0;k<zeilen;k++)
            {
              summe += A[i*zeilen+k] * B[j+k*spalten];
              print(B);
              printf("A%d * B%d \n = %f + %f ",i*zeilen+k , j+k*spalten,A[i*zeilen+k], B[j+k*spalten]);
              printf("Summe = %f \n", summe);
            }
    
            printf("erg[%d]\n",i*zeilen + j);
            erg[i*zeilen + j]= summe;
    
            summe=0.0;
         }
       }
    
      for(i=0; i < 9;i++)
      {
    	 printf("%d --- %f \n",i,erg[i]);
      }		
    }
    


  • hab auch gerade ein bischen gesucht 😃

    p=(double*)malloc(anzZ*anzSp*sizeof(double)); 
    statt
    p=(double*)malloc(anzZ*anzSp*sizeof(p));
    

    wir brauchen ja speicher für ein double und nicht für nen zeiger die haben andere größen, kann das sein?

    if(sizeof(double)!=sizeof(double*))
      printf("fehler");
    

    evtl. abhängig von der plattform aber bei mir kam fehler raus



  • Hallo,

    Wolfi1234 schrieb:

    p=(double*)malloc(anzZ*anzSp*sizeof(p));
    

    sizeof(p) = 4 // 32 Bit Maschine. Zu wenig für einen double Wert.
    sizeof(*p) = 8 // Alle Maschinen.
    Es muss also heißen: sizeof(*p);

    Wolfi1234 schrieb:

    A[0] = 1.0;
    A[1] = 2.0;
    A[2] = 3.0;
    A[3] = 4.0;
    A[4] = 5.0;
    A[5] = 6.0;
    A[6] = 7.0;
    A[7] = 8.0;
    A[8] = 9.0;
    B[0] = 11.0;
    B[1] = 12.0;
    B[2] = 13.0;
    B[3] = 14.0;
    B[4] = 15.0;
    B[5] = 16.0;
    B[6] = 17.0;
    B[7] = 18.0;
    B[8] = 19.0;

    Für Array-Initialisierungen zu initialisieren, eignen sich Schleifen ganz gut.

    double i = 0.0;
    while(i<8.0)
    A[i]=i;
    

    Gruß,
    B.B.



  • Big Brother schrieb:

    sizeof(*p) = 8 // Alle Maschinen.

    Das glaubst auch bloß du 🤡



  • Big Brother schrieb:

    Für Array-Initialisierungen zu initialisieren, eignen sich Schleifen ganz gut.

    double i = 0.0;
    while(i<8.0)
    A[i]=i;
    

    Gruß,
    B.B.

    Du meinst eher so

    int i = 0;
    for(i = 0; i < 9; ++i)
        A[i] = i+1;
    

    sonst endet das nie.



  • Tim schrieb:

    Big Brother schrieb:

    sizeof(*p) = 8 // Alle Maschinen.

    Das glaubst auch bloß du 🤡

    Welche nicht? Habe ich tatsächlich einfach mal so angenommen. Das scheint auch die IEC 60559 Norm zu glauben, wenn meine C Standard Quelle verlässlich ist.

    supertux schrieb:

    Du meinst eher so

    Ja, eher so. Nächstes mal mache ich wieder Pünktchen, denn vermutlich ist das gar nicht mal so selbstverständlich, dass man da selber drauf kommt.



  • Big Brother schrieb:

    Tim schrieb:

    Big Brother schrieb:

    sizeof(*p) = 8 // Alle Maschinen.

    Das glaubst auch bloß du 🤡

    Welche nicht? Habe ich tatsächlich einfach mal so angenommen. Das scheint auch die IEC 60559 Norm zu glauben, wenn meine C Standard Quelle verlässlich ist.

    Der C-Standard schreibt IEC 60559 aber nicht vor. Ich hatte mal einen Microcontroller, da war float wählbar zwischen 24 und 32 bit und double war 32 bit.



  • Hallo,

    Welche nicht? Habe ich tatsächlich einfach mal so angenommen. Das scheint auch die IEC 60559 Norm zu glauben, wenn meine C Standard Quelle verlässlich ist.

    Ganz so einfach ist es nicht, es kommt auf die Hardware an, in C gibt es da z.B. das Makro __STDC_IEC_559__. Diskussionen hierzu :

    http://stackoverflow.com/questions/752309/ensuring-c-doubles-are-64-bits

    http://compgroups.net/comp.arch.arithmetic/How-do-I-find-out-what-C-s-long-double-is

    MfG,

    Probe-Nutzer



  • supertux schrieb:

    Du meinst eher so

    int i = 0;
    for(i = 0; i < 9; ++i)
        A[i] = i+1;
    

    sonst endet das nie.

    Es endet sehr schnell, weil's der Compiler nicht mag, wenn double/float als Index verwendet werden sollen. 😃

    Big Brother schrieb:

    sizeof(*p) = 8 // Alle Maschinen.

    Da gibt's nicht nur einen, sondern gaaanz viele Prozessoren, bei denen die 8 nicht stimmt, besonders bei DSPs und GPUs kann man mit den Rechenwerken lustige Dinge anstellen.
    Mit sizeof(*p) liegste als Einzigem richtig, um nicht inkompatiblen Code zu produzieren.



  • pointercrash() schrieb:

    Es endet sehr schnell, weil's der Compiler nicht mag, wenn double/float als Index verwendet werden sollen. 😃

    Oh, allerdings, peinlich 😃

    Tim schrieb:

    Der C-Standard schreibt IEC 60559 aber nicht vor.

    In meinem Standard Draft finde ich das:

    F.2 Types
    1 The C floating types match the IEC 60559 formats as follows:
    — The float type matches the IEC 60559 single format.
    — The double type matches the IEC 60559 double format

    ....

    Da habe ich es ganz spontan so aufgefasst, das der Typ double zum C Standard gehört.



  • Big Brother schrieb:

    In meinem Standard Draft finde ich das:

    F.2 Types
    1 The C floating types match the IEC 60559 formats as follows:
    — The float type matches the IEC 60559 single format.
    — The double type matches the IEC 60559 double format
    ....

    Da habe ich es ganz spontan so aufgefasst, das der Typ double zum C Standard gehört.

    Wo hast Du das her?

    Es gibt zwar Bestrebungen, IEC 559 in den Standard einzubeziehen, aber das ist alles "can", nicht "must" oder "match".
    Wär' ja auch blöd, wenn man einen DSP hat und sich die Rechenwerke fast beliebig zusammenschalten kann. 😉



  • pointercrash() schrieb:

    Wo hast Du das her?

    Guckst du ganz unten unter Weblinks
    http://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C



  • Big Brother schrieb:

    Guckst du ganz unten unter Weblinks
    http://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C

    Kein F2 ohne F1, das ist des Lätsels Röstung:

    F.1 Introduction
    ... An implementation that defines __STDC_IEC_559_ _ shall conform to the specifications in this annex. Where a binding between the C language and IEC 60559 is indicated, the IEC 60559-specified behavior is adopted by reference, unless stated otherwise.

    Also, wenn das Ding anzeigt, dass es mit 60559- binaries rechnet, sollte es das auch tun. Also nur eine wortreiche Darstellung eines Trivialzusammenhangs, wie für das ganze Standardgeschreibsel üblich. 😃



  • Also ist dieser ganze Annex-Teil bloß optional? Da soll mal einer drauf kommen. Das könnten die ja auch mal dazuschreiben.



  • Big Brother schrieb:

    Also ist dieser ganze Annex-Teil bloß optional? Da soll mal einer drauf kommen. Das könnten die ja auch mal dazuschreiben.

    Naja, steht schon da und eigentlich kuhgroß, aber mit Drafts ist es wie mit Gesetzestexten: Man muß ALLES mehrmals in Zusammenhang interpretierend lesen, bis man draufkommt, was gemeint sein könnte.
    Mühselig, aber ne, IEC60559 ist nicht verbindlich, nichtmal, wenn __STDC_IEC_559__ defined ist. In meinen Augen ist C99 kein wirklich großer Wurf, aber das weiter zu erörtern wär' hier echt OT. 😉



  • pointercrash() schrieb:

    Naja, steht schon da und eigentlich kuhgroß, aber mit Drafts ist es wie mit Gesetzestexten: Man muß ALLES mehrmals in Zusammenhang interpretierend lesen, bis man draufkommt, was gemeint sein könnte.

    Tja, wohl nicht groß genung für Standardlegastheniker wie mich.
    Eine oder zwei einführende Zeilen vor dem ganzen annex Kram im Sinne von:
    <wunschzeile>
    The following annex is not part of the C Standard, its an additional information, ...blubb...
    </wunschzeile>
    fände ich schon ganz hilfreich. Aaaaber nu is ja auch Wurscht.
    🙂


Anmelden zum Antworten