mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktion, die 2 Variablen addiert, wenn es kein negatives Ergebnis gibt


Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich würde gerne um meinen Code zu halbieren eine Funktion schreiben, die 
2 Variablen addiert und das aber nur tut wenn das ergebniss nicht 
negativ ist. Nur ich will, dass ich sowohl 8bit, als auch 16bit und 
32bit Variablen nutzen können. Auerßdem ist die erste Var immer 
unsigned.

Meine Idee wäre sowas:
void Add(uint32_t* source, int32_t* add)
{
    if((int64_t)*source + *add > 0)
        *source += *add;   
}

Allerdings kann man da doch nur int32_t übergeben und ich glaube auch, 
dass sie nicht ganz funktioniert.

Autor: Pothead (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es so machen, wenn es für alle Datentypen gehen soll:

#include <stdint.h>

uint32_t
SpecialAdd(uint32_t source, int32_t add)
{
    int64_t tmp = (int64_t)source + add;

    if( (tmp >= 0) && (tmp <= UINT32_MAX) )
    {
       return( (uint32_t)tmp );   
    }
    else
    {
       return( source );
    }
}

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt so würde es gut gehen.

Man kann doch in C auch so etwas machen oder?
void Add(...)
{

}

Damit könnte man doch Argumente übergeben, die unbekannt sind. Außerdem 
könnte man dann doch mit sizeof die Größe bestimmen und dann die 
Addition auc nicht zulassen wenn z.b. ein 16bit Wert übergeben wurde.

EDIT: oder war das nur c++?

EDIT2: Würde sowas gehen?:
uint32_t Add(uint32_t source, int32_t add, uint8_t size)
{
    int64_t tmp = (int64_t)source + add;
    if(tmp > 0 && tmp < ((uint64)1 << size)
        return tmp;
    else
        return source;
}

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hätte da noch eine Idee. In c# kann man meines Wissens so was 
machen:
(Jetzt mit den µC Variablen, in c# würde es statt int32 natürlich int 
und statt int64 long heißen).

T Add<T>(T source, int32 add)
{
    int64_t tmp = (int64_t) source + add;
    if(tmp > 0 && tmp < (1 << sizeof(T)))
        return tmp;

}

Das würde man dann so aufrufen: uint16_t zahl = Add<uint16_t>(100, -50);

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Samuel K. schrieb:
> Damit könnte man doch Argumente übergeben, die unbekannt sind. Außerdem
> könnte man dann doch mit sizeof die Größe bestimmen und dann die
> Addition auc nicht zulassen wenn z.b. ein 16bit Wert übergeben wurde.
nein das geht so nicht, weil sizeof zur compilezeit ermittelt wird. Bei 
einer Variabelen argumentenliste kann man überhaupt nichts mehr 
bestimmen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.