Forum: Mikrocontroller und Digitale Elektronik AtmelStudio7 include von Header funktioniert auf einmal nicht mehr?


von AVRli (Gast)


Lesenswert?

Hallo,

bis heute bin ich mit dem include immer gut zurecht gekommen, jetzt auf 
einmal bekomme ich eine Fehlermeldung beim kompilieren.

Error unknown type name 'CKMEM_P'

Der Type ist in der Datei ckpro.h definiert...
1
ckpro.h
2
3
#ifndef _ckpro_h_     // Datei immer nur einmal einfügen
4
#define _ckpro_h_ 1    // Version 0.01
5
6
#include <stdint.h>
7
#include <main_var.h>
8
9
#define CK_FH_TYPA  0x11223344
10
#define CK_FH_TYPB  0x55667788
11
#define CK_FH_SIZE  128
12
#define CK_FH_VER  1
13
14
//--- Speicherplatz Structure ---
15
struct sCkMem {
16
  uint8_t flag;      // Speicherkanal FLAG
17
  uint8_t dummy;      // FREI!
18
  uint8_t c;      // Werte für C Port
19
  uint8_t l;      // Werte für L Port
20
};
21
typedef const struct sCkMem* CKMEM_P;
22
23
#endif

In der Headerdatei zu dem C File, indem ich den Typen verwende und wo 
auch die Fehlermeldung hin verweist, habe ich die ckpro.h wie folgt 
angegeben.

...
#include "ckpro.h"
...

Und trotzdem findet er die Typenbezeichnung nicht (mehr)?
Was habe ich da übersehen?

Ich komme nicht drauf. :-(

Hat jemand einen Tip?

Gruß AVRli...

von Rätsell Rata (Gast)


Lesenswert?

AVRli schrieb:
> bis heute bin ich mit dem include immer gut zurecht gekommen, jetzt auf
> einmal bekomme ich eine Fehlermeldung beim kompilieren.

Warum zeigst du nicht den Sourcecode bei dem der Fehler
auftritt? So wie hier kann man nur raten was du tust. Und
dazu haben viele keine Lust.

von AVRli (Gast)


Lesenswert?

Nachtrag...


screen_ckpro.h
1
#ifndef _screen_ckpro_h_  // Datei immer nur einmal einfügen!
2
#define _screen_ckpro_h_  1
3
4
#include <stdint.h>
5
#include "main_var.h"
6
#include "ckpro.h"
7
8
// LC CONFIGURATION - Anzeige
9
  #define FRAME_LC_X    0
10
  #define FRAME_LC_Y    STA_Y // + STA_H
11
  #define FRAME_LC_W    128
12
  #define FRAME_LC_H    144
13
14
typedef enum {ckNIL, ckBP, ckLP, ckHP} eCkConfig;
15
16
void update_ckpro_screen(CKMEM_P ckmem);
17
//                       ^
18
// HIER wird der         |
19
// Fehler angezeigt -----+
20
//
21
#endif

...
und
...

screen_ckpro.c
1
#include "screen_ckpro.h"
2
3
///////////////////////////////////////////////
4
// Aktualisiert alles Daten auf dem Display...
5
//////////////////////////////////////////////
6
void update_ckpro_screen(CKMEM_P ckmem)
7
{
8
  eCkConfig config;
9
10
  config = ckLP;
11
  if (ckmem->l & 0x80) config = ckHP;
12
13
  if ( (config == ckLP) && ((ckmem->l & 0x7F) == 0) 
14
  && (ckmem->c == 0) ) config = ckBP;
15
16
  paint_lc_config(lc_cfg_x, lc_cfg_y, config);
17
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Könnte es sein, daß in Deinem Dateisystem mehrere Varianten der Datei 
ckpro.h herumlungern?

von AVRli (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Könnte es sein, daß in Deinem Dateisystem mehrere Varianten der Datei
> ckpro.h herumlungern?

Das habe ich jetzt mal Systemweit suchen lassen, es gibt nur die eine im 
Programmordner. :-(

Der Witz ist, es lief sonst, ich weiß nicht, was ich heute alles 
geändert habe. Auf einmal war die Meldung da, jetzt bekomme ich sie 
nicht weg. :-(

von AVRli (Gast)


Lesenswert?

Ich habe was mit den Header Files nicht richtig verstanden. :-(
Ich habe das Problem gefunden, kann es aber nicht lösen!

"ckpro.h" wird in "screen_ckpro.h" includiert.
Zuvor wird "main_var.h" in "screen_ckpro.h" includiert.
In "main_var.h" wird "screen_all.h" inkludiert.
"screen_all.h" inkludiert wiederum "screen_ckpro.h".

Nicht das sich nun hier die Schlage selbst in den Schwanz beißt?
Ich nahm immer an, das man mit den #ifndef Schaltern in den .h Files 
solche mehrfach Beziehungen untereinander "blockt".

In "main_var.h" und "main_var.c" liegen Definitionen, Strukturen und 
Variablen, die ich global im Projekt benötige.

Gruß AVRli...

von Rätsell Rata (Gast)


Lesenswert?

Dein Include-Chaos wage ich nicht zu durchblicken, mir ist
das echt zu blöd mich da einzudenken. Das darf jemand anders
erledigen.

Wenn das jemand auflösen soll wirst du wohl nicht umhin kommen
dein komplettes Projekt zu posten.

Nur soviel:

In eine *.h Datei gehören nur Funktionsprototypen, Struktur-
Definitionen, Typdefinitionen und Defines/Konstanten. Aber
sicherlich keine Variablen und Funktionen.

Alles andere führt in den totalen Urwald.

von AVRli (Gast)


Lesenswert?

Rätsell Rata schrieb:
> In eine *.h Datei gehören nur Funktionsprototypen, Struktur-
> Definitionen, Typdefinitionen und Defines/Konstanten. Aber
> sicherlich keine Variablen und Funktionen.

Variable und Funktionen liegen dann im passendes .c im .h nur der 
Funktionskopf aus dem .c
und die Variablen die im .c definiert sind,
im .h nur mit
extern uint8_t mainResult

Aber ich muss Dir schon Recht geben, etwas Chaos ist da schon, ich muss 
mir mal eine bessere Aufteilung überlegen. :-/

von Andreas J. (andj)


Lesenswert?

Schieb in der screen_ckpro.h das "#include "ckpro.h" mal direkt unter 
den Include Guard. Wenn du den Inculde Guard z.B. versehentlich in 2 
Header Dateien gleich genannt hast, könnte so ein Fehler auftauchen.

Zudem sehe ich keinen Grund, warum du in der Datei ckpro.h das "#include 
<main_var.h>" drin hast.

Ich benutze übrigens immer "#pragma once" als include guard. Das ist 
zwar nicht im Standard, aber ich habe auch noch nie einen Compiler 
gesichtet, der das nicht unterstützt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.