Forum: Compiler & IDEs Externes #define ?


von Datenkeimling (Gast)


Lesenswert?

Kann ich

#define XY

in eine externe Datei.h legen und dieses XY in zwei Dateien code1.c und 
code2.c verwenden? Ich habe es mit include Datei.h in beiden .c Dateien 
versucht. Wurde trotzdem nicht geunden.

von PittyJ (Gast)


Lesenswert?

Bevor wir rätseln: zeig uns den Code / die Dateien.

von mar IO (Gast)


Lesenswert?

Japp, das sollte funktionieren, aber anscheinend machst Du was falsch...

Datenkeimling schrieb:
> in eine externe Datei.h legen und dieses XY in zwei Dateien code1.c und
> code2.c verwenden?

Datei.h ist noch so extern oder intern wie code1.c und code2.c. Das Wort 
"extern" passt in diesem Fall nicht.

Datenkeimling schrieb:
> Ich habe es mit include Datei.h in beiden .c Dateien
> versucht. Wurde trotzdem nicht geunden.

Include muss ganz am Anfang stehen und ansonsten könnte man noch weiter 
raten was da los ist, da keinen Code und so...

Vllt. hilft dir auch dieses Kapitel weiter, da sollte ein Beispiel mit 
drinnen sein

http://openbook.galileocomputing.de/c_von_a_bis_z/010_c_praeprozessor_002.htm#mjead11e16556a0e94647592cad9e3c437

von Hans Ulli K. (Gast)


Lesenswert?

Datenkeimling schrieb:
> Kann ich
>
> #define XY
>
> in eine externe Datei.h legen und dieses XY in zwei Dateien code1.c und
> code2.c verwenden? Ich habe es mit include Datei.h in beiden .c Dateien
> versucht. Wurde trotzdem nicht geunden.

Hoffentlich kennst du den Unterschied zwischen

#incude "extern.h"
und
#include <extern.h>

von Datenkeimling (Gast)


Lesenswert?

Schon in dieser Konstellation wird das #define nicht gefunden (alle 
Dateien sind im Projekt eingebunden).


additional_adc_adc_example1.h:
1
//#ifndef ADDITIONAL_ADC_ADC_EXAMPLE1
2
//#define ADDITIONAL_ADC_ADC_EXAMPLE1
3
4
5
#define MENU_HEADER "\n\r" \
6
"===================================================\n\r" \
7
"Menu: press a key to change the configuration.\n\r" \
8
"---------------------------------------------------------\n\r"
9
10
//Prototypes
11
static void display_menu(void);
12
13
//#endif


additional_adc_adc_example1.c:
1
#include <string.h>
2
#include "asf.h"
3
#include "conf_board.h"
4
#include "additional_adc_adc_example1.h"
5
6
static void display_menu(void)
7
{
8
  uint8_t uc_char;
9
10
  puts(MENU_HEADER);
11
  //...
12
  
13
}


ergibt:
Error  1  'MENU_HEADER' undeclared (first use in this function)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Datenkeimling schrieb:
> Error  1  'MENU_HEADER' undeclared (first use in this function)

Hier nicht:
1
$ cat > additional_adc_adc_example1.h
2
//#ifndef ADDITIONAL_ADC_ADC_EXAMPLE1
3
//#define ADDITIONAL_ADC_ADC_EXAMPLE1
4
5
6
#define MENU_HEADER "\n\r" \
7
"===================================================\n\r" \
8
"Menu: press a key to change the configuration.\n\r" \
9
"---------------------------------------------------------\n\r"
10
11
//Prototypes
12
static void display_menu(void);
13
14
//#endif
15
^D
16
$ touch asf.h
17
$ echo "#include <stdint.h>" > conf_board.h
18
$ cat > additional_adc_adc_example1.c
19
#include <string.h>
20
#include "asf.h"
21
#include "conf_board.h"
22
#include "additional_adc_adc_example1.h"
23
24
static void display_menu(void)
25
{
26
  uint8_t uc_char;
27
28
  puts(MENU_HEADER);
29
  //...
30
  
31
}
32
^D
33
$ avr-gcc -Wall -Wextra -mmcu=atmega1281 -Os -c additional_adc_adc_example1.c
34
additional_adc_adc_example1.c: In function ‘display_menu’:
35
additional_adc_adc_example1.c:10:3: warning: implicit declaration of function ‘puts’
36
additional_adc_adc_example1.c:8:11: warning: unused variable ‘uc_char’
37
additional_adc_adc_example1.c: At top level:
38
additional_adc_adc_example1.c:6:13: warning: ‘display_menu’ defined but not used

von Datenkeimling (Gast)


Lesenswert?

Der uC hier ist n SAM3X8E mit gcc.

Keine Ahnung warum das bei dir funktioniert. Bei mir geht's immer noch 
net. Trotzdem, Danke.

73

von mar IO (Gast)


Lesenswert?

Datenkeimling schrieb:
> ergibt:
> Error  1  'MENU_HEADER' undeclared (first use in this function)

Du hast vorhin von mehreren Dateien geschrieben... Wird wo anders das 
#define aufgelöst? - Wenn nicht, dann poste bitte alle Fehler.

von Datenkeimling (Gast)


Lesenswert?

Nee, wird nirgends aufgelöst. Mach ich morgen mit weiter.
Aber im Moment hab ichn schlimmeres Problem: scanf verursacht böse 
Speicherfehler.


1
#include <string.h>
2
#include "asf.h"
3
#include "conf_board.h"
4
5
#define NUM_CHANNELS    (4)
6
7
/** ADC convention done mask. */
8
#define ADC_DONE_MASK   ( (1<<NUM_CHANNELS) - 1 )
9
10
/** Size of the receive buffer and transmit buffer. */
11
#define BUFFER_SIZE     NUM_CHANNELS
12
13
/** Reference voltage for ADC, in mv. */
14
#define VOLT_REF        (3300)
15
16
17
/** The maximal digital value */
18
#define MAX_DIGITAL     (4095)
19
20
#define STRING_EOL    "\r"
21
#define STRING_HEADER "\r\n\r\n-- ADC Example --\r\n" \
22
    "-- Compiled: "__DATE__" "__TIME__" --"STRING_EOL
23
    
24
#define MENU_HEADER "\n\r" \
25
    "===================================================\n\r" \
26
    "Menu: press a key to change the configuration.\n\r" \
27
    "---------------------------------------------------------\n\r"
28
29
/** ADC channel for potentiometer */
30
int g_i_selected_channel;
31
32
33
34
/** Global timestamp in milliseconds since start of application */
35
static volatile uint32_t gs_ul_ms_ticks = 0;
36
37
38
39
static void display_menu2(void)
40
{  
41
  puts(MENU_HEADER);
42
  printf ("Select channel: ");
43
  scanf("%d", &g_i_selected_channel); //  <-PROBLEM
44
  printf ("\rg_i_selected_channel = %d\r", g_i_selected_channel);
45
}
46
47
48
49
50
/**
51
 * \brief Display ADC configuration menu.
52
 */
53
static void display_menu(void)
54
{
55
  uint8_t uc_char;
56
57
  puts(MENU_HEADER);
58
  uc_char = (g_adc_test_mode.uc_trigger_mode == TRIGGER_MODE_SOFTWARE) ? 'X' : ' ';
59
  printf("[%c] 0: Set ADC trigger mode: Software.\r", uc_char);
60
...
61
...
62
...
63
  uc_char = (g_adc_test_mode.uc_offset_en) ? 'E' : 'D';
64
  printf("[%c] O: Enable/Disable offset for potentiometer channel.\r",
65
      uc_char);
66
67
  puts("    Q: Quit configuration and start ADC.\r");
68
  puts("=========================================================\r");
69
}


mit Aufruf in main:

...
...
  display_menu2();
  display_menu(); //show only
  start_adc();
...
...






vrursacht willkürlichen Speichermüll in der Ausgabe:




g_i_selected_channel = 0

===================================================

Menu: press a key to change the configuration.
---------------------------------------------------------

[X] 0: Set ADC trigger mode: Software.
[ ] 1: Set ADC trigger mode: ADTRG.
[ ] 2: Set ADC trigger mode: Timer TIOA.
[ ] 3: Set ADC trigger mode: PWMEvent Line.
[ ] 4: Set ADC trigger mode: Free run mode.
[E] T: Enable/Disable to transfer with PDC.
[D] S: Enable/D…‰±•to use user sequence mode.
[D] P: Enable/Disable ADC power save mode.
[D] G: Enable/Disable to set gain = 2x for potentiometer channel.
[D] O: Enable/Disable offset for potentiometer channel.
    Q: Quit configuration and start ADC.
================êêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêj
Press any key to display configuration menu.


-- ADC Example --
-- Compiled: Jun 27 2013 21:36:39 --
Configure system tick to get 1ms tick period.


===================================================

Menu: press a key to change the configuration.

---------------------------------------------------------

Select channel:


uC istn SAM3X8E. Ich hab jetzt mehrere Datentypen für 
g_i_selected_channel und für den Spezifizierer für scanf ausprobiert 
weil ich eigentlich dachte der Speicher reicht nicht... hilft aber nicht 
weiter.

von Mark B. (markbrandis)


Lesenswert?

Also mit gcc auf'm PC (MinGW) habe ich keine Probleme beim Kompilieren 
und zur Laufzeit, wenn ich:

-diverse Sachen rausschmeiße die mir nicht vorliegen:
#include "asf.h"
#include "conf_board.h"
"Pünktchen Pünktchen Pünktchen" Code

-die richtigen Header inkludiere:
#include <stdint.h>
#include <stdio.h>

Datenkeimling schrieb:
> uC istn SAM3X8E.

Die Information nützt uns eher wenig. Viel interessanter wäre es zu 
wissen, wie kompiliert wird. Von Hand an der Kommandozeile? Per 
makefile? Mit einer IDE (welche?)

Außerdem kann auch und gerade so ein Menü-Code problemlos auf dem PC 
übersetzt und getestet werden, wenn die µC-Anteile vernünftig gekapselt 
sind. Dafür haben die C-Götter das #ifdef erschaffen.

Ach ja und das hier:

> uint8_t uc_char;

schreibt man als:
char uc_char;
weil genau das gemeint ist. (char = character)

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.