mikrocontroller.net

Forum: Compiler & IDEs GCC und die Mudolo Funktion!


Autor: Tobias Eckhardt (doenges2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich möchte eine stinknormale mudolo Funktiopn anweden in meinem 
Code.

Einmal benutzte ich x%8 -> das funktioniert weil ja es imPrinzip nur 
eine shift operation ist

nun möchte ich aber x%y berechnen lassen und erfahre, daß ich von gcc 
diese zeile mit einem <source line is not available> quitiert bekomme!

Kann mir jemand sagen wo ich die passende Library mit der passenden 
Funktion herbekomme oder wie ich sonst das problem lösen kann?


Vielen Dank

Tobias

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Datentypen haben x und y?

Source?

Autor: Tobias Eckhardt (doenges2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beide sind uint8_t!

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
x%y ist ein korrekter C-Ausdruck, wenn x und y ganzzahlige Datentypen
(also bspw. auch uint8_t) sind. Du brauchst dazu weder ein Header-File
zu includen noch eine spezielle Library einzubinden (libc genügt, die
wird aber automatisch gelinkt).

Der Fehler liegt also außerhalb dieses Ausdrucks.

Autor: Tobias Eckhardt (doenges2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wollte ich nicht hören, aber vielen Dank

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ich damit sagen wollte (und auch vorher schon Rufus), ist, dass du
vielleicht mehr Hilfe bekommst, wenn du etwas mehr als drei Zeichen
von deinem Quellcocde postest, mindestens so viel, dass andere dein
Problem reproduzieren können.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias Eckhardt wrote:

> Einmal benutzte ich x%8 -> das funktioniert weil ja es imPrinzip nur
> eine shift operation ist

Nein ist es nicht!

Es ist ein AND:

x%8 == x&7


Peter

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:

> Es ist ein AND:

Wohl wahr, immerhin. Scherzfrage: was ist dann:
   (x + 1) % 8

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Peter Dannegger wrote:
>
>> Es ist ein AND:
>
> Wohl wahr, immerhin. Scherzfrage: was ist dann:
>    (x + 1) % 8

(x + 1) % 8
ist natürlich gleich
(x + 1) AND 7

;)

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> (x + 1) % 8
> ist natürlich gleich
> (x + 1) AND 7

Na dann probier's mal aus (gcc, unsigned char).

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nächstes Nein ;-)
x % 8 == x & 7 gilt nur solange x kein Vorzeichen hat
-11 % 8 == -3
-11 & 7 == 5

"beide sind uint8_t!" übersehen...

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist hier uint8_t, also eindeutig (s.o.). Nur ist die Weisheit von gcc 
begrenzt, der weiss nicht dass x+1 nie negativ wird und dividiert hier 
unverdrossen per runtime lib.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht was der AVR-GCC macht, auf x86 und ARM kommt das raus was 
man erwarten würde (-O3):
calc:
        pushl   %ebp
        movl    %esp, %ebp
        movzbl  8(%ebp), %eax
        popl    %ebp
        addl    $1, %eax
        andl    $7, %eax
        ret

Bei -Os nimmt er idivl ohne dabei etwas zu sparen.

Etwas kryptischer sieht das ganze auf PowerPC aus:
_calc:
        addi r3,r3,1
        srawi r0,r3,3
        addze r0,r0
        slwi r0,r0,3
        subf r3,r0,r3
        rlwinm r3,r3,0,0xff
        blr

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, der OP hat lediglich ein Problem, dass ihm hier irgendwo
der Optimierer was wegoptimiert hat, sodass er auf dieser Zeile keinen
Brechpunkt setzen kann oder so ähnlich.  Der resultierende Code wird
völlig in Ordnung sein und das gewünschte (oder zumindest das
hingeschriebene :) ausführen, es ist nur nicht ganz einfach, das mit
dem Debugger nachzuvollziehen.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char a, b;

void f(void)
{
    a = (b + 1) % 8;
}
cygwin gcc (3.4.4):
_f:
        movzbl  _b, %eax
        incl    %eax
        movl    %eax, %edx
        andl    $504, %edx
        subl    %edx, %eax
        movb    %al, _a
        ret
avr-gcc:
f:
        lds r24,b
        clr r25
        adiw r24,1
        ldi r22,lo8(8)
        ldi r23,hi8(8)
        rcall __divmodhi4
        sts a,r24
        ret

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Microchip C30 (= gcc 4.0.2) ist auch nicht klüger als avr-gcc.

Autor: Tobias Eckhardt (doenges2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

da meldet sich der Übeltäter mal wieder!
Das Problem hat sich zum Glück nicht gelöst, aber ich kann es umgehen.
Es lag an Eclipse und GCC.
Sowit wie ich das Verstehe können die mir einfach beim Debuggen dieser 
Zeile nicht den Ort zeigen der diese Berechnung genauer beschreibt, ABER 
berechnet wie es korrekt und somit ist es kein inhaltlicher Fehler 
meinerseits.

Danke für eurer Wissen, das mit dem shiften bei %8 war mir neu.

Eine schöne Restwoche.

Tobi

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.