2011-01-13 8 views
1

Grüße!Zeiger wird nichts ohne ersichtlichen Grund

Ich habe ein einfaches Programm in qt auf c. Es gibt zwei Zeiger auf type short, die zum Lesen von Datei- und Speicherbits aus gelesenen Werten verwendet werden.

Beispielcode:

//(input is a FILE* which is opened and passed to the function) 
//(output is also a FILE* which is also opened and passed to the function) 

//1. Variables declaration 
short* sample_buffer; 
int buffer_size=1; 
short samples_read; 
unsigned long value_x=7; 
short* nzb_buffer; 
short buffer_position=-1; 
int i; 

//2.Memory allocation 
sample_buffer= malloc(sizeof(short)*buffer_size); 
nzb_buffer = malloc(sizeof(short)*value_x); 

.... 

//3. Read from infile, one short at time, process and write it to outfile 
do 
{ 
    //3.1. Read from input file 
    samples_read = fread(sample_buffer,sizeof(short),buffer_size, input); 
    //3.2. Switch position inside nzb_buffer one to the right, 
    //  going back to zero if out of bounds 
    buffer_position=(buffer_position+1)%value_x; 

    .... 

    //3.3. Put least significant bit of the just read short into nzb_buffer 
    nzb_buffer[buffer_position]=sample_buffer[0]%2; 

    .... 

    //3.4. Write the short we just read from infile to the outfile 
    for (i=0;i<samples_read;i++) 
    { 
     fwrite(sample_buffer,sizeof(short),1, output); 
    } 
} while(samples_read==buffer_size); 

ich aus unreliant Teile des Codes lassen haben. Wenn Sie etwas anderes sehen möchten, sagen Sie es mir bitte.

Problem ist, nach wie 10 oder 15 Operationen der Schleife, stürzt es mit "Segmentation Fault" Signal. Es stürzt bei der Funktion fwrite() ab.

Ich debuggte und ich benutze Uhr auf sample_buffer. Aus irgendeinem Grund, in einem exakten Schritt, macht die Operation nzb_buffer [buffer_position] = sample_buffer [0]% 2 den sample_buffer zu 0x0 (ich glaube, es wird ein Nullzeiger).

Dies kann auf nzb_buffer nicht überlaufen, da buffer_position für diese Operation 3 ist (von 7 für das jeweilige Array in malloc). Und da jede Schleife eine Schreiboperation ausführt und den Übertrag verschiebt, ist die Operation des Schreibens in nzb_buffer [3] bereits zuvor in der Schleife aufgetreten und löschte den Zeiger nicht zu dieser Zeit.

Ich bin völlig ahnungslos, was hier passiert. Hat jemand irgendwelche Ideen was los ist oder wie debugge ich es?

Vielen Dank im Voraus!

PS: Hinzugefügt Kommentare „was der Code tut“

+1

Hum, war nicht Qt eine C++ - Bibliothek? – peoro

+0

Um ehrlich zu sein, ich habe Mühe zu verstehen, was dieser Code versucht zu tun. Ich finde die Stücke, die du weggelassen hast, sind sehr relevant. –

+0

ja, aber ich muss ein c code einbinden, also ist dieser teil in c. qt arbeitet auch mit c, du machst einfach "extern" C "" mit deinem c code und sein ok – Istrebitel

Antwort

1

Ihre Ausgangsbedingung für die Schleife scheint fehl am Platz zu sein. Ich würde tun:

samples_read = fread(sample_buffer,sizeof(short),buffer_size, input); 
while(samples_read==buffer_size){ 

    [...]   

    samples_read = fread(sample_buffer,sizeof(short),buffer_size, input); 
} 
+0

Aber warum? Do-While-Schleife wurde genau für die Schleife gemacht, die immer mindestens einmal passieren muss.Do {} while ist so legal wie while {}, zuerst passiert immer einmal, dann wird konditional geprüft, zweitens - das konditionale wird zuerst geprüft, also wenn es falsch ist passiert es überhaupt nicht – Istrebitel

+0

Was liest du, wenn zum Beispiel deine Datei leer ist oder wenn Sie das Ende der Datei drücken? Sie möchten in diesem Fall keine Schleife ausführen. Also muss die Schleife so gebaut werden, dass sie unmittelbar nach dem fread endet, falls sie fehlgeschlagen ist. – tibur

+0

Es muss nicht mindestens einmal durchgeführt werden, wenn keine Eingabe erfolgt. Ich würde 'while (fread (sample_buffer, sizeof (short), buffer_size, Eingabe) == buffer_size)' machen. –

Verwandte Themen