T
Okay, ich kommentiere mal alles durch (ich habe echt zu viel Zeit):
#include "dicom.h"
#include <stdlib.h>
#include <stdio.h>
short** ct_import(char* filename, int size)
{
FILE* file_in;
short i;
short** _ct; //sollte auf NULL gesetzt werden
if((file_in = fopen(filename, "rb")) == NULL)
{
printf("Datei konnte nicht ge%cffnet werden\n", 246);
exit(-1);
}
if((_ct = calloc(size, sizeof(*_ct))) == NULL) //der Cast ist ueberfluessig, besser Variable als Typ in sizeof
{
printf("Speicher konnte nicht alloziert werden\n");
//wo wird close(file_in) gemacht?
free(_ct);
exit(-1);
}
//jetzt sollten alle Elemente von _ct auf NULL gesetzt werden
for(i = 0; i < size; i++)
{
_ct[i] = calloc(size,sizeof(**_ct)); //der Cast ist ueberfluessig, besser Variable als Typ in sizeof
if(_ct[i] == NULL)
{
printf("Speicher konnte nicht alloziert werden\n");
for(i = 0; i < size; i++)
{
free(_ct[i]); //nach dem free auf NULL setzen
//was passiert hier, wenn 20 von 50 Elementen alloziiert wurden
//der Rest aber noch nicht, die _ct[i]-Elemente aber nicht
//wie oben angemerkt auf NULL gesetzt wurden?
}
free(_ct); //wird immer wieder geloescht (size x)!
}
//wo wird close(file_in) gemacht?
//kein exit() -> Programm macht potentiell auf Schrottpointern weiter
}
//Vom Ende aus hinter der Header springen
fseek(file_in,-size*size,SEEK_END);
//Blockweise einlesen in das Feld
while(!feof(file_in))
{
for(i = 0; i < size; i++)
{
//ob das so gut ist?!
fread(_ct[i], sizeof(short), size, file_in);
}
}
fclose(file_in);
return _ct;
}