2010-11-25 12 views
0

Ich muss ein dynamisches Array erstellen, das 2 * n Fractions halten kann. Wenn das dynamische Array nicht zugewiesen werden kann, wird eine Nachricht gedruckt und exit (1) aufgerufen. Es füllt als nächstes das Array mit reduzierten zufälligen Brüchen, deren Zähler zwischen 1 und 20 liegt; und deren anfänglicher Nenner zwischen 2 und 20 einschließlich liegt.Erstellen Sie ein Fraction Array

Ich fertig war die Funktion, die den Bruch erstellen und reduzieren wird. das ist was ich habe. Wenn ich dieses Programm kompiliere und ausführe, stürzt es ab, ich kann nicht herausfinden warum. Wenn ich 1 anstelle von 10 in den Test gebe. Es stürzt nicht ab, aber es gibt mir einen verrückten Bruchteil. Wenn ich 7,8 oder 11 in den Test gebe, stürzt es ab. Ich würde mich freuen, wenn mir jemand helfen kann.

FractionSumTester.c

Fraction randomFraction(int minNum, int minDenom, int max) 
{ 
    Fraction l; 
    Fraction m; 
    Fraction f; 

    l.numerator = randomInt(minNum, max); 
    l.denominator = randomInt(minDenom, max); 

    m = reduceFraction(l); 

while (m.denominator <= 1) 
    { 
     l.numerator = randomInt(minNum, max); 
    l.denominator = randomInt(minDenom, max); 
    m = reduceFraction(l); 
    } 
    return m; 


} 


Fraction *createFractionArray(int n) 
{ 
    Fraction *p; 
    int i; 


    p = malloc(n * sizeof(Fraction)); 

    if (p == NULL) 
    { 
    printf("error"); 
    exit(1); 
    } 

    for(i=0; i < 2*n ; i++) 
    { 

     p[i] = randomFraction(1,2,20); 
     printf("%d/%d\n", p[i].numerator, p[i].denominator); 


    } 

    return p; 


} 

das ist das, was ich diese beiden Funktionen zu testen, verwenden.

test.c

#include "Fraction.h" 
#include "FractionSumTester.h" 
#include <stdio.h> 


int main() 
{ 

     createFractionArray(10); 

    return 0; 
} 
+0

Sie sollten beachten, dass malloc auf den meisten Linux-Systemen immer erfolgreich sein wird, weil Speicher overcommit (http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html) Ihnen den angeforderten Speicher gibt, aber wird es nicht wirklich zuweisen, bis Sie versuchen, es zu verwenden. Ich bin mir sicher, dass dies für eine Klasse ist, so dass Sie sich keine Sorgen machen müssen, aber es ist gut, daran zu denken, da es alle möglichen Fehler geben kann, die – Falmarri

Antwort

1

In Ihrem createFractionArray() Funktion, Sie malloc() Raum für n Elemente. Dann schreiben Sie in der for-Schleife 2 * n Elemente in diesen Bereich ..., der Ihren Puffer überläuft und den Absturz verursacht.

+0

Also, anstatt nur n zu setzen. Sollte ich p = malloc ((2 * n) * sizeof (Fraktion)) –

+0

Vielen Dank. Es funktioniert Ich habe alles versucht, aber ich habe nie darüber nachgedacht. Danke nochmal. –

+0

Wenn Sie möchten, dass createFractionArray() 2 * n Brüche erstellt, ist Ihre Änderung korrekt. Es macht mehr Sinn für mich, Ihr malloc() gleich zu halten und Ihre for-Schleife in 'for (i = 0; i Jander

Verwandte Themen