GCC und die Mudolo Funktion!

OP #667364
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
Gast #667399
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.
Gast #667408
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.
Admin Persönliche Seite #667483
Lesenswert?

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

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

Etwas kryptischer sieht das ganze auf PowerPC aus:
1
_calc:
2
        addi r3,r3,1
3
        srawi r0,r3,3
4
        addze r0,r0
5
        slwi r0,r0,3
6
        subf r3,r0,r3
7
        rlwinm r3,r3,0,0xff
8
        blr
Moderator Persönliche Seite #667489
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.
#667500
Lesenswert?

1
unsigned char a, b;
2

3
void f(void)
4
{
5
    a = (b + 1) % 8;
6
}
cygwin gcc (3.4.4):
1
_f:
2
        movzbl  _b, %eax
3
        incl    %eax
4
        movl    %eax, %edx
5
        andl    $504, %edx
6
        subl    %edx, %eax
7
        movb    %al, _a
8
        ret
avr-gcc:
1
f:
2
        lds r24,b
3
        clr r25
4
        adiw r24,1
5
        ldi r22,lo8(8)
6
        ldi r23,hi8(8)
7
        rcall __divmodhi4
8
        sts a,r24
9
        ret
OP #668329
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren