prog_uint8_t

Gast #3982609
Hi,

kann ich sowas machen, oder handele ich mir damit Probleme ein?
1
typedef uint8_t prog_uint8_t;
2

3

4
prog_uint8_t can_filter[] =
5
{
6
  // Group 0
7
  MCP2515_FILTER(0),        // Filter 0
8
  MCP2515_FILTER(0),        // Filter 1
9
  
10
  // Group 1
11
  MCP2515_FILTER_EXTENDED(0),    // Filter 2
12
  MCP2515_FILTER_EXTENDED(0),    // Filter 3
13
  MCP2515_FILTER_EXTENDED(0),    // Filter 4
14
  MCP2515_FILTER_EXTENDED(0),    // Filter 5
15
  
16
  MCP2515_FILTER(0),        // Mask 0 (for group 0)
17
  MCP2515_FILTER_EXTENDED(0),    // Mask 1 (for group 1)
18
};
Uwe schrieb:
> Michael Reinelt schrieb:
> Solange du uns nicht verrätst, was MCP2515_FILTER und
> MCP2515_FILTER_EXTENDED macht, wird dir das keiner beantworten können...
>
> Mir geht um prog_uint8_t, was unter Atmel Studio nicht vorhanden ist.
> Der Rest ist erstmal irrelevant.
>
> prog_uint8_t ist doch auch ein uin8_t, oder nicht?

Ja das ist ein Datentyp mit dem gleichen Wertebereich. Solltest du 
allerdings einer uint8_t Variable einen prog_uint8_t Wert zuweisen gibt 
es je nach Compilereinstellung mindestens mal ne Warnung.
Moderator Persönliche Seite
Grml ... schrieb:
> Solltest du allerdings einer uint8_t Variable einen prog_uint8_t Wert
> zuweisen gibt es je nach Compilereinstellung mindestens mal ne Warnung.

Warum?

@TE: wofür brauchst du den typedef denn überhaupt?  Was mindestens
noch fehlt ist das "const" bei der Definition.

Aber sinnvoller wäre es, stattdessen dann gleich __flash zu benutzen,
wenn du sowieso einen hinreichend neuen Compiler benutzt.
(Firma: Brainit GmbH)
Uwe schrieb:
> prog_uint8_t ist doch auch ein uin8_t, oder nicht?

Ja, aber einer der im Flash liegt:

typedef uint8_t PROGMEM prog_uint8_t;

ist allerdings schon lange deprecated:
1
The typedef is only visible if the macro __PROG_TYPES_COMPAT__
2
   has been defined before including <avr/pgmspace.h> (either by a
3
   #define directive, or by a -D compiler option.)
Jörg Wunsch schrieb:
> Grml ... schrieb:
> Solltest du allerdings einer uint8_t Variable einen prog_uint8_t Wert
> zuweisen gibt es je nach Compilereinstellung mindestens mal ne Warnung.
>
> Warum?

Das hat etwas mit Typsicherheit zu tun, da der typdef nur eine Aussage 
über die Speichergröße und Wertebereich/Präzision gibt. Ein Beispiel ist 
boolean in c (auch eine Variable mit 8bit). Siehe auch Misra Rule 10.1.


Grml ... schrieb:
> ...gibt
> es je nach Compilereinstellung mindestens mal ne Warnung.

Falsch ausgedrückt. Muss heißen gibt bei entsprechender 
Compilereinstellung eine Warnung
Gast
Habe es nun folgendermaßen:
1
can_static_filter(const uint8_t PROGMEM *filter_array);
2

3
prog_uint8_t can_filter[] =
4
{
5
  // Group 0
6
  MCP2515_FILTER(0),        // Filter 0
7
  MCP2515_FILTER(0),        // Filter 1
8
  
9
  // Group 1
10
  MCP2515_FILTER_EXTENDED(0),    // Filter 2
11
  MCP2515_FILTER_EXTENDED(0),    // Filter 3
12
  MCP2515_FILTER_EXTENDED(0),    // Filter 4
13
  MCP2515_FILTER_EXTENDED(0),    // Filter 5
14
  
15
  MCP2515_FILTER(0),        // Mask 0 (for group 0)
16
  MCP2515_FILTER_EXTENDED(0),    // Mask 1 (for group 1)
17
};
Die typedef habe ich nun entfernt und fühle mich sicherer :-)

http://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html#AVR%20Named%20Address%20Spaces
Gast
Grml ... schrieb:
> Das hat etwas mit Typsicherheit zu tun, da der typdef nur eine Aussage
> über die Speichergröße und Wertebereich/Präzision gibt.
Quatsch. Ein typedef ist einfach nur ein Typ-Alias. Deswegen ist 
folgender Code auch kein Problem und gibt keine Warnung:
1
typedef int foo;
2

3
int main () {
4
  foo x;
5
  x = 7;
6
  return 0;
7
}
Die 7 ist zwar vom Typ "int", aber x ist vom Typ "foo" - trotzdem keine 
Warnung, da "foo" und "int" das selbe ist.

Millionen Zeilen Code verlassen sich darauf dass typedef einfach nur ein 
Alias ist und man beliebig zuweisen kann...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.