mutex fileübergreifend verwenden

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Mandy
Beiträge: 9
Registriert: 03.11.2013 09:47:39

mutex fileübergreifend verwenden

Beitrag von Mandy » 29.12.2013 13:26:26

Hallo Leute,

wahrscheinlich ist es ganz einfach, wenn man weiß wie:
Ich möchte einen Mutex file übergreifend verwenden:
Wenn ich ihn im main.h drin habe, werden im main.c
usleep was not declared
displayStatus was not declared

und dergleichen mehr Fehler ausgegeben.

Wenn ich ihn aus main.h entferne, ist er klarerweise im communication.c nicht mehr verfügbar.
Wie muss der mutex korrekt deklariert / definiert werden?

Danke,
Mandy

main.c

Code: Alles auswählen

#include "main.h"
#include "communication.h"
#include "display.h"

extern pthread_mutex_t  mutex;

void refreshDisplay(struct DisplayStatus *status);
 
int main(int argc, char **argv)
main.h

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

#ifndef _MAIN_H_
#define _MAIN_H_

#define STATUS_ZEIT 0
#define STATUS_LIED 1
#define STATUS_COUNTUP 2
#define STATUS_COUNTDOWN 3

#define COUNTER_OFF -999999

extern pthread_mutex_t  mutex;

struct DisplayStatus 
{
  int status;
  long int value;
  long int counter;
  time_t zeit;
  bool timerUeberlauf;
};


#endif
communication.c

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <sys/param.h>
#include <pthread.h>

#include "communication.h"
#include "main.h"

struct DisplayStatus *displayStatus;

struct sockaddr_in remoteAddr;

void KommandoHallo(char *datagram);
void KommandoLied(char *datagram);
void KommandoCounterStop(char *datagram);
void KommandoCounter(char *datagram, int richtung);
void SendeAntwort(char *datagram);

extern void *WarteAufKommando(void* val) 
{

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: mutex fileübergreifend verwenden

Beitrag von JTH » 29.12.2013 15:08:26

Hi,
so wie du es bisher versuchst, hast du die Variable mutex zweimal deklariert, aber nirgendwo definiert.

Der übliche Weg für eine globale Variable ist (wenn ich mich richtig erinnere), sie im Header als extern zu deklarieren und in der dazugehörigen Quelldatei zu definieren:

Code: Alles auswählen

// a.h
#ifndef A_H
#define A_H
...
extern int glob_var;
...
#endif

Code: Alles auswählen

// a.c
#include "a.h"
int glob_var;

Code: Alles auswählen

// b.c
#include "a.h"
...
glob_var = 42;
...
Meiner Meinung eleganter wäre es, statt der globalen Variablen einen Pointer auf den Mutex den Funktionen aus communication.h beim Aufruf zu übergeben ;)
Manchmal bekannt als Just (another) Terminal Hacker.

Mandy
Beiträge: 9
Registriert: 03.11.2013 09:47:39

Re: mutex fileübergreifend verwenden

Beitrag von Mandy » 29.12.2013 16:04:38

Hallo JTH,

danke, das extern im main.c war ein Überbleibsel vom Testen.

Aber das Problem liegt wo anders...
mit dem typ int funktioniert es interessanterweise.
Sobald ich pthread_mutex_t verwende bekomme ich die Fehler
usleep was not declared
displayStatus was not declared
...


Hat da noch jemand eine Idee?

Danke

main.h wie sie jetzt aussieht:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

#ifndef _MAIN_H_
#define _MAIN_H_

#define STATUS_ZEIT 0
#define STATUS_LIED 1
#define STATUS_COUNTUP 2
#define STATUS_COUNTDOWN 3

#define COUNTER_OFF -999999

struct DisplayStatus 
{
  int status;
  long int value;
  long int counter;
  time_t zeit;
  bool timerUeberlauf;
  pthread_mutex_t mutex;
};


#endif

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: mutex fileübergreifend verwenden

Beitrag von JTH » 29.12.2013 16:59:29

Für usleep() fehlt dir evtl. der entsprechende Header unistd.h?

DisplayStatus hast du in deinem Codeschnipsel mit großen D geschrieben, in dem Fehler taucht es mit kleinem d auf. Einfach nur ein Tippfehler?
Manchmal bekannt als Just (another) Terminal Hacker.

Mandy
Beiträge: 9
Registriert: 03.11.2013 09:47:39

Re: mutex fileübergreifend verwenden

Beitrag von Mandy » 29.12.2013 18:35:22

Das war ein Problem im makefile,
in Verbindung mit falsch verstandener Meldung vom g++:
Der bricht bei bestimmten Fehlern ab, und deshalb hatte ich die nachfolgenden Fehler nicht mehr bekommen.

Ich fürchte, C/C++ werden nicht meine top - Sprachen...

Danke JTH

Antworten