M
Also das mit den Arrays setze ich gleich mal um. Die funktion Camera_Get_Count ist eigentlich sehr harmlos:
typedef struct
{
int iCount;
char** pcaCameraDevice;
}tdsCamera;
int Camera_Get_Count(tdsCamera *This)
{
return This->iCount;
}
Keine weiteren mallocs vorhanden. Der Wert wird in der oben gezeigten Camera_init-Funktion erzeugt, indem er immer inkrementiert wird, wenn die Datei /dev/videoX mit fopen einen gültigen Pointer erzeugt.
Das umspeichern von This->pcaCameraDevice in eine temporäre Variable hat den Sinn, dass ich ja vorher nicht weiß wie oft ich einen gültigen Pointer für /dev/video erhalte. Die temporäre Variable speichert alle gefundenen Werte, damit sie nicht verloren gehen und danach wird This->pcaCameraDevice um einen Speicherplatz erweitert (frei geben und neu allokieren mit +1 Plätzen im Array). Danach werden alle in der temporären Variable gespeicherten Werte wieder in This->pcaCameraDevice übertragen (hier kommt auch das This->iCount -2) wobei 1 abgezogen werden muss wegen nullbasiertem Array und 1 weil This->iCount schon um +1 erweitert wurde. Die temporäre Variable hat also zum Zeitpunkt des Zurückschreibens This->iCount -2 Einträge. Wie gesagt, wenn du eine bessere Variante kennst für den Erweiterungsprozess von This->pcaCameraDevice ohne Verlust der eingetragenen Daten, würde ich mich freuen, wenn du ihn schematisch erklären könntest oder mir zumindest ein Stichwort für die nötigen Befehle nennen könntest.
[Edit1]Wäre zum Beispiel realloc eine Möglichkeit?
void Camera_init(tdsCamera *This)
{
int i;
int iMissingCameraDevice = 0;
This->iCount = 0;
for (i = 0; i <= MAXDEVICE; i++)
{
char caDeviceName[256];
Camera_Str_DeviceName(caDeviceName, i);
FILE* fCameraDevice = fopen(caDeviceName, "r");
if (fCameraDevice == NULL)
{
if (iMissingCameraDevice >= 3) break;
iMissingCameraDevice++;
}
else
{
iMissingCameraDevice = 0;
This->iCount++;
char (*pcaTempCameraDevice)[256] = realloc(This->pcaCameraDevice, Camera_Get_Count(This) * 256 * sizeof(char*));
if(pcaTempCameraDevice == NULL)
{
// realloc failed -> Exit
printf("Error:\tRealloc in function Camera_init failed!\n");
exit(1);
}
else
{
This->pcaCameraDevice = pcaTempCameraDevice;
strncpy(This->pcaCameraDevice[This->iCount - 1], caDeviceName, 256);
}
}
fclose(fCameraDevice);
}
}
Mit dieser Änderung kann ich jetzt bis 6 Kameras betreiben ohne Fehler oder Warnungen zu erzeugen. Mit dem Hinweis zum Debugger (DDD) habe ich einen potentiellen Speicherzugriffsfehler noch entschärft (war vieleicht auch zwischenzeitlich der entsprechende Übeltäter:
if (fCameraDevice != NULL) fclose(fCameraDevice);
Ohne die if-Abfrage wird bei Fehlschlagen des fopen (Pointer = NULL) versucht die Datei wieder zu schließen. Dies führt zu einem Speicherzugriffsfehler.
Falls du noch Hinweise für besser Strukturierung, Programmierung, Verbesserungen an meinem Quellcode hast, würde ich mich natürlich weiterhin über jeden Hinweis freuen.
[/Edit1]
[Edit2]Du kritisierst, dass die free()-Funktion den Speicher nicht zuverlässig in meinem Quellcode frei gibt. Da ich diese Funktion nicht geschrieben habe und somit deren Verhalten nicht kontrolliere, was ist eine bessere Variante den Speicher wieder frei zu geben, wo ich mir sicher bin, dass er auch wirklich frei ist?[/Edit2]